菜单

数据模型

相关源文件

本文档描述了 fuel-core 使用的数据模型和存储架构。它涵盖了区块链数据如何通过多个数据库层、存储抽象和表结构进行组织、存储和访问。有关存储系统实现细节的信息,请参阅存储系统。有关历史状态访问功能,请参阅历史状态访问

数据库架构

fuel-core 采用多数据库架构,其中不同类型的数据被隔离到专门的数据库中,每个数据库都针对其特定用例进行了优化。

数据库层级

数据库隔离

  • OnChain:存储区块链状态数据(区块、交易、币、合约)
  • OffChain:存储索引和查询优化数据
  • Relayer:存储跨链消息中继数据
  • GasPrice:存储燃气价格算法状态和历史记录
  • Compression:存储压缩的区块数据以实现数据可用性

来源:crates/fuel-core/src/combined_database.rs52-60

存储层抽象

存储系统采用分层方法,其中高级表抽象构建在键值存储原语之上。

来源:crates/fuel-core/src/state/generic_database.rs30-58 crates/storage/src/structured_storage.rs94-110

键值存储原语

数据类型

存储系统基于基本的键值原语构建

类型描述实现
存储键作为字节向量Vec<u8>
存储值作为共享字节切片Arc<[u8]>
KVItem键值对结果StorageResult<(Key, Value)>
KeyItem仅键结果StorageResult<Key>

来源:crates/storage/src/kv_store.rs15-23

存储操作

核心存储接口提供检查和修改功能,并支持批量操作。

来源:crates/storage/src/kv_store.rs40-91 crates/storage/src/kv_store.rs128-187

表结构和列族

数据库描述系统

每种数据库类型都实现了 DatabaseDescription,该特性定义了其结构

每个数据库描述都指定了其列族、高度跟踪和元数据存储要求。

来源:crates/fuel-core/src/database/database_description/on_chain.rs crates/fuel-core/src/database/database_description/off_chain.rs

表蓝图

表使用 TableWithBlueprint 特性定义,该特性将逻辑表连接到物理列存储

蓝图系统为每种表类型提供类型安全的编码/解码和高效的存储操作。

来源:crates/storage/src/structured_storage.rs82-91

事务系统

事务架构

事务在将更改原子地提交到底层存储之前,会在内存中累积这些更改。

来源:crates/storage/src/transactional.rs67-126

交易生命周期

阶段描述关键组件
创建根据策略初始化事务StorageTransaction::transaction()
累积在内存中收集更改Changes 映射,冲突检测
验证根据策略检查冲突ConflictPolicy::Fail/Overwrite
提交原子地应用更改Modifiable::commit_changes()

来源:crates/storage/src/transactional.rs299-308

历史状态管理

状态回溯系统

历史存储系统维护反向更改,以实现在任何区块高度进行状态查询。

来源:crates/fuel-core/src/state/historical_rocksdb.rs76-87 crates/fuel-core/src/state/historical_rocksdb.rs217-289

特定高度视图实现

系统通过以下方式创建数据库在特定高度的状态视图:

  1. 高度键构造:将原始键与高度信息结合
  2. 反向更改查找:查找目标高度之后的最近修改
  3. 回退到当前状态:如果未找到修改,则使用当前状态

来源:crates/fuel-core/src/state/historical_rocksdb/view_at_height.rs40-85

存储实现

RocksDB 实现

RocksDB 提供持久、高性能的存储,具有可配置的缓存、压缩和列族管理功能。

来源:crates/fuel-core/src/state/rocks_db.rs154-164 crates/fuel-core/src/state/rocks_db.rs313-353

内存实现

内存实现为每个列族使用独立的、受互斥锁保护的 BTreeMap 实例,通过细粒度锁定实现并发访问。

来源:crates/fuel-core/src/state/in_memory/memory_store.rs52-80

数据库元数据和版本控制

元数据表结构

每个数据库都维护有关其版本、高度和功能可用性的元数据

字段类型目的
版本u32数据库模式版本
高度Description::Height最新提交的高度
索引可用性BTreeSet<IndexationKind>可用索引功能

来源:crates/fuel-core/src/database/metadata.rs24-47

版本管理

数据库版本检查确保 fuel-core 版本与现有数据库文件之间的兼容性。版本不匹配会触发迁移或错误处理过程。

来源:crates/fuel-core/src/database/metadata.rs54-70