区块
TRON 上的区块结构、复合区块 ID 设计及区块生产时间表。
区块把一组交易和指向前一区块的元数据打包在一起。每个区块通过 parentHash 连接到前一个区块,形成连续链条;任何历史区块被修改,都会导致后续区块校验失败。
前置阅读
区块结构
一个区块主要包含 block_header 和 transactions 两部分:
{
"blockID": "000000000164387f...4e1dc6c6",
"block_header": {
"raw_data": {
"number": 23345279,
"txTrieRoot": "b04e2c9f...e7a3041e",
"witness_address": "410765be...888e606",
"parentHash": "00000000...4e1dc6c6",
"version": 28,
"timestamp": 1715000000000
},
"witness_signature": "73f5c6a8...1b2c3d4e"
},
"transactions": [
/* 交易对象 — 参见"交易" */
]
}| 字段 | 类型 | 说明 |
|---|---|---|
blockID | 十六进制(32 字节) | 区块唯一标识,参见下文区块 ID。 |
raw_data.number | int | 区块高度(Block Number),从创世区块高度 0 开始递增。 |
raw_data.txTrieRoot | 十六进制 | 当前区块内所有交易构成的 Merkle 树根哈希。 |
raw_data.witness_address | 十六进制 | 生产该区块的超级代表(SR)账户地址。 |
raw_data.parentHash | 十六进制 | 前一个区块的区块 ID。 |
raw_data.version | int | 网络协议版本号。 |
raw_data.timestamp | int(毫秒) | 区块生成时间,Unix 毫秒时间戳。 |
witness_signature | 十六进制 | 出块 SR 对 block_header.raw_data 的签名。 |
区块 ID
TRON 的区块 ID 不是简单的区块哈希,而是由区块高度和区块头哈希合成的 32 字节值:
- 对
block_header.raw_data做 SHA-256,得到 32 字节哈希。 - 将哈希前 8 字节替换为区块高度的 8 字节大端序表示。
- 保留后 24 字节不变。
+-----------------------------------------------------------+
| Block ID |
+------------------------------------+----------------------+
| 0 - 7 字节 (Block Number 大端序) | 8 - 31 字节 (原始哈希) |
+------------------------------------+----------------------+这种设计让节点能从区块 ID 前缀直接读出区块高度,同时用后缀验证区块头内容。parentHash 保存前一个区块的完整区块 ID,从而连接链条。
该 8 字节高度前缀也被 TAPOS 使用:交易通过 ref_block_bytes 引用近期区块,让交易锚定到特定链段。
术语上,表示顺序高度时使用区块高度(Block Number);表示 32 字节唯一标识时使用区块 ID(Block ID)。不要把两者都泛称为“区块哈希”。
区块生产
TRON 目标出块间隔为 3 秒。27 个超级代表(SR)轮流出块,每轮包含 27 个槽位,每个 SR 分配一个槽位。
如果被调度的 SR 未能在自己的槽位出块,该槽位会留空,网络不会安排备用节点补位。下一个槽位仍由下一位 SR 生产区块。
每 6 小时进入维护期时,网络会短暂跳过两个槽位(约 6 秒),用于统计投票、更新 SR 集合并处理到期提案;这并非网络停摆。随后新的活跃 SR 集继续按调度出块。
区块最终性和固化规则参见共识与 DPoS。
区块大小
单个区块可承载的交易数据上限为 2,000,000 字节。该限制影响大型合约部署和包含大量签名的交易。
API
如何查询区块和交易
区块查询接口按“最新区块、已固化区块、按高度、按区块 ID、按区间”分工。区块对象中的交易是交易本体;执行结果、手续费、Event 和内部交易在 receipt 中,需要通过交易 receipt 接口查询。
| 查询目标 | 推荐接口 | 说明 |
|---|---|---|
| 最新区块 | wallet/getnowblock | 返回 FullNode 当前链头最新区块,可能尚未固化。 |
| 最新已固化区块 | walletsolidity/getnowblock | 返回 SolidityNode 视图中的最新已固化区块。 |
| 按高度查询区块 | wallet/getblockbynum 或 walletsolidity/getblockbynum | FullNode 版本可查最新链头视图;SolidityNode 版本可用来判断某个高度是否已固化。 |
| 按区块 ID 查询区块 | wallet/getblockbyid | 已知区块 ID 时使用。 |
| 批量扫描区块 | wallet/getblockbylimitnext 或已固化区块扫描 | 用于索引器回填和连续区块处理;需要最终状态时应扫描已固化高度。 |
| 查询交易本体 | wallet/gettransactionbyid | 返回 raw_data、签名和合约调用参数,不包含执行 receipt。 |
| 查询交易执行结果 | wallet/gettransactioninfobyid 或 SolidityNode 版本 | 返回手续费、Energy 消耗、Event、内部交易和执行状态。 |
对 TriggerSmartContract 类型交易,不要只读取区块中的交易本体来判断业务结果;应继续查询 receipt。完整交易确认路径见 交易签名与广播——API 工作流。
| API | 说明 |
|---|---|
wallet/getblock | 按高度或区块 ID 获取区块 |
wallet/getblockbynum | 按高度获取区块 |
wallet/getnowblock | 获取最新区块 |
相关资源
Updated 26 days ago