CESS 研发总监:我们为何为 Substrate 开发存储 Pallet
CESS 为 Substrate 开发的存储 pallet 已开发完成,使用 Substrate 开发项目的团队均可以在 CESS 主网上线后使用该 pallet 实现直接调用 CESS 的存储服务。让我们来共同回顾一下 CESS 研发总监 Swowk 当初对为何要开发存储 pallet 的思考。
1. 背景
作为一个多功能的区块链框架,Substrate 有多个模块(又名 pallet)供开发人员使用。从账户和资产等资源管理到随机数生成器和调度器等实用工具,这些现有的托盘可以满足大多数开发者应用场景的需求。但是,仍有改进的余地。
近期我们有一个在 Substrate 上实现一个数据存储服务的需求,但在检查了所有现有的 pallet 后,我们并未找到一个满足我们需求的 pallet。所以我们想开发一个定制 pallet 来解决这个问题。
我们不在这里讨论利基主义的东西,现实中应用程序在运行过程中会不断消耗和生成各种数据,无论是系统、用户还是临时数据,这是一个常见的场景。许多 DApp 有大量需要链下数据存储服务的场景,例如 NFT。选择的存储服务质量将直接影响整个应用程序的性能和可靠性。
因此,我们希望为 Substrate/Polkadot 社区提供专用于与当前 Substrate API 兼容的存储服务的 pallet,开发人员只需添加少量代码更改即可利用 CESS 稳定和安全的数据存储。我们相信这将进一步提升使用 Substrate 时的开发体验并丰富 Polkadot 生态系统。
2. 当前方案的缺陷
现有的 Substrate FRAME 中只有一个与数据存储相关的 pallet,即 Transaction Storage Pallet。它支持与 Substrate 并行运行 IPFS 节点,并允许 IPFS 在将数据放入 Substrate 存储后对其进行检索。但是,由于其固有的特性和以下几个方面的缺陷,其应用范围受到很大限制:
- 数据需要上传到区块链网络。虽然这些数据实际上并没有存储在链上,但它们仍然会产生额外的 Gas 成本和拥塞,不适合大文件存储;
- 所有验证者节点都需要为自己建立 IPFS 服务,受到很多限制;
- 开发难度大,基于 Substrate 的代码需要大量修改;
- 该 pallet 只支持 Substrate 端的文件上传,查看者需要通过 IPFS 客户端检索它。
3. CESS 的新方案
我们设计并实现了基于 Substrate 的数据存储服务。一方面,验证者节点不需要启动额外的服务,也不需要对基于基板的代码进行重大修改。因此,无论是新建链还是现有链,开发者都可以轻松集成我们的存储服务。
另一方面,通过自定义存储 REST 组件,用户可以方便地上传和下载数据,而无需安装额外的客户端程序。
4. 设计架构
我们的提案架构如下图所示,由 Data Storage Pallet 和定制的 Storage Sidecar 组成,该框架是受到了Substrate API Sidecar(https://github.com/paritytech/substrate-api-sidecar)的启发。
数据存储 pallet:实现存储数据的记录和管理。该pallet实现与元数据相关的功能,例如根数据管理、数据所有者管理和关于存储数据的数据分类。
定制存储 Sidecar:提供 RESTful 服务与Data Storage Pallet交互。与 Substrate API Sidecar 不同的是,Storage Sidecar 除了与基于Substrate的区块链交互的基本功能外,还封装了与存储相关的 API,包括数据存储和数据检索。用户传输的数据最终会通过该接口存储在 CESS 存储系统中。
5. 核心功能
数据存储
- 用户调用定制存储Sidecar的数据存储API上传数据文件;
- 调用封装好的CESS API,将数据转发给CESS;
- 一旦确认数据已经写入,定制存储Sidecar 将调用Extrinsic 记录链上数据文件的相关信息;
- CESS存储系统在其整个生命周期内维护数据的完整性和隐私性。
数据检索
- 用户调用定制存储 Sidecar 的存储 API 获取目标数据;
- 利用定制 Storage Sidecar,查询链上数据路由信息;
- 使用路由信息调用 CESS 数据检索 API;
- 从 CESS 存储系统中检索并返回目标数据;
- 将目标数据返回到定制的 Storage Sidecar;
- 定制的 Storage Sidecar 必要时更新链上信息;
- 将目标数据返回给用户。
6. 使用方法
事实上,开发者只需两步就可以体验 CESS 存储服务。
- Step 1 将 Data Store Pallet 集成至 FRAME
在文本编辑器中从您的代码中打开 runtime/Cargo.toml 配置文件;
通过将 crate 添加到依赖项列表中,导入 pallet-data-storecrate 以使其可用于运行时;
pallet-data-store = { default-features = false, git = "https://github.com/paritytech/substrate.git", branch = "main" }
将以下代码添加进 features 模块,可以通过将 pallet-data-store crate 加入 features 列表从而使其包含进 std feature;
[features]
default = ['std']
std = [
...
'pallet-aura/std',
'pallet-balances/std',
# Add this line
"pallet-data-store/std",
...
]在文本编辑器中打开 runtime/src/lib.rs 文件;
在 Balances 代码的最后一行之后,为 Data Store pallet 添加以下代码:
parameter_types! {
pub const StringLimit: u32 = 1024;
}
/// Configure the pallet-data-store.
impl pallet_data_store::Config for Runtime {
type Event = Event;
type StringLimit = StringLimit;
type WeightInfo = pallet_data_store::weights::DataStoreWeight<Runtime>;
}将 Data Store 添加到 construct_runtime! 宏
// Create the runtime by composing the FRAME pallets that were previously configured.
通过运行以下命令以发布模式编译节点
cargo build --release
- Step 2 使用定制 Storage Sidecar 存储数据
当 Runtime FRAME 集成完成后,您现在可以通过我们的 Data Store Sidecar(https://github.com/CESSProject/data-store-sidecar)与您的区块链网络进行交互并同时使用 CESS 存储服务。以下是在 Sidecar 中使用 CESS 存储功能的教程:
首先,请根据此链接(https://github.com/CESSProject/data-store-sidecar#source-code-installation-and-usage)的内容完成安装和启动。
当然,我们也支持使用 Docker 进行快速部署(https://github.com/CESSProject/data-store-sidecar#docker)。
服务启动成功后,就可以直接调用了。有关用户指南,请参阅 API 文档(https://example-datastore.cess.cloud/docs/)。