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!
No se puede hacer.
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 signedTransaction
ya 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 signedTransaction
son
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:
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:
v
yr