Tengo un contrato WidgetMaker
que utiliza Zeppelin-Solidity Ownable
para 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 SendWidget
otro 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 WidgetManager
para permitir que llame a la SendWidget
función en la instancia implementada actual de WidgetMaker
?
2) ¿Hay alguna forma segura de agregar una función WidgetManager
que 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
?
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 WidgetMaker
parte del WidgetManager
constructor de . Hecho de esa manera, cuando implemente una, WidgetManager
implementará 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.