概览

FullNode HTTP API 是 TRON 节点提供的核心 API 服务,开发者可以通过 HTTP 接口发送交易、查询链上数据并与智能合约交互。

调用流程

使用 HTTP API 发送交易的一般流程包括以下 3 个步骤:

  1. 通过各个 API 创建一个 Transaction 对象
  2. 使用 SDK 签名 Transaction 对象
  3. 使用 BroadcastTransaction 广播签名后的 Transaction 对象

地址格式

为方便处理 HEX 和 Base58Check 两种格式地址,所有 API 支持通过 visible 参数指定地址格式:

  • visible=true:地址使用 Base58Check 编码(通常以字符 T 开头)
  • visible=false:地址使用 HEX 编码(通常以字符 41 开头)

visible 参数默认值为 false

多重签名

所有交易创建 API 支持通过 Permission_id 参数指定所使用的权限 ID,以支持多重签名场景。

请求方式

各接口支持的请求方式以具体接口文档为准,部分接口仅支持 POST,部分接口仅支持 GET。使用 POST 方式时,参数须以 JSON 格式放置在 HTTP 请求体(request body)中传入,不支持其他编码格式。

响应格式

TRON FullNode HTTP API 的响应数据基于 Protocol Buffer (proto3) 消息序列化为 JSON 格式返回。在使用这些接口时,有一项序列化行为需要特别注意。

proto3 默认值省略

在 proto3 规范中,当字段的值等于该类型的默认值时,该字段在 JSON 序列化输出时会被省略,以减少传输体积。因此,响应中某个字段缺失,并不意味着数据异常或节点返回不完整——它仅表示该字段的值恰好是其类型的默认值。需要注意的是,出于兼容性或可读性考虑,某些接口可能会显式输出部分默认值字段,具体行为以各接口文档说明为准。

📘

解析原则

JSON 响应中缺失的字段,应按该类型的 proto3 默认值处理。

常见类型默认值一览:

字段类型默认值JSON 中的表现
int32 / int640通常被省略
boolfalse通常被省略
string""通常被省略
bytes空值通常被省略
enum第一个枚举项(索引 0通常被省略
repeated[]通常被省略

示例:GetAccount 响应中的 frozenV2 字段

调用 /wallet/getaccount 接口时,响应体中的 frozenV2 字段(用于展示账户的 Stake2.0 质押情况)可能如下所示(省略了默认值):

"frozenV2": [
  { "amount": 20000000000 },
  { "type": "ENERGY", "amount": 20400000000 },
  { "type": "TRON_POWER" }
]

开发者应将其解释为(补全默认值后):

"frozenV2": [
  { "type": "BANDWIDTH",  "amount": 20000000000 },
  { "type": "ENERGY",     "amount": 20400000000 },
  { "type": "TRON_POWER", "amount": 0            }
]
  • 第一条缺失 type → 默认为 BANDWIDTHResourceCode 枚举索引 0
  • 第三条缺失 amount → 默认为 0

客户端处理建议

  • 使用 protobuf 官方 JSON 解析器:反序列化时通常会自动为缺失字段填充默认值,无需额外处理。
  • 直接解析原始 JSON:需手动为缺失字段填充默认值,以下为各语言示例。
// JavaScript / TypeScript
function parseFrozenV2(entries) {
  return entries.map(entry => ({
    type:   entry.type   ?? "BANDWIDTH",
    amount: entry.amount ?? 0,
  }));
}
# Python
def parse_frozen_v2(entries):
    for entry in entries:
        yield {
            "type":   entry.get("type", "BANDWIDTH"),
            "amount": entry.get("amount", 0),
        }
// Java
public Map<String, Object> parseFrozenV2Entry(JSONObject json) {
    String type   = json.has("type")   ? json.getString("type")  : "BANDWIDTH";
    long   amount = json.has("amount") ? json.getLong("amount")  : 0L;
    return Map.of("type", type, "amount", amount);
}

常见误区

GetAccount 为例,普通账户的 type 字段值为 Normal(枚举索引 0),响应中不会出现该字段。若开发者以字段缺失来判断账户类型未知或接口返回异常,则会产生误判,而缺失的 type 实际上明确表示该账户是普通账户。

安全注意事项

📘

XSS 防护建议

尽管 TRON API 通过将 HTTP API 的 Content-Type 设置为 application/json 来降低 XSS 风险,但开发者仍应注意某些特定的 API 端点可能缺乏完整的输入验证。

为了确保用户数据安全,我们建议在将从 API 检索到的数据渲染到用户界面 (UI) 之前,对其进行适当的转义处理,尤其是 visible=true 时返回的字符串字段。

如需了解完整的 XSS 防护实践,请参阅 OWASP XSS Prevention Cheat Sheet