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?
Dies ist nur eine grobe Skizze, um Ihnen einige Ideen zu geben, wie Bedenken in eine einfache erweiterbare Struktur aufgeteilt werden können.
Owned
Vertrag für die übertragbare Zugangskontrolle.Keeper
Vertrag, der das Array während Upgrades halten soll.Replaceable
stellt ihre eigene bereit, Keeper
um loszulegen. Dadurch wird Keeper
erkannt, dass Replaceable
es sich um den Eigentümer und nicht um den Entwickler handelt.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 Keeper
wird 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.
Arisalexis