Я не эксперт в Солидности.Но пытаться ответить, поскольку я нахожу это немного интересным.
Кажется, вы пытаетесь реализовать 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();
}
}
Я проверил это, и, кажется, работает нормально.Однако я не уверен в других проблемах, таких как производительность и т. Д.