Ethereum 在部署时链接智能合约

Ethereum 在部署时链接智能合约,ethereum,solidity,web3,truffle,Ethereum,Solidity,Web3,Truffle,我正在构建一个由3个智能合约组成的应用程序。目的是让控制器控制另外两个(图中的合同A和B)。以前,如果我想限制对智能联系人的访问,我会通过修改器来实现 例如: modifier onlyController { require(msg.sender == controller); _; } 在联系人创建时,智能合约将控制器设置为等于我要进行这些调用的任何以太坊地址(例如部署智能合约的地址)。问题是,现在我希望控制器智能合约的地址是控制器(在修饰符中)。考虑到我想同时

我正在构建一个由3个智能合约组成的应用程序。目的是让控制器控制另外两个(图中的合同A和B)。以前,如果我想限制对智能联系人的访问,我会通过修改器来实现 例如:

  modifier onlyController {
     require(msg.sender == controller);
     _;
  }

在联系人创建时,智能合约将控制器设置为等于我要进行这些调用的任何以太坊地址(例如部署智能合约的地址)。问题是,现在我希望控制器智能合约的地址是控制器(在修饰符中)。考虑到我想同时使用truffle部署这组智能联系人,如何做到这一点是最好的。将这些链接起来的最佳方式是什么,以便控制器智能合约只能调用A和B。此外,必须如何实现控制器,以便用户可以通过控制器调用A和B中的功能(因此,用户在控制器中调用一个函数,然后控制器在a或B中调用相应的函数)?

您不能轻松地将控制器合同设置为

contract ControllerContract is ContractA, ContractB {
    ...
}
从而使其能够访问合同A和合同B中的功能


我不知道为什么这种方式会比你所描述的更糟糕。

我在稳健性方面不是专家。但我试图回答,因为我觉得它有点有趣


您似乎试图实现一种
代理模式
,这种模式在其他编程语言(如
java
)中非常常见,在这种情况下,您提供了对特定类的非常有限的访问权,即
契约

在代理设计模式中,代理和要限制的类都将实现相同的接口!我不太了解您的智能合约详细信息

假设合同A和B实现相同的接口:

让我们假设接口是基本的

interface Base{
   function getValue() external view returns (string); 
}
我需要提供对
ContractA
ContractB
的受控访问,这样只有控制器才能调用。因此,让我们创建一个修饰符

contract ControlledAccess{

    address controller;

    constructor() public {
        controller = msg.sender;
    }

    modifier onlyController() {
        require(msg.sender == controller);
        _;
    }

}
现在
ContractA
ContractB
应该实现接口
Base
并继承
ControlledAccess
合同

contract ContractA is Base, ControlledAccess{

    function getValue() public view onlyController returns (string){
        return "Hi";
    }

}

contract ContractB is Base, ControlledAccess{

    function getValue() public view onlyController returns (string){
        return "Hello";
    }

}    
为了将控制器地址设置为
ProxyController
地址,ProxyController本身应该在其构造函数中创建这些契约。由于我们的
ProxyController
契约应该能够控制多个契约,我认为
映射
可能是一个不错的选择

contract ProxyController is Base{

    string public contractKey = "a";
    mapping(string => Base) base;

    constructor() public {
       base["a"]=new ContractA();
       base["b"]=new ContractB();
    }

    function setContractKey(string _contractKey) public{
        contractKey = _contractKey;    
    }

    function getValue() public view returns (string){
        return base[contractKey].getValue();
    }

}
因此,您可以通过
setContractKey
切换到A&B

假设A和B之间没有共同的功能:

删除上面示例中的接口,然后实现如下内容

contract ProxyController{

    ContractA a;
    ContractB b;

    constructor() public {
       a=new ContractA();
       b=new ContractB();
    }


    function AgetValue() public view returns (string){
        return a.getValue();
    }

    function BgetValue() public view returns (string){
        return b.getValue();
    }        

}

我对此进行了测试,它似乎工作正常。但我不确定是否存在其他问题,如性能等。

您可以在以下链接中找到一些解决方案:

1.)

(二)

一篇关于智能合约与稳定合约之间互动的完整文章:

指向另一篇文章和示例项目的链接:

希望它能解决你的问题。此外,您还可以加入此社区以获得独家服务: