微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Remix IDE如何通过“在地址”正确部署代理合同?

如何解决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;
}

LogicOne.sol(第一个逻辑合同)

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。

enter image description here

我尝试的情况如下:

方案1:

  1. 部署所有合同
  2. 调用主合同setLogicContract()函数来设置逻辑合同地址
  3. 调用了setVal()函数,但主合同中未更新“ val”

方案2:

  1. 部署LogicOne合同
  2. 在“地址”中输入LogicOne合同地址,然后单击按钮以部署主合同
  3. 调用setVal()函数,并且在主合同中更新“ Val”
  4. 试图在“地址”中输入LogicTwo合同地址,然后单击按钮以部署第二个主合同
  5. 但是,这将创建另一个新的主合同。

有没有人可以分享部署合同步骤的经验?任何意见都值得赞赏!

解决方法

要调用“代理”功能,您设置代理合同的地址,但使用要代理的基础合同的ABI

在这种情况下,您要使用Registry.sol和LogicOne.sol或LogicTwo.sol的ABI的地址。不知道是否可以使用Remix来实现。

根据您链接的文章,您想这样做

  1. 我们使用LogicOne ABI修改注册表合同中的“ val”存储。 LogicOne.at(Registry.address).setVal(2)

为了获得您的价值,您可能想要 LogicOne.at(Registry.address).val()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。