Transactions

如何使用 python3 解碼來自 tx 的輸入數據?

  • September 16, 2018

我正在嘗試從令牌銷售交易中解碼輸入數據。這是我試圖解析的事務之一,0xf7b7196ca9eab6e4fb6e7bce81aeb25a4edf04330e57b3c15bece9d260577e2b 它具有以下輸入數據: 0xa9059cbb00000000000000000000000067fa2c06c9c6d4332f330e14a66bdf1873ef3d2b0000000000000000000000000000000000000000000000000de0b6b3a7640000

我知道前 4 個字節代表函式(0xa9059cbb–> transfer

第一個參數是_to地址(0x00000000000000000000000067fa2c06c9c6d4332f330e14a66bdf1873ef3d2b

第二個是_value誰的類型是 uint256 ( 0x0000000000000000000000000000000000000000000000000de0b6b3a7640000)。

如何_value在 python 中解碼以獲得被移動的令牌數量?我知道對於 javascript 有abi-decoder類似的功能,但我想知道如何在 python 中自己執行此操作。

我已經讀到該值儲存為大端整數,但是當我嘗試讀取它時,我沒有得到 etherscan 上列出的交易值(https://etherscan.io/tx/0xf7b7196ca9eab6e4fb6e7bce81aeb25a4edf04330e57b3c15bece9d260577e2b

我關於參數編碼的資訊來自這裡:https ://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI

如果你知道合約 ABI,呼叫數據可以使用pyethereum進行解碼:

from ethereum.abi import (
   decode_abi,
   normalize_name as normalize_abi_method_name,
   method_id as get_abi_method_id)
from ethereum.utils import encode_int, zpad, decode_hex

def decode_contract_call(contract_abi: list, call_data: str):
   call_data_bin = decode_hex(call_data)
   method_signature = call_data_bin[:4]
   for description in contract_abi:
       if description.get('type') != 'function':
           continue
       method_name = normalize_abi_method_name(description['name'])
       arg_types = [item['type'] for item in description['inputs']]
       method_id = get_abi_method_id(method_name, arg_types)
       if zpad(encode_int(method_id), 4) == method_signature:
           try:
               args = decode_abi(arg_types, call_data_bin[4:])
           except AssertionError:
               # Invalid args
               continue
           return method_name, args

如果您正在使用web3.py,則不需要外部模組。您只需要Contract使用其 ABI 啟動實例。

然後你執行它的decode_function_input方法

decoded_input = contract.decode_function_input(tx['input'])

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