Я использую useContractRead от wagmi для получения данных из моего контракта Solidity, теперь проблема в том, что в этом контракте я использую msg.sender для доступа к данным об отправителе. Мой код солидности выглядит так:
function getInfo() public view returns (bool, uint8, address) {
return (
data[msg.sender].ts != 0,
data[msg.sender].info,
msg.sender
);
}
и по умолчанию useContractRead возвращает
[false, 0, '0x0000000000000000000000000000000000000000'], имейте в виду, что если я вызову эту же функцию с помощью useContract, мне нужно будет передать подписывающую сторону, иначе она выдаст ошибку (используя метамаску).
Мой useContractRead выглядит так
const { isConnected, address } = useAccount();
useContractRead({
abi: currentEnvContract.abi,
address: currentEnvContract.address,
functionName: 'getInfo',
enabled: isConnected,
// overrides: { from: '0x765d5A82bba93F44fa3514d6dce9f7351dF1b7fA' },
onSuccess: (data) => {
console.info(data);
},
});
как видите, я прокомментировал overrides.from, и этот адрес не принадлежит мне, это случайный адрес, который я нашел на goerli etherscan. и если я раскомментирую его, контракт вернется
[false, 0, '0x765d5A82bba93F44fa3514d6dce9f7351dF1b7fA']
почему это происходит? Я не смогу использовать этот адрес. и если это неправильно, есть ли способ отправить мой текущий подключенный адрес как msg.from к моему контракту на солидность.





Есть разница между транзакцией чтения-записи и вызовом только для чтения.
Транзакция должна быть подписана закрытым ключом отправителя, чтобы майнер/валидатор мог вычесть комиссию за газ с адреса отправителя — и в результате этого msg.sender всегда отражает этот адрес. Однако вызов выполняется только на узле, к которому вы подключены, не распространяется на остальную часть сети и не взимает никаких комиссий.
Поскольку за вызов не взимается плата, вы можете указать любой (или нулевой по умолчанию) адрес в качестве вызывающего абонента.
Передача другого адреса вызывающего абонента не нанесет вреда контракту, потому что вызов доступен только для чтения и не может сохранять никаких изменений.
@Ratokl Они не читаются другими контрактами. Но их по-прежнему можно прочитать с помощью методов офчейн — например, путем чтения значения слота хранилища, в котором хранится приватная переменная: web3js.readthedocs.io/en/v1.8.1/web3-eth.html#getstorageat
Спасибо за информацию, но меня смущает то, что если у меня есть частные переменные в моем контракте солидности, доступ к которым должен иметь только тот, кто инициализировал, например, частное сопоставление, и я только кто-то хочет получить доступ к информации этого сопоставления, если их информация сохранена там , я бы не смог сделать это с вызовом только для чтения?