FullNode HTTP API 是 TRON 节点提供的核心 API 服务,开发者可以通过 HTTP 接口发送交易、查询链上数据并与智能合约交互。
调用流程
使用 HTTP API 发送交易的一般流程包括以下 3 个步骤:
- 通过各个 API 创建一个 Transaction 对象
- 使用 SDK 签名 Transaction 对象
- 使用
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 / int64 | 0 | 通常被省略 |
bool | false | 通常被省略 |
string | "" | 通常被省略 |
bytes | 空值 | 通常被省略 |
enum | 第一个枚举项(索引 0) | 通常被省略 |
repeated | [] | 通常被省略 |
示例:GetAccount 响应中的 frozenV2 字段
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→ 默认为BANDWIDTH(ResourceCode枚举索引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。