Ethereum 在部署时链接智能合约
我正在构建一个由3个智能合约组成的应用程序。目的是让控制器控制另外两个(图中的合同A和B)。以前,如果我想限制对智能联系人的访问,我会通过修改器来实现 例如:Ethereum 在部署时链接智能合约,ethereum,solidity,web3,truffle,Ethereum,Solidity,Web3,Truffle,我正在构建一个由3个智能合约组成的应用程序。目的是让控制器控制另外两个(图中的合同A和B)。以前,如果我想限制对智能联系人的访问,我会通过修改器来实现 例如: modifier onlyController { require(msg.sender == controller); _; } 在联系人创建时,智能合约将控制器设置为等于我要进行这些调用的任何以太坊地址(例如部署智能合约的地址)。问题是,现在我希望控制器智能合约的地址是控制器(在修饰符中)。考虑到我想同时
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.) (二) 一篇关于智能合约与稳定合约之间互动的完整文章: 指向另一篇文章和示例项目的链接: 希望它能解决你的问题。此外,您还可以加入此社区以获得独家服务: