Copiar estado de un contrato a otro

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?

Respuestas (1)

Este es solo un boceto aproximado para darle algunas ideas sobre cómo dividir las preocupaciones en una estructura actualizable simple.

  • OwnedPrimero, un contrato muy simple para el control de acceso transferible .
  • Luego, un Keepercontrato destinado a mantener la matriz durante las actualizaciones.
  • Esta versión de Replaceableimplementa su propio Keeperpara empezar. Al hacerlo, Keeperreconoce que Replaceablees el propietario, no el desarrollador.
  • Para reemplazarlo 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, Keeperinicialmente ignorará el nuevo contrato porque no es "propietario" del almacén de datos. Le dices a lo viejo Replaceableque 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.

gracias ayuda Aunque esto es un poco complicado y haría que la opción de zeppelinos fuera atractiva para las actualizaciones. Estaba pensando en algo más como hacer una función que escupe toda la matriz y luego pasarla como argumento al constructor del nuevo contrato manualmente