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

Remix测试Solidity合约时无法获取一致地址的原因咨询

问题:Remix中测试合约地址不一致的原因

测试代码

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 < 0.9.0;
contract Receiver{
    
    function getAddress() public view returns(address){
        return address(this);
    }
  
}

contract Caller{
    Receiver receiver;
    constructor(){
        receiver = new Receiver();
    }

    function getAddress() public view returns(address){
        return receiver.getAddress();
    }
  
}

问题描述

我在Remix中测试上述代码时,无法获取一致的合约地址,请问这是为什么?

解答

每次部署Caller合约时,它的构造函数都会执行new Receiver()语句,这会在链上创建一个全新的Receiver合约实例。

  • 第一次部署Caller,会生成一个Receiver实例,对应地址A
  • 第二次部署Caller,又会生成另一个完全独立的Receiver实例,对应地址B
  • 所以每次调用Caller的getAddress(),返回的都是本次部署Caller时新创建的Receiver地址,自然每次都不一样

如果想让所有Caller实例返回同一个Receiver地址,可以修改代码:先单独部署Receiver合约,再把它的地址传入Caller的构造函数,示例如下:

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 < 0.9.0;
contract Receiver{
    
    function getAddress() public view returns(address){
        return address(this);
    }
  
}

contract Caller{
    Receiver receiver;
    // 修改构造函数,接收已部署的Receiver地址
    constructor(address _receiverAddr){
        receiver = Receiver(_receiverAddr);
    }

    function getAddress() public view returns(address){
        return receiver.getAddress();
    }
  
}

这样不管部署多少次Caller,只要传入同一个Receiver地址,返回的结果就会一致。

内容的提问来源于stack exchange,提问作者Angus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:27:06