如何解决Remix IDE如何通过“在地址”正确部署代理合同?
我开始研究如何使用Remix IDE编写以太坊智能合约,并在本地主机中配置Ganache&Truffle。
我正在练习article (Upgradable Proxy Contracts)。因此,我将拥有以下文件:
Registry.sol(主合同)
pragma solidity ^0.6.12;
import './Storage.sol';
contract Registry is Storage {
address public logic_contract;
function setLogicContract(address _c) public returns (bool success){
logic_contract = _c;
return true;
}
fallback () payable external {
address target = logic_contract;
assembly {
let ptr := mload(0x40)
calldatacopy(ptr,calldatasize())
let result := delegatecall(gas(),target,ptr,calldatasize(),0)
let size := returndatasize()
returndatacopy(ptr,size)
switch result
case 0 { revert(ptr,size) }
case 1 { return(ptr,size) }
}
}
Storage.sol(用于存储)
pragma solidity ^0.6.12;
contract Storage {
uint public val;
}
pragma solidity ^0.6.12;
import './Storage.sol';
contract LogicOne is Storage {
function setVal(uint _val) public returns (bool success) {
val = 2 * _val;
return true;
}
}
LogicTwo.sol(第二逻辑合约)
pragma solidity ^0.6.12;
import './Storage.sol';
contract LogicTwo is Storage {
function setVal(uint _val) public returns (bool success) {
val = 1000 * _val;
return true;
}
}
我能够通过松露控制台成功部署合同。 但是,当切换到Remix IDE时,我能够部署所有合同,但是主合同未与逻辑1合同链接,因此无法切换到逻辑2合同。
我无法在Remix IDE中模拟以下代码。
Registry.at(Registry.address).setLogicContract(LogicOne.address)
Registry.at(Registry.address).setLogicContract(LogicTwo.address)
每次我单击“地址”按钮时,都会部署一个新的主合同。预期结果是主合同应该保持不变,但是合同逻辑从LogicOne切换到LogicTwo。
我尝试的情况如下:
方案1:
方案2:
- 部署LogicOne合同
- 在“地址”中输入LogicOne合同地址,然后单击按钮以部署主合同
- 调用setVal()函数,并且在主合同中更新“ Val”
- 试图在“地址”中输入LogicTwo合同地址,然后单击按钮以部署第二个主合同
- 但是,这将创建另一个新的主合同。
有没有人可以分享部署合同步骤的经验?任何意见都值得赞赏!
解决方法
要调用“代理”功能,您设置代理合同的地址,但使用要代理的基础合同的ABI 。
在这种情况下,您要使用Registry.sol和LogicOne.sol或LogicTwo.sol的ABI的地址。不知道是否可以使用Remix来实现。
根据您链接的文章,您想这样做
- 我们使用LogicOne ABI修改注册表合同中的“ val”存储。 LogicOne.at(Registry.address).setVal(2)
为了获得您的价值,您可能想要
LogicOne.at(Registry.address).val()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。