如何計算交易分配的 txHash?
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
是
- 隨機數
- 汽油價格
- 氣體限制
- 到
- value in wei
- 數據
- ecdsaV
- ecdsar
- ecdsaS
值 3 不是直接可用的,但您可以在程式碼執行的任何時候獲取目前剩餘的 gas,並據此計算執行開始後可用的燃料量。值 1、7、8 和 9(nonce 和簽名值)在使用solidity 時不可用,也不能使用彙編程式碼(可以在solidity 原始碼文件中內聯編寫)。所以很遺憾您的問題無法解決。
另請參閱: 乙太坊的合約是否可以訪問區塊的隨機數?
根據 geth 原始碼(文件
core/types/transactions
)和該媒體文章,交易的雜湊由交易所有欄位的 rlp 編碼的 keccak 256 位雜湊給出,如圖1所示。因此,為了計算交易函式,您需要能夠:
- 計算任意字節數的 KEC256 位雜湊
- 訪問/計算交易的 RLP 編碼
- 訪問事務的所有欄位:
通過查看 EVM 規範(黃皮書,附錄 H),您可以看到第一點非常簡單,確實與
SHA3 (0x20)
指令相對應。既沒有給出交易所有欄位的 RLP 編碼,也沒有給出 EVM 指令集中的 RLP 編碼指令,但可以計算它(黃皮書,附錄 B),前提是發送方有足夠的 gas 可供使用。最後,沒有訪問所有欄位的指令。特別是我找不到要訪問的 EVM 指令:
- 交易的隨機數:它對應於發件人發送的交易數量(我找不到一個函式來檢索這個數字)
- 簽名資訊
v
和r
- 交易氣體限制