Si mi contrato llama a suicide() haciendo referencia a un contrato como destinatario de los fondos, y la función predeterminada del contrato del destinatario vuelve a llamar a mi contrato, ¿tendrá éxito la llamada?
contract A {
function die(address _recipient) external {
suicide(_recipient);
}
}
contract B {
A a;
function () {
a.die(this);
}
}
Más importante aún, ¿importa? ¿No se habrán enviado todos los ETH restantes como parte de la llamada a B?
Hacer un seguimiento:
El papel amarillo muestra que los saldos se manipulan directamente y no a través de una llamada. (pág. 29 bajo la instrucción SUICIDIO)
El archivo core/vm/instructions.go en la rama maestra del cliente Go define el método opSuicide() que parece ser el que se llama durante la ejecución, y parece que ni siquiera transfiere el saldo. Simplemente lo agrega al destinatario y elimina el contrato de llamada.
func opSuicide(instr instruction, pc *uint64, env Environment, contract *Contract, memory *Memory, stack *stack) {
balance := env.Db().GetBalance(contract.Address())
env.Db().AddBalance(common.BigToAddress(stack.pop()), balance)
env.Db().Delete(contract.Address())
}
¿Alguien puede confirmar su comprensión de esto?
No, no hay invocaciones de contrato con selfdestruct
( suicide
), por lo que no hay posibilidad de reingreso.
No hay LLAMADAS como ha notado y el código Geth que ha citado es correcto.
jamie hale