Transferir la propiedad de un contrato a otro contrato (y viceversa)

Tengo un contrato WidgetMakerque utiliza Zeppelin-Solidity Ownablepara garantizar que solo el propietario del contrato pueda ejecutarlo SendWidget.

Actualmente, el contrato es propiedad de mi propia dirección de billetera y tengo una aplicación web3 que me permite ejecutar esta función sin problemas.

Quiero migrar de esta configuración a una en la que SendWidgetotro contrato pueda llamar a la función WidgetManager. Esta debe ser la misma instancia implementada de WidgetMaker, por lo que tendré que transferir la propiedad al nuevo contrato.

Transferir la propiedad no es un problema, ya que el código de OpenZeppelin ya se encarga de ello. Tengo dos preguntas:

1) ¿Cómo implemento de forma segura WidgetManagerpara permitir que llame a la SendWidgetfunción en la instancia implementada actual de WidgetMaker?

2) ¿Hay alguna forma segura de agregar una función WidgetManagerque me permita devolverme la propiedad o a otro contrato en el futuro si quisiera actualizar el sistema y conservar la misma instancia implementada de WidgetMaker?

Respuestas (1)

Tienes la idea correcta.

Como observa, puede transferir fácilmente la propiedad porque inicialmente tiene la clave de propietario. Puede hacerlo manualmente y ser muy, muy cuidadoso, o puede automatizarlo con un script de migración usando algo como Truffle. En cualquier caso, es un proceso de implementación.

No es la única forma de hacer el paso 1. Otra forma de hacerlo que es limpia pero un poco difícil en el presupuesto de gas de implementación de una sola vez, es hacer que la implementación sea WidgetMakerparte del WidgetManagerconstructor de . Hecho de esa manera, cuando implemente una, WidgetManagerimplementará su propia fábrica y tendrá la propiedad de forma predeterminada. Algo como:

contract WidgetMaker {
  // ...
}

contract WidgetManager {

  WidgetMaker maker;

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

  // ...
}

Querrás recuperar la propiedad. Siga el mismo patrón de "empuje" y haga que el "propietario" se lo devuelva. Algo como:

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;

}

Espero eso ayude.