In aufrüstbarem Entwurfsmuster, wie die zulässigen Verträge oder Eigentümer während der Bereitstellung von Smart Contracts festgelegt werden

Funktionaler Hintergrund:

Verträge für aktualisierbare Entwurfsmuster: ProofDB.sol : Vertrag zum Speichern der Daten. Proof.sol : Vertrag, der die Geschäftslogik enthält. Registry.sol: Vertrag, der die neueste Version von Proof.sol enthält

Ablauf: Die Frontend-Anwendung ruft zuerst den Registry.sol-Vertrag auf, um die neueste Version von Proof.sol (logischer Vertrag) abzurufen. Nach Erhalt der neuesten Version ruft es die entsprechende Funktion auf. Proof.sol-Verträge führen den Aufruf aus und speichern den Zustand in ProofDB.sol.

**Migrations script:**

Sequence of deployment:
deployer.deploy(Mortal).then(() => {
return deployer.deploy(ProofDB)
}).then(() => {
return deployer.deploy(Proof, ProofDB.address);
}).then(() => {
return deployer.deploy(Registry, Proof.address);
})



**Code from ProofDB.sol**     
Contract ProofDB.sol {

        constructor() public {
            owner = message.sender;
        }

        modifier onlyAllowedContractOrOwner {
            require (allowedContracts[msg.sender] != true && msg.sender != owner,"Should be a owner");
            _;
        }

        function addAllowedContractOrOwner(address _addr)
        public
        onlyOwner 
        returns(bool) {
            if( allowedContracts[_addr] == false ) {
                allowedContracts[_addr] = true;
                allowedContractsKeys.push(_addr);
                return true;
            }
            return false;
        }

    }

Problemstellung:

Um sicherzustellen, dass die Verträge nicht anfällig für den Angriff sind. Ich möchte den Zugriff auf ProofDB.sol nur auf ausgewählte Verträge und Eigentümer beschränken. Wie kann ich während der Bereitstellung vorgehen. Wie kann ich den ProofDB.sol-Vertrag während der Bereitstellung aufrufen, um die Liste der zulässigen Benutzer und Verträge zu übergeben, die darauf zugreifen können.

Ausgabe:

  1. Ich kann keine Konstruktorargumente übergeben, da ProofDB.sol zuerst in der Sequenz bereitgestellt werden sollte. Zu diesem Zeitpunkt kenne ich die Adresse von Proof.sol nicht.
  2. Gibt es eine Möglichkeit, die zulässigen Verträge und Eigentümer während der Bereitstellung an ProofDB.sol zu übergeben, ohne dies manuell zu tun?

Antworten (1)

Hier ist eine Skizze.

pragma solidity 0.4.24;

contract DB {

  address public owner;
  mapping(address => bool) public allowedContracts;

  modifier onlyAllowedContracts() {
      require(allowedContracts[msg.sender]);
      _;
  }

  modifier onlyOwner {
      require(msg.sender == owner);
      _;
  }

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

  function isAllowedContract(address check) public view returns(bool isIndeed) {
      return allowedContracts[check];
  }

  function addAllowedContract(address newContract) public onlyOwner returns(bool success) {
      require(!isAllowedContract(newContract));
      allowedContracts[newContract] = true;
      return true;
  }

  function removeAllowedContract(address newContract) public returns(bool success) {
      require(isAllowedContract(msg.sender));
      allowedContracts[newContract] = false;
      return true;
  }

  function insertNewDataRecords() public onlyAllowedContracts returns(bool success) {
      // do something
      return true;
  }
}

Ich habe Vertragsschreiber vom Eigentümer getrennt. Sie benötigen nicht die zusätzliche Komplexität eines Entweder/Oder-Modifikators, da der Eigentümer sich jederzeit selbst zur Liste der zulässigen Autoren hinzufügen kann.

Ich hoffe es hilft.

Ich verstehe Ihren Standpunkt, dass der Eigentümer zulässige Verträge jederzeit hinzufügen oder entfernen kann. Bei der Bereitstellung mit Truffle kann es jedoch sehr schwierig werden, die Adressen des neuesten Vertrags manuell zu übernehmen und sie dem Speichervertrag hinzuzufügen. Ich möchte wissen, ob es eine Möglichkeit gibt, die Funktion addAllowedContractOrOwner() mit der neuesten Version des Logikvertrags auszulösen?