Связывание умных контрактов при развертывании - PullRequest
0 голосов
/ 12 июня 2018

DApp Architecture Я создаю приложение, которое состоит из 3 умных контрактов.Цель состоит в том, чтобы контроллер контролировал другие два (контракт A и B на изображении).Ранее, если бы я хотел ограничить доступ к смарт-контакту, я бы сделал это с помощью модификатора. Пример:

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

При создании контакта смарт-контракт установил бы контроллер равным любому адресу эфириума Iхотите сделать эти вызовы (например, адрес, на котором развернут смарт-контракт).Проблема в том, что теперь я хочу, чтобы адрес смарт-контракта контроллера был контроллером (в модификаторе).Как было бы лучше сделать это, учитывая, что я хочу развернуть этот набор интеллектуальных контактов одновременно, используя трюфель.Каков наилучший способ связать их, чтобы умный контракт контроллера мог выполнять вызовы только к А и В. Кроме того, как должен быть реализован контроллер, чтобы пользователь мог вызывать функции в А и В, проходя черезконтроллер (таким образом, пользователь вызывает функцию в контроллере, затем контроллер вызывает соответствующую функцию в A или B)?

Ответы [ 3 ]

0 голосов
/ 15 июня 2018

Я не эксперт в Солидности.Но пытаться ответить, поскольку я нахожу это немного интересным.


Кажется, вы пытаетесь реализовать proxy pattern, который очень распространен в других языках программирования, таких как java, таким образом, что выв этом случае предоставляем очень ограниченный доступ к определенным классам contracts.

В шаблоне проектирования Proxy и прокси, и класс, который должен быть ограничен, будут реализовывать один и тот же интерфейс!Я не знаю много о твоих умных деталях контракта.

При условии, что в контрактах 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 контракт должен иметь возможность контролировать более 1 контракта, я думаю, что mapping может быть хорошим выбором.

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

}

, поэтому вы можете переключиться на A & B через setContractKey.

При условии, что между А и В нет общих функций:

Удалите интерфейс в приведенном выше примере. Затем реализуйте что-то вроде этого.

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

}

Я проверил это, и, кажется, работает нормально.Однако я не уверен в других проблемах, таких как производительность и т. Д.

0 голосов
/ 20 июня 2018

Некоторые решения можно найти по следующим ссылкам:

1.) https://ethereum.stackexchange.com/questions/36524/multiple-smart-contracts

2.) https://ethereum.stackexchange.com/questions/37055/where-how-to-host-several-connected-smart-contracts

Полный текст статьи по Взаимодействие между смарт-контрактами с Solidity :

https://zupzup.org/smart-contract-interaction/

Ссылка на другую статью и пример проекта: https://hackernoon.com/ethereum-smart-contracts-lifecycle-multiple-contracts-message-sender-e9195ceff3ec

Надеюсь, это решит вашу проблему.Также вы можете присоединиться к этому сообществу для эксклюзивности: https://ethereum.stackexchange.com/

0 голосов
/ 14 июня 2018

Разве вы не можете легко установить контракт контроллера как

contract ControllerContract is ContractA, ContractB {
    ...
}

Таким образом, предоставив ему доступ к функциям как в контракте A, так и в контракте B?

Я не уверен, почему этот путь будет хуже, чем вы описываете.

...