Transactions
在 Nethereum 中解碼交易輸入數據
我正在使用 Nethereum 並查看如何解碼對像
Input
數據的範例Transaction
。乙太坊遊樂場 C#這看起來假設您必須知道您正在解碼哪些函式數據。我有完整的合約 ABI,但我不知道在此交易中呼叫了哪個函式。
有沒有辦法在
Input
不知道它是哪個函式的情況下解碼數據?例如,在 EthersJs 中,這只需通過ContractInterface.parseTransaction
方法呼叫即可完成。我也對其他基於 .NET 的解碼解決方案/庫的建議持開放態度。
這是可能的,但會涉及一些工作。該輸入數據的前 4 個字節是方法 ID。因此,如果您在 Etherscan 上找到交易,則查看輸入數據即可找到它。
這是一個十六進制值,通過獲取方法名稱及其參數類型、刪除空格然後生成結果的 SHA-3 散列來計算。
因此,您首先需要編寫程式碼以使用 SHA-3 生成合約方法名稱的雜湊值,這可能並不簡單,因為在 .NET 中似乎沒有實現它。
一旦你找到了一種生成 SHA-3 雜湊的方法,找出函式就是將你正在使用的輸入數據與生成的雜湊進行比較。確認函式後,您可以創建它的實例,然後呼叫**decodeInput()**方法。
這就是我在 Netherium 中所做的 - 這會將 Transaction 類解碼為正確的 Function 類(從 Abi 生成):
foreach (var type in Assembly.GetEntryAssembly().GetTypes()) { if (type.IsSubclassOf(typeof(FunctionMessage))) { var abiFunction = ABITypedRegistry.GetFunctionABI(type); if (txn.Input.StartsWith($"0x{abiFunction.Sha3Signature}")) { var m = typeof(FunctionMessageExtensions) .GetMethod("DecodeTransactionToFunctionMessage") .MakeGenericMethod(type); var function = m.Invoke(null, new object[] { txn }); } } }