You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解码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文件

如果需要自定义解析逻辑,可按以下步骤操作:

  1. 定义核心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;
}
  1. 编译生成Python类
    使用protoc工具编译:
protoc --python_out=. protocol.proto
  1. 编写解码代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:25:22