Как рассчитать назначенный txHash транзакции?

Solidity пока не поддерживает переменную txHash, но она была запрошена на EIP 901 https://github.com/ethereum/EIPs/issues/901 . Между тем, как я могу рассчитать txHash транзакции, используя код Solidity в смарт-контракте? Я предполагаю, что txHash построен на некотором хешировании keccak msg.sender и, возможно, одноразового номера запроса, верно? Существует ли каноническая формула для расчета txHash Ethereum? Спасибо!

Ответы (2)

Короткий ответ

Это невозможно сделать.

Более длинный ответ

Тхэш есть 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являются

  1. одноразовый номер
  2. цена на газ
  3. лимит газа
  4. к
  5. стоимость в вэй
  6. данные
  7. ecdsaV
  8. ecdsaR
  9. ecdsaS

Значение 3 недоступно напрямую, но вы можете получить текущий оставшийся газ в любой момент выполнения вашего кода и рассчитать на его основе, сколько газа было доступно после начала выполнения. Значения 1, 7, 8 и 9 (значения одноразового номера и подписи) недоступны при использовании Solidity, а также они недоступны при использовании ассемблерного кода (который может быть встроен в файлы исходного кода Solidity). Так что ваша проблема, к сожалению, не может быть решена.

См. также: есть ли у контрактов эфириума доступ к одноразовым номерам блоков?

Согласно исходному коду geth (файл core/types/transactions) и этому сообщению на носителе , хэш транзакции задается 256-битным хешированием keccak rlp-кодирования всех полей транзакции, как показано на этом изображении 1 .

Таким образом, чтобы рассчитать функцию транзакции, вы должны уметь:

  1. Вычислите битовый хеш KEC256 произвольного количества байтов
  2. Доступ/вычисление RLP-кодирования транзакции
  3. Доступ ко всем полям транзакции:

Глядя на спецификацию EVM ( Yellow Paper , Приложение H), можно увидеть, что первый пункт очень простой, действительно соответствует SHA3 (0x20)инструкции. В наборе инструкций EVM не приводится ни RLP-кодирование всех полей транзакции, ни инструкция RLP-кодирования, но ее можно вычислить ( Yellow Paper , Приложение B), при условии, что в распоряжении отправителя достаточно газа. Наконец, нет инструкций для доступа ко всем полям. В частности, я не могу найти инструкции EVM для доступа:

  • одноразовый номер транзакции: соответствует количеству транзакций, отправленных отправителем (я не могу найти функцию для получения ни этого числа)
  • информация о подписи vиr
  • лимит транзакционного газа