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

Solidity中如何从一个合约内部获取另一个合约的地址

Solidity中在函数内获取合约A地址的实现方式

首先纠正你示例代码里的语法错误:你写的A a = Test(0x123abc...)是无效写法,实例化已部署的合约A时,需要用合约名A作为类型转换方法,正确写法是A a = A(0x123abc...)。

核心方法:在Solidity 0.5及以上版本中,只要将声明为合约类型的变量显式转换为address类型,就能得到该合约的部署地址,在测试函数(你提到的Test())、业务函数中都可以直接调用,全版本兼容。

修正后的可运行示例代码

contract A {
    uint public target;
    function setTarget(uint _target) public {
        target = _target;
    }
}

contract B {
    // 传入已部署的A合约地址,完成合约实例初始化
    A a = A(0x123abc...);

    // 你需要的Test()函数,返回值就是合约A的地址
    function Test() public view returns (address aAddress) {
        // 对合约实例做地址类型转换,直接获取A的部署地址
        aAddress = address(a);
        // 拿到地址后可以追加你的自定义逻辑,比如地址校验、权限判断等
    }

    function editA() public {
        a.setTarget(1);
    }
}

其他常见场景处理

  • 如果合约A是在合约B的逻辑中动态部署的,部署完成的当下就可以直接拿到地址,后续任意函数中也可以随时通过状态变量获取:
contract B {
    A public aInstance;

    function deployAndRecordA() public {
        // 内部部署合约A
        aInstance = new A();
        // 部署后直接获取地址存储
        address aAddr = address(aInstance);
    }

    function Test() public view returns (address) {
        // 函数内随时可以取出A的地址
        return address(aInstance);
    }
}
  • 如果你是在Foundry、Hardhat等框架的独立测试合约中编写Test()方法,逻辑完全一致:只要拿到了合约A的绑定实例,通过address(实例变量)就能得到对应链上部署地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:36:25