Transactions

在 Nethereum 中解碼交易輸入數據

  • March 30, 2022

我正在使用 Nethereum 並查看如何解碼對像Input數據的範例Transaction乙太坊遊樂場 C#

這看起來假設您必須知道您正在解碼哪些函式數據。我有完整的合約 ABI,但我不知道在此交易中呼叫了哪個函式。

有沒有辦法在Input不知道它是哪個函式的情況下解碼數據?例如,在 EthersJs 中,這只需通過ContractInterface.parseTransaction方法呼叫即可完成。

我也對其他基於 .NET 的解碼解決方案/庫的建議持開放態度。

這是可能的,但會涉及一些工作。該輸入數據的前 4 個字節是方法 ID。因此,如果您在 Etherscan 上找到交易,則查看輸入數據即可找到它。 交易輸入數據中的方法 ID

這是一個十六進制值,通過獲取方法名稱及其參數類型、刪除空格然後生成結果的 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 });
       }
   }
}

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