Kopieren Sie den Status von einem Vertrag in einen anderen

Ich experimentiere mit den aktualisierbaren Verträgen des Zeppelin-Betriebssystems, aber was ich für meinen Vertrag nur benötige, ist, ein bestimmtes Statusarray beizubehalten, wenn ich es an einer anderen Adresse bereitstelle. Um Proxy-Probleme zu vermeiden, Frameworks zu aktualisieren und dergleichen, gibt es eine Möglichkeit, dies irgendwie manuell zu tun?

Antworten (1)

Dies ist nur eine grobe Skizze, um Ihnen einige Ideen zu geben, wie Bedenken in eine einfache erweiterbare Struktur aufgeteilt werden können.

  • Zunächst ein sehr einfacher OwnedVertrag für die übertragbare Zugangskontrolle.
  • Dann ein KeeperVertrag, der das Array während Upgrades halten soll.
  • Diese Version von Replaceablestellt ihre eigene bereit, Keeperum loszulegen. Dadurch wird Keepererkannt, dass Replaceablees sich um den Eigentümer und nicht um den Entwickler handelt.
  • Um tatsächlich zu ersetzen Replaceable, würden Sie zuerst eine neue Version davon bereitstellen. Im Ersetzungsfall würde der Konstruktor keine neue Keeper. Stattdessen würden Sie die Adresse des bestehenden Keeper übergeben und verwenden keeper = Keeper(keeperAddress);Natürlich Keeperwird der neue Vertrag zunächst ignoriert, da ihm der Datenspeicher nicht "gehört". Sie sagen den Alten Replaceable, sie sollen abdrücken und das Eigentum von sich weg übertragen.

-

pragma solidity 0.4.24;

contract Owned {

    address public owner;

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

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

    function changeOwner(address newOwner) public onlyOwner returns(bool success) {
        owner = newOwner;
        return true;
    }
}

contract Keeper is Owned {

    bytes32[] public array;

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

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

    function appendArray(bytes32 value) public onlyOwner returns(uint arrayLength) {
        uint length = array.push(value);
        return length;
    }
}

contract Replacable is Owned {

    Keeper keeper;

    constructor() public {
        keeper = new Keeper();
    }

    function getKeeperAddress() public view returns(address keeperAddress) {
        return address(keeper);
    }

    function appendInKeeper(bytes32 value) public onlyOwner returns(uint arrayLength) {
        return keeper.appendArray(value);
    }

    function inspectInKeeper(uint row) public view returns(bytes32 value) {
        return keeper.array(row);
    }

    function appointNewReplacable(address newContract) public onlyOwner returns(bool success) {
        return keeper.changeOwner(newContract);
    }

}

Ich habe einige Details ausgelassen, um das Beispiel auf den Punkt zu bringen.

Ich hoffe es hilft.

danke es hilft. Obwohl dies etwas kompliziert ist und die Zeppelinos-Option für Upgrades unwiderstehlich machen würde. Ich dachte eher an eine Funktion, die das gesamte Array ausspuckt und es dann manuell als Argument an den neuen Vertragskonstruktor weitergibt