Transactions

如何從交易歷史中獲取輸入參數的值

  • December 28, 2017

我想讀取 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 解碼。

附錄

這些庫看起來可以自動執行上述操作,但我還沒有測試過它們:

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