Übertragen Sie das Eigentum an einem Vertrag auf einen anderen Vertrag (und zurück)

Ich habe einen Vertrag WidgetMaker, der Zeppelin-Solidity verwendet Ownable, um sicherzustellen, dass nur der Eigentümer des Vertrages ihn ausführen kann SendWidget.

Derzeit gehört der Vertrag meiner eigenen Wallet-Adresse und ich habe eine Web3-App, mit der ich diese Funktion problemlos ausführen kann.

Ich möchte von diesem Setup zu einem migrieren, wo die Funktion SendWidgetvon einem anderen Vertrag aufgerufen werden kann WidgetManager. Dies muss dieselbe bereitgestellte Instanz von sein WidgetMaker, also muss ich die Eigentümerschaft auf den neuen Vertrag übertragen.

Die Eigentumsübertragung ist kein Problem, da dies bereits durch OpenZeppelin-Code erledigt wird. Ich habe zwei Fragen:

1) Wie stelle ich sicher bereit , damit es die Funktion auf der aktuell bereitgestellten Instanz von WidgetManageraufrufen kann ?SendWidgetWidgetMaker

2) Gibt es eine sichere Möglichkeit, eine Funktion hinzuzufügen, WidgetManagerdie es ermöglicht, das Eigentum an mich oder in der Zukunft an einen anderen Vertrag zurückzugeben, wenn ich das System aktualisieren möchte, während ich weiterhin dieselbe bereitgestellte Instanz von WidgetMaker?

Antworten (1)

Sie haben die richtige Idee.

Wie Sie anmerken, können Sie die Eigentümerschaft einfach übertragen, da Sie zunächst den Eigentümerschlüssel haben. Sie können das manuell tun und einfach wirklich, wirklich vorsichtig sein, oder Sie können es mit einem Migrationsskript automatisieren, das so etwas wie Truffle verwendet. In jedem Fall ist es ein Bereitstellungsprozess.

Es ist nicht der einzige Weg, um Schritt 1 zu tun. Ein anderer Weg, der sauber ist, aber das Gasbudget für die einmalige Bereitstellung etwas belastet, besteht darin, den WidgetMakerTeil des WidgetManagerKonstruktors bereitzustellen. Wenn Sie auf diese Weise eine bereitstellen, WidgetManagerstellt sie ihre eigene Factory bereit und hat standardmäßig den Besitz. Etwas wie:

contract WidgetMaker {
  // ...
}

contract WidgetManager {

  WidgetMaker maker;

  function WidgetManager() public {
    maker = new WidgetMaker();
  }

  // ...
}

Sie wollen das Eigentum zurückerhalten. Folgen Sie dem gleichen „Push“-Muster und lassen Sie den „Besitzer“ es zu Ihnen zurückschieben. Etwas wie:

contract WidgetMaker is Owned {
  // ...
}

contract WidgetManager is Owner {
  // ...
  function changeWidgetMakerOwner(address newOwner) public onlyOwner returns(bool success) {
    require(newOwner != 0); // in case they forget to pass an address
    maker.changeOwner(newOwner); // "this" is the current owner, so it can call the function once.
    LogMakerOwnerChanged(msg.sender, newOwner);
    return true;

}

Ich hoffe es hilft.