Solidity

如何計算交易分配的 txHash?

  • April 26, 2018

Solidity 尚不支持 txHash 變數,但已在 EIP 901 https://github.com/ethereum/EIPs/issues/901提出請求。同時,如何使用智能合約中的 Solidity 程式碼計算交易的 txHash?我猜 txHash 是建立在 msg.sender 的一些 keccak 散列之上的,並且可能是請求的 nonce,對吧?乙太坊 txHash 計算是否有規範的公式?謝謝!

簡短的回答

這是不可能的。

更長的答案

txhash 是keccak256(signedTransaction).

這個 keccak256 函式可作為一個可靠函式 http://solidity.readthedocs.io/en/v0.4.21/units-and-global-variables.html

所以你需要構造signedTransaction,因為這個值沒有暴露於solidity,cf。https://stackoverflow.com/questions/49803424/how-can-we-access-rlp-encoded-signed-raw-transaction-in-solidity

的成分signedTransaction

  1. 隨機數
  2. 汽油價格
  3. 氣體限制
  4. value in wei
  5. 數據
  6. ecdsaV
  7. ecdsar
  8. ecdsaS

值 3 不是直接可用的,但您可以在程式碼執行的任何時候獲取目前剩餘的 gas,並據此計算執行開始後可用的燃料量。值 1、7、8 和 9(nonce 和簽名值)在使用solidity 時不可用,也不能使用彙編程式碼(可以在solidity 原始碼文件中內聯編寫)。所以很遺憾您的問題無法解決。

另請參閱: 乙太坊的合約是否可以訪問區塊的隨機數?

根據 geth 原始碼(文件core/types/transactions)和該媒體文章,交易的雜湊由交易所有欄位的 rlp 編碼的 keccak 256 位雜湊給出,如圖1所示。

因此,為了計算交易函式,您需要能夠:

  1. 計算任意字節數的 KEC256 位雜湊
  2. 訪問/計算交易的 RLP 編碼
  3. 訪問事務的所有欄位:

通過查看 EVM 規範(黃皮書,附錄 H),您可以看到第一點非常簡單,確實與SHA3 (0x20)指令相對應。既沒有給出交易所有欄位的 RLP 編碼,也沒有給出 EVM 指令集中的 RLP 編碼指令,但可以計算它(黃皮書,附錄 B),前提是發送方有足夠的 gas 可供使用。最後,沒有訪問所有欄位的指令。特別是我找不到要訪問的 EVM 指令:

  • 交易的隨機數:它對應於發件人發送的交易數量(我找不到一個函式來檢索這個數字)
  • 簽名資訊vr
  • 交易氣體限制

引用自:https://ethereum.stackexchange.com/questions/45648