如何從交易歷史中獲取輸入參數的值
我想讀取 ETH 塊上的成功交易,並且我想獲取傳遞給該交易函式的輸入參數的值。我不是在談論
數據
交易中的欄位。而且我知道在我的 web 應用程序中使用來自 web3 的 TransactionReceipt 來查看此交易的其他詳細資訊。
例如,我在契約中有一個方法:
函式 setName(string n) {.....}
現在當這個函式被稱為
契約.setName("Abcde")....
現在,作為審計的一部分,我想在未來的某個時候使用事務 id 並讀取事務詳細資訊並讀取為該特定事務傳遞給此函式的值“Abcde”。
我想知道這是否可行,如果可行,我該怎麼做。
我不是在談論
data
交易中的領域。嗯,實際上,你是。該
data
欄位是輸入參數。你需要知道的是如何解碼它們。如果您真的想了解這一點,那麼值得研究一下乙太坊 ABI 。如需幫助工具,請查看web3.eth.abi(檢查您使用的是 v1.0 或更高版本的 Web3)。不幸的是,這並不能為您完成全部工作 - 它可以擴展到這樣做 - 但它可以提供幫助。
在您的範例中,您的函式呼叫將具有如下簽名:
> web3.eth.abi.encodeFunctionSignature('setName(string)'); '0xc47f0027'
因此,如果您找到一個
data
以 開頭的欄位c47f0027
,您就知道它是對您的setName
函式的呼叫,並且剩餘的數據是字元串參數。在您的範例中,字元串數據將如下所示
000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054162636465000000000000000000000000000000000000000000000000000000
:這是“Abcde”的 ABI 字元串表示形式)。因此,您從 中提取
data
它並將其輸入 Web3 以對其進行解碼,如下所示:> web3.eth.abi.decodeParameter('string','000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054162636465000000000000000000000000000000000000000000000000000000'); 'Abcde'
概括
總之你的榜樣,全
data
在交易現場將是“0xc47f0027000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000054162636465000000000000000000000000000000000000000000000000000000”。
- 前 8 個十六進製字元“c47f0027”(如果存在則忽略 0x)表示這是對您的
setName(string n)
函式的呼叫。- 剩下的數據是你的字元串參數,可以使用上面的 Web3 解碼。
附錄
這些庫看起來可以自動執行上述操作,但我還沒有測試過它們: