Estoy experimentando con los contratos actualizables de zeppelin os, pero lo único que necesito para mi contrato es mantener una matriz de estado específica cuando me despliegue en otra dirección. Evitar problemas de proxy, marcos de actualización y demás, ¿hay alguna manera de hacerlo manualmente de alguna manera?
Este es solo un boceto aproximado para darle algunas ideas sobre cómo dividir las preocupaciones en una estructura actualizable simple.
Owned
Primero, un contrato muy simple para el control de acceso transferible .Keeper
contrato destinado a mantener la matriz durante las actualizaciones.Replaceable
implementa su propio Keeper
para empezar. Al hacerlo, Keeper
reconoce que Replaceable
es el propietario, no el desarrollador.Replaceable
, primero implementaría una nueva versión. En el caso de reemplazo, el constructor no crearía un nuevo Keeper
. En su lugar, pasaría la dirección del contrato existente Keeper
y el uso keeper = Keeper(keeperAddress);
Por supuesto, Keeper
inicialmente ignorará el nuevo contrato porque no es "propietario" del almacén de datos. Le dices a lo viejo Replaceable
que apriete el gatillo y transfiera la propiedad de sí mismo.-
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);
}
}
Omití bastantes detalles para mantener el ejemplo en el punto.
Espero eso ayude.
arisalexis