如何解码Tron全节点API原始数据并识别TRC20交易?
TRON区块交易Protobuf解码与交易类型识别方案
一、批量获取区块交易的完整代码补充
你提供的批量获取区块代码可补全API地址,完整示例如下:
import requests, json # TRON主网API地址 url = "https://api.trongrid.io/wallet/getblockbylimitnext" startNum = 48221000 payload = {'startNum': startNum, 'endNum': startNum + 10} # 对应问题中10个区块的需求 res = requests.post(url, json=payload) blocks = json.loads(res.text)['block']
二、解码Protobuf格式的raw_data_hex
TRON交易数据基于自定义Protobuf协议序列化,有两种解码方式:
方式1:使用官方Python SDK简化操作
直接借助tronpy SDK无需手动编译Protobuf文件,安装后即可解码:
# 先安装依赖:pip install tronpy from tronpy.proto import Transaction # 你的raw_data_hex示例 raw_data_hex = '0a02d3aa2208de1122c81e7942d140d8eb9fefe0305acf01081f12ca010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e74726163741294010a1541e4802a30928257f4c34173e2c68b10472fff6029121541a614f803b6fd780986a42c78ec9c7f77e6ded13c226423b872dd000000000000000000000041ad17c064d7f5868e8a18a7cfdda9f2dbb9391a91000000000000000000000041d482b7eb71da62083b389a494dc5c77d13fcbd1f00000000000000000000000000000000000000000000000000000000000000007099a79cefe0309001c0f0f50b' # 十六进制转字节并解码 tx = Transaction() tx.ParseFromString(bytes.fromhex(raw_data_hex)) # 输出核心解码结果 print(f"交易类型枚举值: {tx.contract[0].type}") print(f"过期时间: {tx.expiration}") print(f"手续费上限: {tx.fee_limit}") print(f"交易时间戳: {tx.timestamp}")
方式2:手动编译Protobuf文件
如果需要自定义解析逻辑,可按以下步骤操作:
- 定义核心Protobuf结构
创建protocol.proto文件,包含TRON交易的核心结构:
syntax = "proto3"; package protocol; message Transaction { message Contract { enum ContractType { TransferContract = 1; TransferAssetContract = 2; TriggerSmartContract = 10; } ContractType type = 1; bytes parameter = 2; string type_url = 3; } repeated Contract contract = 1; bytes ref_block_bytes = 2; bytes ref_block_hash = 3; int64 expiration = 4; int64 fee_limit = 5; int64 timestamp = 6; } message TriggerSmartContract { bytes owner_address = 1; bytes contract_address = 2; bytes data = 3; }
- 编译生成Python类
使用protoc工具编译:
protoc --python_out=. protocol.proto
- 编写解码代码
import binascii from protocol_pb2 import Transaction, TriggerSmartContract raw_data_bytes = binascii.unhexlify(raw_data_hex) tx = Transaction() tx.ParseFromString(raw_data_bytes) # 解析智能合约调用参数 if tx.contract[0].type == Transaction.Contract.TriggerSmartContract: trigger_tx = TriggerSmartContract() trigger_tx.ParseFromString(tx.contract[0].parameter) print(f"调用者地址: {binascii.hexlify(trigger_tx.owner_address).decode()}") print(f"合约地址: {binascii.hexlify(trigger_tx.contract_address).decode()}")
三、识别交易类型(TRC20转账等)
1. 快速区分交易大类
从raw_data的*contract[0].type*字段直接判断:
*TransferContract*:TRX原生转账*TransferAssetContract*:TRC10资产转账*TriggerSmartContract*:智能合约调用(TRC20转账属于此类)
2. 精准识别TRC20转账交易
TRC20转账是调用合约的transfer或transferFrom函数,判断依据:
- 交易类型为
TriggerSmartContract data字段前4字节为函数签名哈希:transfer(address,uint256)→23b872dd(你的示例数据即为此类)transferFrom(address,address,uint256)→095ea7b3
批量识别代码示例:
def is_trc20_transfer(tx_raw_data): contract = tx_raw_data['contract'][0] if contract['type'] != 'TriggerSmartContract': return False data = contract['parameter']['value']['data'] return data.startswith('23b872dd') or data.startswith('095ea7b3') # 遍历区块识别TRC20转账 for block in blocks: for tx in block['transactions']: if is_trc20_transfer(tx['raw_data']): print(f"TRC20转账交易ID: {tx['txID']}")
3. 提取TRC20转账细节
从data字段解析接收地址和金额:
def parse_trc20_transfer(data_hex): # 跳过前4字节函数签名,提取32字节接收地址(取后20字节为TRON地址) receiver = data_hex[8:72][24:] # 提取32字节转账金额,转十进制 amount = int(data_hex[72:136], 16) return {'receiver_address': receiver, 'amount': amount} # 解析示例数据 data = '23b872dd000000000000000000000041ad17c064d7f5868e8a18a7cfdda9f2dbb9391a91000000000000000000000041d482b7eb71da62083b389a494dc5c77d13fcbd1f0000000000000000000000000000000000000000000000000000000000000000' details = parse_trc20_transfer(data) print(f"接收地址: {details['receiver_address']}") print(f"转账金额: {details['amount']}")
内容的提问来源于stack exchange,提问作者avhacker
相关产品推荐
相关产品推荐

