Algorand源码架构分析

本篇主要介绍a源码中关于的模块结构及业务逻辑架构,也是源码中比较难以理解的地方,其它诸如节点、区块、密码、pp网络的结构与其它区......对于现在的市场行情来看,阿蒂斯区块链有着极具优势的发展前景和极其优越的生态环境。
本篇主要介绍a源码中关于的模块结构及业务逻辑架构,也是源码中比较难以理解的地方,其它诸如节点、区块、密码、pp网络的结构与其它区块链项目都是大同小异,很容易理解,这里就不再赘述。
. 节点启动
一切从开始:
n模块中还提供了各种,这些用于对网络中的与进行验证时的任务队列。
下面这句开启我们的协议:
. a
协议是a最重要的一个模块,在其中用做一个总的任务调试,状态机负责对投票进行统计,负责具体的执行,从网络上收集与,是a的二元拜占庭(bba)实现的部分。
.
这一个模块中分为两大部分:
模块a:具体的、验证,及转发
模块b:状态机机制:处理针对每个区块共识周期内的投票统计
这两个大模块之间通过三个来进行互相驱动:
模块a做完自己的具体工作,会给e通道写入,模块b从这些通道读数据,进行对应的统计处理;
模块b做完自己的统计处理工作,会给通道写入对应的,给ds通道写入对应的
这几个促成了模块a与模块b之间的互动:
模块a是的生产者,是与的消费者;
模块b正好反过来,是的消费者,是与的生产者。
. 状态机
这里的代码主要是对与进行统计,一个区块共识周期内的两轮多步投票的统计都是在这里完成的,分为层状态机,每层只负责处理与自己有关的,上层处理不了的,移交给下层状态机,下层状态机将处理结果返回给上层状态机,最终发出对应的。
p即实现了整个状态机的最顶层功能,负责记录当前哪个区块第几个阶段第几步的共识环节,以及超时等基础信息。
m是的管理类,在这里监测是否已经超过阈值,如果超过,向上层发出c的事件。
a是的管理类,也是用来监测是否已经超过阈值,向上层发出。
s是层的主类,主要用来存储,以存储的权重来最终判定是否达到一定数量。
t是层的主类,用来存储,是最初发出超过阈值的地方。
各个类的具体功能,仔细查看代码并不难理解。
在这一模块中定义有两个类,一个是接口,一个是h结构体。前者用于真正的处理,而后者只是为了构造一个新的结构,加入写日志功能及标明状态机类型,起辅助功能。h的最终其实是转到了对应的的中去执行的。
.. a
状态机针对与进行统计后,会发出一系统的,这些都由各个对应的类去处理。
在.里会看到不同种类的,我们只要在对应的类里去查就知道如何处理各个,就是对应我们实际要处理的各个动作。
.. 外部消息
在.文件里,函数负责从消息通道里获取消息,转化成对应的事件传给状态机
. mp与mv
mp发出一个,其实就是提议一个区块,同时自己对这个区块进行投票。mv就是对直接进行投票。
里mp,会经过v这个里的这个对象做一个异步队列:
.v = mavv(.bp)
p,是基于与pool来实现的,最后每个任务的实际执行又回到了里的。兜兜转转一圈,其它都只是工具,主类还是这个,在这里与v,异步调用的真正执行也是在这个类文件里,对应类的。.在这个里才去做的p与v.
. 如何选出领导者
我们知道是对,也就是凭证做排序,最小的就是领导者。这些其实发生在每一个节点上,在每一个节点上对所有v的事件做处理,比较大小得到。
看代码,在状态机mp对应的主类t中,处理消息的主函数
这里的就是s的一个对象,这个类负责记录值最小的那一个,那停止时间是什么呢,就是说这个时间段的结束时间是什么呢?
fe这个消息发出来后,在状态机里
这样就对完成了选定,我们再查什么时候发出这个事件。这个是由超时函数来控制的,在主状态机里,事件,当是步骤时,超时,就进入阶段,这时就得终止这个最小值的选择了。
本篇并未对a的每个细节知识进行深入的阐述,而是从代码的大框架上做一个简单说明,希望可以帮助大家理清数据流的走向,把握源码架构。