Estoy tratando de tener algún tipo de confirmación después de que elimine un contrato al regresar true
, pero cuando ejecuto mi comando de eliminación, siempre regresa false
. ¿Hay algún motivo por el cual, o no se está eliminando el contrato?
Aquí está mi código de contrato:
function killContract() constant returns (bool) {
require(msg.sender == owner);
selfdestruct(owner);
return true;
}
Aquí está mi código de trufa que estoy tratando de que devuelva verdadero, pero sigue devolviendo falso:
MyContract.at('0x...')
.then(instance => {
c = instance;
return c.getOwner()
})
.then(owner => {
console.log(`Owner: ${owner}`);
return c.killContract()
})
.then(killed => {
console.log(`If killed return true: ${killed}`);
})
.catch(error => {
console.log(`${error}`);
})
Aquí están pasando 2 cosas:
1- La función killContract modifica el estado de la cadena de bloques, por lo que marcarla como constante/vista no funcionará. Las funciones de vista/constante solo pueden leer el estado.
Dado que esta NO sería una función constante, no podrá devolver ningún valor fuera de la solidez.
2- Una vez que se invoca la autodestrucción, parece que no se procesarán más instrucciones.
Lo que puede hacer es activar un evento antes de llamar a la autodestrucción para que web3 sepa que se llamó a la función. Si fallaba la autodestrucción, la función se revertiría y el evento no se activaría.
pragma solidity 0.4.19;
contract A{
event debug(bool destroyed);
function destroyMeAndLog() onlyOwner{
debug(true);
selfdestruct(this);
}
}
Otra cosa que podría hacer es agregar una función ficticia que devuelva verdadero cuando se le llame. Si lo llamó después de que el contrato se autodestruyó, devolvería falso.
A menos que me equivoque, el contrato se cancela y no queda nadie/nada para return true;
. Borró el siguiente paso.
Creo que puede emitir un evento antes selfdestruct
y el evento aparecerá en el registro de transacciones. Eso le daría al observador una confirmación positiva de lo que selfdestruct
ocurrió. Algo como:
event LogSelfDestruct(address sender, uint amount);
function kill() public onlyOwner {
LogSelfDestruct(msg.sender, this.balance);
selfdestruct(owner);
}
Luego, mire ese registro de eventos para observar los eventos de autodestrucción.
Espero eso ayude.
pd estoy de acuerdo con pablo. constant
no pertenece
JorahFriendzone
Rob Hitchens