De acuerdo con la versión más reciente del papel amarillo y la especificación de ensamblaje de Solidity, revertir el código de operación puede devolver un código de error.
http://solidity.readthedocs.io/en/develop/assembly.html
revert(p, s) - finaliza la ejecución, revierte los cambios de estado, devuelve datos mem[p..(p+s))
Sin embargo, la función de reversión en solidez pura tiene 0 argumentos. Supongo que todavía no admite un código de retorno.
[P] : ¿Cómo puedo usar la reversión del ensamblado de Solidity para pasar un código de error a la aplicación de JavaScript web3 que llama? Si esto no es posible, explique por qué.
Actualización : vea también Solidez: ¿Cómo podemos escribir un mensaje de error en "requerir"?
Como se discutió en los comentarios, no hay una manera fácil de obtener el motivo de reversión en Dapp. Sin embargo, esta característica podría ser compatible en el futuro.
Aquí está el EIP inicial y su discusión:
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-658.md https://github.com/ethereum/EIPs/pull/658
Respuesta anterior
Según tengo entendido, no es posible que un cliente como web3 lea la salida revertida, al igual que no es posible leer la salida en caso de que se complete una transacción normal. Revert usa datos de salida o
como se define en el papel amarillo que se puede usar para llamadas de mensajes pero se ignora para transacciones.
las llamadas de mensajes también tienen un componente adicional: los datos de salida indicados por la matriz de bytes o. Esto se ignora cuando se ejecutan transacciones; sin embargo, las llamadas de mensajes se pueden iniciar debido a la ejecución del código VM y, en este caso, se utiliza esta información.
El efecto del código de operación REVERT viene dado por la fórmula 140 que hace referencia a la salida o
.
Remix, sin embargo, muestra el resultado cuando se usa una máquina virtual de JavaScript, porque ejecuta las transacciones de forma síncrona:
pragma solidity^0.4.11;
contract C {
function testRevert() pure public returns (uint result) {
uint memOffset;
assembly {
memOffset := msize() // Get the highest available block of memory
mstore(add(memOffset, 0x00), 6) // Set value
mstore(0x40, add(memOffset, 0x20)) // Update the msize offset to be our memory reference plus the amount of bytes we're using
revert(memOffset, 0x20) // revert returning 1 byte
}
}
}
Salida decodificada:
{
"0": "uint256: result 6"
}
Cuando se ejecuta en testnets o mainnet, no hay salida.
Debería ser posible leer la salida revertida cuando se usa el ensamblaje de bajo nivel call
( delegatecall
voy callcode
a actualizar esta respuesta cada vez que tenga un ejemplo de código de trabajo).
Espero que try-catch
se agregue una función similar en Solidity cuando use sus contratos call
de llamadas a través delegatecall
de callcode
su interfaz (actualizará la respuesta cada vez que tenga referencias).
status
propiedad en el recibo de tx, pero solo puede ser 0
o 1
. ¿Sabe si hay planes (p. ej., ERC/EIP) para almacenar los datos de retorno de reversión al recibo? Lanzar un evento de error sería contradictorio con revertir toda la transacción. Para el evento de error, tendría que confirmar la creación del evento, pero revertir todo lo demás. ¿Cuál sería un patrón para eso?sentGas == usedGas
como antes, pero efectivamente, en la interfaz de usuario, solo puede decir "Pasó" o "Algo salió mal". Pero lo que salió mal exactamente se pierde en el resumen. Supongo que se podría seguir el rastro de la transacción para encontrar la ubicación, pero para este caso de uso suena como una solución alternativa.
garen vartanian
require
campo de mensaje?ivicaa