You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:25:37