¿Es un contrato suicida susceptible de reingreso?

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?

De hecho, ahora me pregunto si esa llamada sucede. El lenguaje matemático en el papel amarillo debajo de la instrucción SUICIDIO hace que parezca que el saldo simplemente se agrega a la cuenta del destinatario sin que se realice una llamada. ??

Respuestas (1)

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.