博客
关于我
Substrate源码分析:启动流程
阅读量:705 次
发布时间:2019-03-17

本文共 2463 字,大约阅读时间需要 8 分钟。

substrate 节点启动流程解析

substrates 节点的启动流程主要涉及命令行参数解析、服务配置和节点运行。以下将详细介绍从命令行启动到节点运行的关键步骤。

命令行参数解析

substrates 节点启动的主要入口位于 substrate/node/main.rs,通过调用 cli::run 函数开始。该函数继承自 node/cli/src/lib.rs,其核心逻辑包含以下几个方面:

  • 命令解析:使用 clap库解析命令行参数,生成核心参数对象。
  • 参数转换:将解析的命令参数转换为应用程序所需的具体配置对象。
  • 配置处理:根据不同的参数类型(如运行模式、网络角色等),返回对应的配置指令。
  • 配置参数解析

    命令行参数的具体解析由 core/cli/src/lib.rs 中的 parse_and_prepare 函数完成。该函数定义了多种常见的节点运行模式,例如运行模式、构建配置、导出块等,并根据不同参数组合返回对应的配置指令。例如:

    • 运行模式(Run):解析运行所需的节点参数,准备启动全节点或轻节点服务。
    • 构建配置(BuildSpec):用于生成链规范文件。
    • 导出和导入块:处理块数据的存取操作。
    • 链的清理操作:用于重新初始化链状态。

    服务组件与运行库

    substrates 节点的核心功能由 service 组件实现,包含以下关键模块:

    共同服务构建

    服务的工厂类(Factory)通过宏 construct_service_factory 定义不同的服务类型:

    #[macro_exportmacro_rules! construct_service_factory {    (        FullService = $full_service:ty { $( $full_service_init:tt )* },        AuthoritySetup = { $( $authority_setup:tt )* },        LightService = $light_service:ty { $( $light_service_init:tt )* }    ) =>    (        fn new_light(config: $crate::FactoryFullConfiguration
    ) -> $crate::Result
    { ($( $light_service_init )* )(config) } fn new_full(config: $crate::FactoryFullConfiguration
    ) -> Result
    { let service = ($( $full_service_init )* )(config).and_then(|service| { ($( $authority_setup )*)(service) }); service } ... )]

    该宏定义了创建全节点或轻节点的工厂函数,分别初始化对应服务。

    服务运行与网络协议

    服务的运行基于 substrates-service 库,使用 tokio 实现异步编程:

    use tokio::executor::Executor;#[derive(Debug, Clone)]struct Service {    pub client: Client,    pub network: Network,    pub network_status_sinks: Vecrecv
    , ...}impl Service { pub async fn run
    ( &self, event_loop: T, ) -> result
    { // 其余实现细节 }}

    服务初始化后,会创建网络协议、交易池等基础设施,并监听网络事件。

    节点角色配置与运行

    根据节点的角色(全节点或轻节点),调用不同的服务工厂进行初始化:

    let config = create_run_node_config(self.params.left.clone(), spec_factory, self.impl_name, self.version)?;let service = service.run(config)?;run_service(exit, self.params.left, self.params.right, config)    .map_err(Into::into)

    运行服务闭包内部完成以下步骤:

  • 网络协议构建:根据配置创建网络协议。
  • 交易池初始化:构建交易池并绑定事件处理逻辑。
  • 节点运行:启动实际的substrates节点,开始处理交易和事件。
  • 异步运行机制

    substrates节点基于 tokio 异步执行框架,使用 futureAndHandle 执行服务。代码片段如下:

    runtime.executor().spawn(exit.until(informant).map(|_| ()));

    该代码绑定事件循环,定期轮询事件处理,确保服务能够响应网络消息和交易请求。

    总结

    substrates 节点启动流程主要包含命令行参数解析、服务工厂初始化和异步运行。通过清晰的配置管理和高效的运行机制,确保节点能够稳定运行并高效处理网络任务。

    转载地址:http://zmahz.baihongyu.com/

    你可能感兴趣的文章
    OpenERP ORM 对象方法列表
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>
    openEuler 正式开放:推动计算多样化时代的到来
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
    查看>>
    OpenFeign 入门与实战
    查看>>
    OpenFeign源码学习
    查看>>
    OpenFeign组件声明式服务调用
    查看>>
    openfeign远程调用不起作用解决_使用Spring Boot的spring.factories进行注入---SpringCloud Alibaba_若依微服务框架改造---工作笔记007
    查看>>
    openfire开发(四)消息拦截器
    查看>>
    openfire源码解读之将cache和session对象移入redis以提升性能
    查看>>
    Openfire身份认证绕过漏洞复现+利用(CVE-2023-32315)
    查看>>
    OpenForest 开源项目安装与使用指南
    查看>>
    OpenGL glBlendFunc() 设置颜色混合 透明度叠加计算
    查看>>
    opengl 深度详解,多重采样时,如何在OpenGL纹理中解析深度值?
    查看>>
    OpenGL 的内置矩阵种种
    查看>>
    OpenGL/OpenGL ES 入门:基础变换 - 初识向量/矩阵
    查看>>
    OpenGL中shader读取实现
    查看>>
    OpenGL中旋转平移缩放等变换的顺序对模型的影响
    查看>>
    Opengl中的gluProject函数认识
    查看>>