Verwenden Sie die Modifikatorfunktion, um eine Hierarchie von Smart Contracts zu erstellen

Ich habe 3 Verträge, die ich umsetzen möchte. Die Verträge sind master, adminund customer. Der Rahmenvertrag wird also von einer einzigen Person initiiert, dem Eigentümer der privaten Kette (basierend auf Geth). Der adminVertrag sieht den Zugriff auf bestimmte Adressen vor. Diese adminInstanzen werden von der erstellt master. Ich verwende a modifier, um dies sicherzustellen. Mit dem customerVertrag kann nur durch den Vertrag interagiert adminwerden master.

Ich habe diese addressesKonten (mit Benutzername und Passwort) zugeordnet, die auf meinem lokalen Redis db. Snipper meiner Vertragsstruktur ist unten:

Master Contract

contract MasterContract{
    bool public state = false;
    address public masterAddress;
    bool permCheck;


    // ACL
    // Subject(Role) - Object/Subject - permission - On/Off
    mapping (uint => mapping(uint => perm)) public acl;

    // Init Function
    function masterContractInit(string name,string detail){
      if(msg.sender!="0x0"){
        throw;
      }else{
        masterAddress = msg.sender;
      }
    }

    modifier onlyMasterAccess{
      if (msg.sender == masterAddress) _
      else throw;
    }
}

Der Admin-Vertrag

contract AdminContract{
  bool state=false;
  struct Admin{
      bool status;
      string name;
  }
  mapping (address => admin ) public admins;

  // How to reference this masterAddress?
  modifier checkMasterAndAdminAccess{
    if (msg.sender == masterAddress || admins[msg.sender].status) _
    else throw;
  }

  function initAdminContract() onlyMasterAccess{    
    state = true;
  }

  function addAdmin(address addr, string name) onlyMasterAccess{
    admins[addr]=Admin(true, name);
  }

  function revokeAdmin(address addr) onlyMasterAccess{
    if(addr!="0x0"){
      throw;
    }else{
      admins[addr].status = false;
    }
  }
}

Kundenvertrag

contract Customer{
  bool public state = false;

  function initCustomerContract() onlyMasterAccess{    
    state = true;
  }

  function foo() checkMasterAndAdminAccess{
    // Do something here
    // only admin or master can call this function
  }

  function bar(){
    // Do something, but allow others to modify this
  }   
}

Jetzt muss ich weiter verstehen, wie man diese Verträge kombiniert und auf die Master- und Admin-Adresse im Kundenvertrag verweist, um den Modifikator zu verwenden checkMasterAndAdminAccess. Idealerweise würde ich beim Kompilieren in ABI und Verwenden in meiner NodejsApp diese Verträge in separaten Dateien platzieren wollen, da sie massiv werden.

Ist das eine empfehlenswerte Praxis?

Es wird nur eine Instanz von master contractkontrolliert von nur einer Person geben (also hat nur eine Adresse Zugriff darauf). Die anderen Verträge können mehr als einmal instanziiert werden

Kann ich eine Anleitung bekommen, wie ich das oben Gesagte erreichen kann?

Antworten (1)

Wenn Sie nur anderen Verträgen den Zugriff auf Ihren Code erlauben möchten, sollten Sie die Vererbung verwenden:

Customer is Admin:

Auch wenn mir das wenig Sinn macht. Ich denke, Ihr Problem betrifft weniger die gemeinsame Nutzung von Funktionen als vielmehr die Art und Weise, wie Sie Ihren Code organisieren. Der einfachste Weg, mit Berechtigungen umzugehen, ist ein Telefonbuchvertrag, der die Benutzerberechtigungen verfolgt. Lassen Sie dann alle Ihre Funktionen von diesem Vertrag erben, damit sie die erforderlichen Modifikatoren verwenden können. So was:

contract PhoneBook {
    modifier onlyMasterAccess() {
        require(msg.sender == master);
        _;
    }
}


contract Customer is PhoneBook{
    function initCustomerContract() onlyMasterAccess {    
        state = true;
  }
}