Me pregunto si es posible una carrera al realizar una verificación de un valor de retorno de una llamada similar a eth.getCode(greeter.contractAddress)
por ser cero. Es decir, ¿es posible que el contrato estuviera vivo durante la verificación, pero se autodestruyó justo después? Estoy perdido con las reglas de causalidad de Ethereum.
La llamada de ejemplo se copió del tutorial de contratos .
2 casos: fuera y dentro de la Máquina Virtual Ethereum (EVM).
Sí, la carrera es posible si eth.getCode
se usa. eth.getCode
es Javascript y está fuera de un contrato y el EVM. Entonces, después eth.getCode
, el siguiente bloque que recibe su cliente de Ethereum podría tener una transacción que se invocó selfdestruct
en el contrato (saludador).
No, si dentro del EVM en una sola transacción, porque las declaraciones son secuenciales y actualmente no hay paralelismo (como menciona @Sebi). El equivalente de EVM sería usar extcodesize
oextcodecopy
. El flujo de control dentro de la EVM es determinista.
Sí, la carrera es posible si se usa más de una transacción. Dentro de EVM, es importante tener en cuenta que los mineros tienen control total sobre cómo se ordenan las transacciones dentro de un bloque. En este documento se menciona la Dependencia de pedidos de transacciones (TOD) y los contratos TOD generalmente tendrán un problema de seguridad. Si un contrato C se ejecuta extcodesize
para el contrato D en una transacción y luego realiza alguna acción en otra transacción (suponiendo que el contrato D aún exista), entonces C es vulnerable a un ataque: una transacción que se realiza selfdestruct
en D podría insertarse entre los 2 transacciones de c.
No, cada llamada al contrato se serializa (no hay (actualmente) paralelismo en Ethereum); cada nodo ejecuta una llamada (transacción) al contrato de forma secuencial y luego transmite el resultado (el bloque que contiene el contrato con el estado actualizado) a la red.