目录

一、运行时是什么?

二、为何选 FRAME 和 Pallet?

三、创建自定义 Pallet 步骤

1. 新增 pallet 目录

2. 编写 Pallet 结构

四、集成 Pallet 至 Runtime

五、构建、测试与链上升级

1. 编译运行

2. 单元测试

3. 链上运行时升级

六、性能优化与工程实用建议

七、实战示例方向

八、总结


Substrate 是 Parity 提供的一整套区块链开发框架,采用 Rust 语言构建,提供高度模块化的运行时架构,适用于快速搭建定制化链,包括主网、平行链和私链场景。本文将系统剖析 Substrate 的运行时内核,从搭建模板、编写自定义 Pallet、集成到 runtime,到运行链上升级、测试和调优,为中高级开发者提供全面指导。


一、运行时是什么?

在 Substrate 中,运行时(Runtime)是区块链“状态转移函数”(STF)实现的集合,负责编译所有交易规则、模块和存储逻辑。相比传统链上智能合约,运行时的性能更高、功能更丰富,被加载为 Wasm blob 或本地 Native,直接部署在节点层。

常用 substrate-node-template 模板启动运行时开发,模板结构典型如下:

/node-template/
 ├── runtime/       # 运行时代码
 │    ├── Cargo.toml
 │    └── src/lib.rs
 ├── pallets/       # 自定义 Pallet (可选)
 └── node/          # 共识、RPC、网络等节点逻辑

二、为何选 FRAME 和 Pallet?

Substrate 的核心设计思路是模块化构建。FRAME(Framework for Runtime Aggregation of Modularized Entities)提供通用组件,包括 frame-systempallet-balancespallet-identity 等。开发者可复用或按需自定义 Pallet,也可利用 lifecycle hooks 实现复杂业务。这种设计:

  • 灵活性强:快速组合功能模块;

  • 扩展性优:支持自定义逻辑;

  • 维护成本低:模块之间依赖清晰,升级与封装更安全。


三、创建自定义 Pallet 步骤

pallet-template 为例,说明如何自定义业务模块并集成到 runtime。

1. 新增 pallet 目录

/pallets/my_pallet/
 ├── Cargo.toml
 └── src/lib.rs

新建 pallet 后,需在 node-template/runtime/Cargo.toml 添加依赖并在 src/lib.rs 中进行 construct_runtime! 注册。

2. 编写 Pallet 结构

lib.rs 中可使用宏简化定义:

#[frame_support::pallet]
:contentReference[oaicite:12]{index=12}
    #[pallet::config]
    :contentReference[oaicite:13]{index=13}
    :contentReference[oaicite:14]{index=14}
    :contentReference[oaicite:15]{index=15}
    :contentReference[oaicite:16]{index=16}
        :contentReference[oaicite:17]{index=17}
        :contentReference[oaicite:18]{index=18}
            ensure_root(origin)?;
            :contentReference[oaicite:19]{index=19}
            :contentReference[oaicite:20]{index=20}
            Ok(())
        }
    }
}

关键组件:Config 特征、存储项、事件与可调用函数。


四、集成 Pallet 至 Runtime

runtime/src/lib.rs 中,加入以下配置:

impl pallet_my_pallet::Config for Runtime {
    type Event = Event;
}

construct_runtime!(
    pub enum Runtime where
        Block = Block,
        NodeBlock = opaque::Block,
        ...
    {
        System: frame_system,
        Balances: pallet_balances,
        MyPallet: pallet_my_pallet,
        // 更多 Pallet ...
    }
);

重新编译后运行节点,即可调用自定义 Pallet 中的交易。


五、构建、测试与链上升级

1. 编译运行

cd node-template
cargo build --release
./target/release/node-template purge-chain --dev
./target/release/node-template --dev

2. 单元测试

在 pallet 模块内执行测试:

cargo test -p pallet-my-pallet

可模拟链上状态,验证业务逻辑准确性。

3. 链上运行时升级

开发完成后,可通过治理提案或 sudo 提交 runtime wasm 版本,完成链上热升级。


六、性能优化与工程实用建议

  1. Pallet 重用策略:优先尝试官方 Pallet,减少重复造轮子;

  2. Benchmark 权重配置:通过 FRAME benchmarking 工具自动生成权重参数;

  3. Offchain Worker 集成:执行链下数据拉取、价格预言机等任务;

  4. 离线工具辅助:SubAlfred、Subwasm 等工具协助 runtime 编译、链上测试。


七、实战示例方向

  • 代币发行与多签托管:集成 pallet-balancespallet-multisig

  • 链内治理系统:borrow pallet-democracypallet-collective

  • 跨链集成:使用 XCM 模块实现跨链资产转移;

  • 定制 NFT 模块:使用 pallet-uniques 或自定义实现。


八、总结

Substrate 的运行时框架使开发者无需关注底层共识和网络,只需关注编写业务逻辑。通过 FRAME 模块化设计、自定义 Pallet、治理升级与性能调优,可以快速构建并部署专属链。推荐从模板逐步扩展,结合 offchain、benchmark、治理与 XCM 等内容逐步深入,最终实现高性能可扩展链路。

Logo

一站式 AI 云服务平台

更多推荐