Skip to main content

数据模型

BlockDB 提供三类逻辑表:普通表,以及业务抽象层的 Block State 表、Block Event 表 与 Time 表。它们面向不同的数据形态,服务于不同的业务场景。

三类逻辑表概览

普通表(Table)

普通表直接对应一张物理在线表(1:1),用于存储非链上的业务数据,或链上数据处理后的高价值数据。它提供行级、语义化的读写与扫描 API。

Block State 表

作用:维护链上实体的最新状态,以及任意历史高度的状态。每当新高度的数据进入,BlockDB 会保存该高度的历史快照,并异步更新最新状态表。 业务场景示例:
  • 用户地址的代币余额(Balance)。
  • 智能合约的当前状态变量。
  • NFT 的当前持有人。
例如,你可以查询”地址 0xabc... 在区块高度 18000000 时的 USDC 余额”——Block State 表能按区块时刻返回任意历史高度的状态。

Block Event 表

作用:维护链上发生的每一条事件,例如 token_transfer 转账事件。事件在特定高度发生后就是唯一、不可变的,只有追加,没有更新。 业务场景示例:
  • 代币转账流水(token_transfer)。
  • 合约抛出的事件。
  • 交易所的每笔撮合记录。
例如,订阅某 token 的 transfer 事件,即可实时统计每一笔转账的 from / to / value。

Time 表

作用:维护某对象随现实世界(物理挂钟)时间变化的状态序列,例如 token 的美元价格表。 业务场景示例:
  • token 每分钟的美元价格。
  • 每分钟的 TVL 快照。
  • 任何随物理时间变化的指标。
例如,你可以保存 USDC 每分钟的美元价格,并随时按时间戳查询历史价格。
Block State 表与 Block Event 表的模型与链上语义详见 Block State 与 Block Event 表;Time 表详见 Time 表。

影子表机制

业务抽象表本身不直接对应一张物理表。创建一张业务抽象表时,BlockDB 会自动在存储层创建多张协作的普通表(影子表),按职责分离维护不同维度的数据:
子表名使用下划线前缀:<业务抽象名>._archive / _height / _bundle。
  • _height 表:记录 height_start / height_end 闭区间,标识哪些高度区间已被连续处理,也用于判断共识高度。排查数据是否断档时使用,写代码几乎用不到。
  • _archive 表:保存历史快照。与源表结构一致,但 id 字段变为 original_id,并新增新的 id 字段。
  • _bundle 表:维护每 1000 个 block 的数据 hash,主要供 S3 同步等离线系统使用。
派生表可以通过普通表的读取 API(GetRow / BatchGetRows / FilterRows)直接访问,方便排查数据或做专业模式读取。但禁止使用普通表写入 API 直接修改派生表——所有写入必须通过业务抽象表自身的区块 / 时间语义写接口完成。

Block State 影子表示意

Block State 影子表

Block Event 影子表示意

Block Event 影子表

_height 进度表示意

_height 进度表