菜单

区块压缩

相关源文件

块压缩是 Fuel Core 中的一个子系统,负责压缩 L2 区块链块以实现数据可用性(DA)。这种压缩机制可减少块的存储和带宽要求,同时确保所有必要数据在需要时仍可检索。本页将解释压缩服务的工作原理、其架构以及其与 Fuel Core 其他部分的集成。

有关数据可用性层和中继机制的信息,请参阅数据可用性和中继器

目的与范围

块压缩子系统

  • 订阅 Fuel 区块链中产生的新块
  • 使用时间注册系统压缩块
  • 存储这些压缩块以实现高效数据可用性
  • 通过 GraphQL API 提供对压缩块的访问
  • 保持与主区块链高度的同步

系统架构

来源:crates/services/compression/src/service.rs86-101 crates/services/compression/src/ports/block_source.rs crates/services/compression/src/ports/compression_storage.rs

关键组件

压缩服务

The CompressionService 是负责接收块、压缩块并存储压缩数据的核心组件。它作为 Fuel Core 内的后台服务运行。

来源:crates/services/compression/src/service.rs86-121 crates/services/compression/src/service.rs44-82

块压缩流程

块压缩流程如下所示

  1. 该服务订阅来自 BlockSource 的新块流
  2. 当新块到达时,将调用 handle_new_block 函数
  3. 使用 compress 函数压缩块
  4. 压缩块存储在 CompressionStorage
  5. 同步状态更新以反映新的压缩块高度

来源:crates/services/compression/src/service.rs161-198 crates/services/compression/src/service.rs125-159

压缩存储

The CompressionStorage trait 定义了用于存储和检索压缩块的接口。它由支持压缩列的存储系统实现。

压缩块以其块高度作为键进行存储,从而实现按块高度的高效检索。

来源:crates/services/compression/src/ports/compression_storage.rs29-42 crates/services/compression/src/ports/compression_storage.rs

块源

The BlockSource trait 提供了从区块链获取块的抽象。

这使得压缩服务能够在块生成时接收它们,并检索历史块以进行同步。

来源:crates/services/compression/src/ports/block_source.rs72-77

配置

压缩服务使用 CompressionConfig 进行配置,其中包含:

  • temporal_registry_retention: 在时间注册表中保留数据的时间长度
  • metrics: 启用/禁用指标收集的标志

来源:crates/services/compression/src/config.rs1-36

同步流程

当压缩服务启动时,它首先通过压缩服务启动前生成的任何块来与区块链同步。

  1. 它获取区块链的规范高度
  2. 它获取存储中压缩块的最新高度
  3. 它压缩这些高度之间的所有块
  4. 一旦同步完成,它便开始监听新块

这确保了压缩存储始终包含直到当前区块链高度的所有块。

来源:crates/services/compression/src/service.rs224-262

与 Fuel Core 的集成

压缩服务通过适配器与 Fuel Core 集成

CompressionBlockImporterAdapter

该适配器实现了 BlockSource trait,用于将块从块导入器提供给压缩服务。

来源:crates/fuel-core/src/service/adapters/compression_adapters.rs32-47

CompressionServiceAdapter

该适配器提供对压缩数据库的访问

来源:crates/fuel-core/src/service/adapters/compression_adapters.rs90-102

错误处理

压缩服务定义了各种错误类型,以处理压缩过程中的故障

  • 存储错误(读/写故障)
  • 块检索错误
  • 配置错误
  • 压缩/解压缩错误
  • 同步错误

这些错误被封装在 CompressionError 枚举中,以便进行特定的错误处理和报告。

来源:crates/services/compression/src/errors.rs1-44

API 访问

通过 GraphQL API 可以使用 da_compressed_block(height) 查询来访问压缩块。此查询返回指定高度的压缩块数据,这些数据可以反序列化为 VersionedCompressedBlock

来自测试的用例示例

来源:tests/tests/da_compression.rs96-102

块解压缩

尽管本文档侧重于块压缩,但值得注意的是,块可以使用 decompress 函数进行解压缩,这需要:

  1. 一个压缩配置
  2. 一个解压缩上下文,可访问压缩存储以及执行前的链上数据库状态
  3. 要解压缩的压缩块

这使得在需要时能够从压缩版本重建完整的块。

来源:tests/tests/da_compression.rs107-123

指标与监控

压缩服务可选择性地收集有关压缩过程的指标

  • 压缩持续时间
  • 压缩块大小
  • 块高度

这些指标可用于监控压缩服务的性能和健康状况。

来源:crates/services/compression/src/service.rs176-188

结论

Fuel Core 中的块压缩系统提供了一种有效的方式来存储和传输区块链块,以实现数据可用性。通过压缩块并将其存储在专用数据库中,它减少了存储和带宽要求,同时确保所有数据在需要时仍可访问。该系统旨在与 Fuel Core 的其他部分无缝协作,自动与区块链同步并通过 GraphQL API 提供对压缩块的访问。