¿Cuál es el significado exacto del nuevo campo de "estado" del recibo de una transacción?

En esta respuesta ( https://ethereum.stackexchange.com/a/6010/1529 ) parece decir que el campo de estado siempre será '1' a menos que la transacción falle, en cuyo caso será '0'.

En la sección de resumen de esta respuesta ( https://ethereum.stackexchange.com/a/28078/1529 ), parece implicar que el campo de estado solo se establece en cero cuando se llama a 'revertir'.

¿Cuál es el significado exacto del campo de estado?

¿Receive.status de '0' indica errores de todo tipo o solo reverts?

¿Receive.status de '1' siempre indica una transacción exitosa?

Aquí hay un ejemplo de una transacción con un estado 'Error' (es decir, '0') y un error informado de 'sin gasolina': https://etherscan.io/tx/0xeec4ccd13fe05907f9d732a8ad245bcb7f918217157b89baaa23895c12eb329a . ¿Que pasó aquí?

Pregunta relacionada: ¿El nuevo campo de estado de recepción informa todos los errores en toda la cadena de llamadas?

Otorgaré la recompensa a la respuesta más completa (y más correcta).

Respuestas (1)

Esto fue descrito por EIP 658 que se implementó en la bifurcación de Byzantium . El texto del EIP está aquí , aunque extrañamente no parece haber sido finalizado formalmente antes de la bifurcación.

En cualquier caso, el texto relevante es este:

Para bloques donde block.number >= METROPOLIS_FORK_BLKNUM, la raíz de estado intermedio se reemplaza por un código de estado, 0 indica falla (debido a cualquier operación que puede causar que la transacción o llamada de nivel superior se revierta) y 1 indica éxito.

Entonces, en términos de su pregunta, 1 siempre es igual a éxito. Estoy bastante seguro de que "revertir" aquí no significa "resultado del código de revertoperación", sino que significa, esencialmente, cualquier condición que haga que el estado se revierta, incluidas todas las condiciones que antes se llamaban "lanzamientos".

Ahora, tenga en cuenta que EIP 658 también se llama EIP 98 y también se describe aquí

EIP98 está escrito por Vitalik:

Opción 3 (actualización 2017.07.28: vamos con este): para bloques donde block.number >= METROPOLIS_FORK_BLKNUM, el parámetro raíz de estado intermedio en el recibo debe establecerse en un byte \x01 si la ejecución del código más externo tuvo éxito, o un byte cero si falla la ejecución del código más externo.

Esto confirma que las transacciones fallidas (cualquiera que sea el modo de falla) dan como resultado 0, solo las exitosas deben dar como resultado 1. Se aplica solo a la "ejecución de código más externa".

Finalmente, para conocer la máxima autoridad, consulte la actualización del Libro amarillo de Yoichi (aún no fusionado).

Define un código de estado, s'.

Es un poco difícil de leer de esa forma, pero creo que la definición relevante del código de estado es esta:

Línea 775:

El código asociado a la cuenta (identificado como el fragmento cuyo hash Keccak es $\boldsymbol{\sigma}[c]_c$) se ejecuta de acuerdo con el modelo de ejecución (ver sección \ref{ch:model}). Al igual que con la creación del contrato, si la ejecución se detiene de manera excepcional (es decir, debido a un suministro de gas agotado, flujo insuficiente de la pila, destino de salto no válido o instrucción no válida), entonces no se reembolsa el gas a la persona que llama y el estado se revierte al punto inmediatamente antes de la transferencia de saldo (es decir, $\boldsymbol{\sigma}$).

Creo que la línea 782 dice, si el estado se revierte así, entonces s'es cero:

+s' & \equiv & \begin{cases}
+0 & \text{if} \quad \boldsymbol{\sigma}^{**} = \varnothing \\
+1 & \text{otherwise}

Hay otras referencias a s'allí, y pueden arrojar más luz.

Estoy seguro de que esto responde a la pregunta. La primera parte (EIP658) es, creo, la fuente del problema. Eso debería quedar más claro, creo. La segunda parte, la opción 3, de EIP 98, es mucho más clara, y el texto del documento amarillo es muy claro que incluye todos los modos de falla. Dejaré esta recompensa por un tiempo para ver si alguien contradice y luego otorgaré la recompensa en un par de días. Gracias por la respuesta.
@ThomasJayRush Gracias. Siento que el proceso EIP podría mejorarse un poco. No es bueno que haya documentos no combinados con numeración ambigua; que la página principal de EIP se vincula a documentos que no son normativos, que no parece haber una versión en PDF canónica actualizada del YP. Es todo un poco chapucero, la verdad.
Es bastante desordenado. ¿Participas en el proceso? Lo haría, pero realmente no sé cómo.
@ThomasJayRush El proceso de EIP previo al lanzamiento es bastante fácil de contribuir: todo se ejecuta en Ethereum GitHub y cualquiera puede comentar. Pero el proceso de "formalización" parece bastante casual. Los EIP se discuten en la llamada quincenal All Core Devs y surge un acuerdo; documentar ese acuerdo formalmente parece ser un punto débil. Yoichi está haciendo un gran trabajo en el YP, pero nadie fusiona sus relaciones públicas para mantenerlo actualizado.