wagmi useContractRead调用Solidity合约时msg.sender异常问题咨询
问题解答
为什么可以任意设置overrides.from?
因为你的getInfo是view类型的只读函数,这类函数不会修改区块链状态,调用时不需要发起签名交易——它只是向以太坊节点请求读取链上数据。节点在处理view函数调用时,不会验证from地址的所有权,这个字段只是用来告诉合约“模拟以这个地址的身份查询数据”,所以你填任何地址都能得到对应msg.sender的返回结果,本质上这是无权限限制的模拟查询。
如何让当前连接地址作为msg.sender传给合约?
默认情况下useContractRead如果不指定from或signer,会使用节点的默认匿名身份(也就是0地址),所以返回msg.sender为0地址。要使用当前连接的用户地址,有两种方式:
方式1:直接传入当前连接地址
从useAccount获取当前用户地址,在overrides里指定from:
const { isConnected, address } = useAccount(); useContractRead({ abi: currentEnvContract.abi, address: currentEnvContract.address, functionName: 'getInfo', enabled: isConnected, overrides: { from: address }, // 绑定当前连接地址 onSuccess: (data) => { console.log(data); }, });
方式2:使用useSigner传入签名者
如果后续需要和合约进行写交互,这种方式更统一,useContractRead会自动使用签名者的地址作为from:
const { isConnected } = useAccount(); const { data: signer } = useSigner(); useContractRead({ abi: currentEnvContract.abi, address: currentEnvContract.address, functionName: 'getInfo', enabled: isConnected && !!signer, signer: signer, // 传入当前用户的签名者实例 onSuccess: (data) => { console.log(data); }, });
内容的提问来源于stack exchange,提问作者Ratokl
相关产品推荐
相关产品推荐

