¿Cómo calcular el txHash asignado de una transacción?

Solidity aún no es compatible con la variable txHash, pero se solicitó en EIP 901 https://github.com/ethereum/EIPs/issues/901 . Mientras tanto, ¿cómo podría calcular el txHash de una transacción utilizando el código Solidity en el contrato inteligente? Supongo que txHash se basa en un hash keccak del msg.sender y probablemente el nonce de la solicitud, ¿verdad? ¿Existe una fórmula canónica para el cálculo de Ethereum txHash? ¡Gracias!

Respuestas (2)

Respuesta corta

No se puede hacer.

Respuesta más larga

El txhash es keccak256(signedTransaction).

Esta función keccak256 está disponible como función de solidez http://solidity.readthedocs.io/en/v0.4.21/units-and-global-variables.html

Entonces necesitaría construir signedTransactionya que este valor no está expuesto a la solidez, cf. https://stackoverflow.com/questions/49803424/how-can-we-access-rlp-encoded-signed-raw-transaction-in-solidity

Los constituyentes de signedTransactionson

  1. mientras tanto
  2. precio de la gasolina
  3. limite de gases
  4. a
  5. valor en wei
  6. datos
  7. ecdsaV
  8. ecdsaR
  9. ecdsaS

El valor 3 no está disponible directamente, pero puede obtener el gas restante actual en cualquier punto de la ejecución de su código y calcular a partir de esto, cuánto estaba disponible una vez que comenzó la ejecución. Los valores 1, 7, 8 y 9 (los valores nonce y signature) no están disponibles mediante Solidity, ni mediante código ensamblador (que se puede escribir en línea en los archivos de código fuente de Solidity). Entonces, lamentablemente, su problema no se puede resolver.

Ver también: ¿los contratos de ethereum tienen acceso al nonce de los bloques?

De acuerdo con el código fuente de geth (archivo core/types/transactions) y este medio, el hash de una transacción está dado por el hash keccak de 256 bits de la codificación rlp de todos los campos de una transacción, como se muestra en esta imagen 1 .

Por lo tanto, para calcular la función de transacción, debe poder:

  1. Calcule el hash de bits KEC256 de un número arbitrario de bytes
  2. Acceder/Calcular una codificación RLP de una transacción
  3. Accede a todos los campos de una transacción:

Al mirar la especificación EVM ( Papel amarillo , Apéndice H), puede ver que el primer punto es muy fácil, de hecho, corresponde a la SHA3 (0x20)instrucción. No se proporciona la codificación RLP de todos los campos de una transacción ni una instrucción de codificación RLP en el conjunto de instrucciones EVM, pero es posible calcularlo ( Libro amarillo , Apéndice B), siempre que el remitente tenga suficiente gas a su disposición. Finalmente, no hay instrucciones para acceder a todos los campos. En particular, no puedo encontrar las instrucciones de EVM para acceder:

  • el nonce de la transacción: Corresponde al número de transacciones enviadas por el remitente (no encuentro una función para recuperar ni este número)
  • la información de la firma vyr
  • el límite de gas de transacción