本文档描述了 fuel-core 使用的数据模型和存储架构。它涵盖了区块链数据如何通过多个数据库层、存储抽象和表结构进行组织、存储和访问。有关存储系统实现细节的信息,请参阅存储系统。有关历史状态访问功能,请参阅历史状态访问。
fuel-core 采用多数据库架构,其中不同类型的数据被隔离到专门的数据库中,每个数据库都针对其特定用例进行了优化。
数据库隔离
来源: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
系统通过以下方式创建数据库在特定高度的状态视图:
来源:crates/fuel-core/src/state/historical_rocksdb/view_at_height.rs40-85
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 版本与现有数据库文件之间的兼容性。版本不匹配会触发迁移或错误处理过程。