学习
实践
活动
专区
工具
TVP
写文章

Substrate源码分析:启动流程

我们在命令行启动 substrate 节点,到底发生了什么呢?本文基于 substrate 源码,对其启动流程进行了简单的分析。

命令行启动 substrate,主要是解析命令行参数并配置服务。

主程序在中,入口是函数。其中的关键代码如下:

这行代码调用的是的函数。进入该函数,有如下代码:

函数(位于中),这个函数类似于所有的区块链启动,主要是对命令行参数进行解析,并启动相关的操作。

在函数中,会根据不同的参数,返回不同类型的。

各种参数在中有相关的定义,部分代码如下:

而对于枚举类型,每一类结构体,均会实现各自的方法,解析参数生成配置,并根据配置运行服务。

以结构体为例,其函数的实现代码如下:

其实执行服务,具体是在函数的闭包函数中,代码如下:

首先使用库构建一个,

然后根据节点角色配置,分别传入全节点或轻节点服务,调用函数。

最后在函数中,调用启动线程,将由构建出的`绑定到上面定期轮询。代码如下:

代码中调用了的函数,创建了一个“线人”。

基本上到这儿,相关的命令就全启动了。我们看下生成全节点或轻节点服务的具体细节。

在声明宏的定义中,有如下代码:

在中,包含了service结合service中的对宏的调用,宏展开后,是执行的,代码如下:

服务组件service

在中定义了substrate的服务组件:和。它们函数的实现均调用了的函数,代码如下:

通过该函数创建,它会启动客户端,初始化,构建网络,交易池以及,并管理他们之间的通信,包括区块通知,交易通知等。关键代码如下:

这个有些类似于以太坊,在启动节点时把相关的网络服务都创建好。这样最后Ok返回整个。

PS:源码分析是基于master分支(substrate 2.0)。

1. 其中对命令行参数的解析,使用了第三方库,该库通过结构体来解析参数,并对库进行了补充。

2. 异步编程,使用了第三方库,该库使用Reactor-Executor模式,是基于事件驱动的非阻塞I/O库。是 Rust 中的异步编程框架,它将复杂的异步编程抽象为 Futures、Tasks 和 Executor,并提供了 Timers 等基础设施。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190814A0TD0W00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券