grandpa模块剖析

简介

之前已经翻译了部分Byzantine Finality Gadgets,可以看我之前发布的[拜占庭终结工具](# https://munan.tech/2019/09/30/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E7%BB%88%E7%BB%93%E5%B7%A5%E5%85%B7/#more )。

相关模块

在Substrate中,关于终结块机制的模块主要有:core/finality-grandpasrml/grandpasrml/finality-tracker。其中,srml/grandpa管理了GRANDPA的authority集合,srml/finality-tracker跟踪块生产者能感知到的最后终结块,core/finality-grandpa是GRANDPA的核心代码部分。

关键函数

初始时,默认GRANDPA的authority为验证节点集合。在本文中,仅讨论验证节点上的GRANDPA运行流程。

GRANDPA的核心运行函数是core/finality-grandpa/src/lib.rs中的run_grandpa_voter,以Substrate上的node为例,介绍该函数的调用过程:

run_grandpa_voter

注意,在当前版本e84f6158b383880ba5fc86cb62c9fea10f5f3071中,服务的future统一在service中去执行。使用service.spawn_essential_task或者service.spawn_task将服务的future发送到通道to_spawn_tx中,然后在service中的poll()中,循环用to_spawn_rx接收所有服务的future,并用tokio_executor执行任务,直到退出。

运行run_grandpa_voter前,必要的需要实现block_import和得到LinkHalf,这两个在宏new_full_start完成。

run_grandpa_voter中,先建立了NetworkBridge,返回服务句柄和一个future——network_startupnetwork_startuptokio_executor注册了3个任务:rebroadcast、announce和reporting。接着为finality_tracker模块注册了inherent_data_providers,并且读取client.backend().blockchain().info().finalized_num存入Inherent_data。然后如果之前建立的telemetry_on_connect不为空,就建立一个telemetry_task的future,之后会检查一次,确保不会因为该任务的意外中断而导致grandpa停止,因为最后有voter_work.select2(telemetry_task)

然后用VoterWork::new()建立一个voter_work的future,并且检查是否建立成功。将其与之前建立的network_startup组合起来。

本文标题:grandpa模块剖析

文章作者:木南

发布时间:2019年10月16日 - 17:10

最后更新:2019年10月21日 - 11:10

原始链接:http://munan.tech/2019/10/16/grandpa模块剖析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

点击下方打赏按钮,获得支付宝二维码