¿Es posible una carrera al verificar el contrato por vida?

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 .

Respuestas (2)

2 casos: fuera y dentro de la Máquina Virtual Ethereum (EVM).

Fuera de la EVM

Sí, la carrera es posible si eth.getCodese usa. eth.getCodees 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ó selfdestructen el contrato (saludador).

Dentro de la EVM

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 extcodesizeoextcodecopy . 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 extcodesizepara 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 selfdestructen 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.