Solidity пока не поддерживает переменную txHash, но она была запрошена на EIP 901 https://github.com/ethereum/EIPs/issues/901 . Между тем, как я могу рассчитать txHash транзакции, используя код Solidity в смарт-контракте? Я предполагаю, что txHash построен на некотором хешировании keccak msg.sender и, возможно, одноразового номера запроса, верно? Существует ли каноническая формула для расчета txHash Ethereum? Спасибо!
Это невозможно сделать.
Тхэш есть keccak256(signedTransaction)
.
Эта функция keccak256 доступна как функция твердости http://solidity.readthedocs.io/en/v0.4.21/units-and-global-variables.html .
Так что вам нужно построить, signedTransaction
так как это значение не подвергается твердости, ср. https://stackoverflow.com/questions/49803424/how-can-we-access-rlp-encoded-signed-raw-transaction-in-solidity
Составляющими signedTransaction
являются
Значение 3 недоступно напрямую, но вы можете получить текущий оставшийся газ в любой момент выполнения вашего кода и рассчитать на его основе, сколько газа было доступно после начала выполнения. Значения 1, 7, 8 и 9 (значения одноразового номера и подписи) недоступны при использовании Solidity, а также они недоступны при использовании ассемблерного кода (который может быть встроен в файлы исходного кода Solidity). Так что ваша проблема, к сожалению, не может быть решена.
См. также: есть ли у контрактов эфириума доступ к одноразовым номерам блоков?
Согласно исходному коду geth (файл core/types/transactions
) и этому сообщению на носителе , хэш транзакции задается 256-битным хешированием keccak rlp-кодирования всех полей транзакции, как показано на этом изображении 1 .
Таким образом, чтобы рассчитать функцию транзакции, вы должны уметь:
Глядя на спецификацию EVM ( Yellow Paper , Приложение H), можно увидеть, что первый пункт очень простой, действительно соответствует SHA3 (0x20)
инструкции. В наборе инструкций EVM не приводится ни RLP-кодирование всех полей транзакции, ни инструкция RLP-кодирования, но ее можно вычислить ( Yellow Paper , Приложение B), при условии, что в распоряжении отправителя достаточно газа. Наконец, нет инструкций для доступа ко всем полям. В частности, я не могу найти инструкции EVM для доступа:
v
иr