gpt4 book ai didi

ethereum - 在部署时将智能合约链接在一起

转载 作者:行者123 更新时间:2023-12-02 22:06:15 25 4
gpt4 key购买 nike

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

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

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

最佳答案

您似乎正在尝试实现一种代理模式,这在其他编程语言(如java)中很常见,以这种方式您提供对某些特定内容的访问非常有限本例中的类contracts

在代理设计模式中,代理和受限制的类都将实现相同的接口(interface)!我对你们的智能合约细节不太了解。

假设合约 A 和 B 实现相同的接口(interface):

我们假设接口(interface)是 Base。

interface Base{
function getValue() external view returns (string);
}

我需要提供对 ContractAContractB 的受控访问,以便只有 Controller 可以调用。因此,让我们创建一个修改器。

contract ControlledAccess{

address controller;

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

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

}

现在 ContractAContractB 应该实现接口(interface) 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";
}

}

为了将 Controller 地址设置为 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 之间没有共同的功能:

删除上面示例中的接口(interface)。然后实现类似这样的东西。

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();
}

}

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

关于ethereum - 在部署时将智能合约链接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50819979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com