blockdb的业务抽象表介绍
| 层 | 别名 | SDK 类 | 职责 |
|---|---|---|---|
| 普通表 | 存储层 | Table | 普通在线表,高吞吐读写。既存非链上业务数据,也作为业务抽象表的物理存储底座。 |
| 业务抽象表 | 业务抽象层 | BlockTable / TimeTable | 提供业务数据生产场景的高级语义API,提供共识高度等高级功能。本身不存数据。 |
1.3 影子表机制(业务抽象表 → 普通表 自动映射)
建一张业务抽象表时,BlockDB 自动在存储层创建多张协作的普通表:| 业务抽象 类型 | 普通表 映射 | 例子 |
|---|---|---|
| Block State 表(state,随高度更新、保留历史快照) | - 主表(最新值) - _archive(历史高度值,主键(id))- _height(处理进度/共识高度)- _bundle(数据区间的hash表) | ![]() |
| Block Event 表(event,发生即不可变、只追加) **不维护 ** _archive | - 主表(原始事件)、 - _height。- _bundle(数据区间的hash表) | ![]() |
| TimeTable (自动按时间分桶) | - 主表(latest) - _archive(历史,复合主键 (id,time_at)) |
子表名是下划线前缀:<业务抽象_name>._archive/<业务抽象_name>._height。
- _height表:id, block_height_start, block_height_end。每行是一个连续区块区间。可以看这个表排查处理过的区块范围,包括最新高度。排查问题使用,写代码几乎用不到

- _archive表:和源表一样,只是源表id字段变original_id,新增新的id字段
- **_bundle表:**维护了每1000个block的数据hash和,主要给S3同步系统(未来可能有别的数据对比功能基于它)
1.4 BlockTable —— 区块维度
按区块高度变化。读取自动注入height <= 目标高度,保证不穿越共识。
-
get_event/get_state:以 block 为锚点(None=最新)查事件 / 状态快照。**必须传 **current_block -
Block={id, height, timestamp},是 业务抽象 对外数据单位。 -
get_block_rows(block):取某高度整块所有行。 -
upsert_block(block, rows):按区块原子写入。 -
upsert_block_bundle(bundle, rows):按bundle(int64高度区间标识,即1000个block)原子写入一批行,不携带单个Block元信息。如果rows里只有一个block,也认为1000个block全部推进
get_event / get_state 必须传 current_block
- 关键:高度要达到共识。
current_block.height必须 ≤ 表的共识高度(=_height表从 0 起连续覆盖到的最高高度)
1.5 TimeTable —— 物理时间维度
和 BlockTable 并列的另一种 业务抽象 模型:- BlockTable 描述区块维度(某高度的状态 / 事件)
-
TimeTable 描述某对象随物理时间变化的状态序列。表结构固定
{id, time_at, value}。
| BlockTable | TimeTable | |
|---|---|---|
| 维度 | 区块高度 | 物理时间(60s 桶,时间久的自动压缩可能更长) |
| 锚点 | current_block | time_at |
| 读语义 | 取 height ≤ 锚点的最新 | 取 time_at ≤ 锚点的最近已记录桶 |
-
分桶:时间桶
time_at固定 60s,写「向后取整、秒归零」对齐(17:04:35→17:05:00),同一对象 60s 内只存 1 个点。 - 自动压缩、控制数据分布:越久远的数据记录越稀疏,相邻两点数值变化不大时不重复记录——所以写入前不用自己去重,也不用担心数据膨胀。
- 读取的点可能是稀疏的:读某时刻返回的是「≤ 该时刻、最近一个已记录桶」的值,越久远越稀疏(具体稀疏 / 压缩规则见 TimeTable 手册)。
token_time_demo 表为例(存某 token 每分钟的价格):

