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
相关产品推荐
相关产品推荐

