Flow公链技术介绍

本文由Flow技术大使FOU翻译。

原文标题:Introduction to Flow blockchain

原文链接:https://jan-bernatik.medium.com/introduction-to-flow-blockchain-7532977c8af8

 

自我介绍

Hi!我们是developer engine社区,社群由浙大计算机学员博士带领组成,成员都是些有能力且专注于web3的爱好者,其中不乏浙大及其他高校硕士博士还有有着丰富项目经验、资源的web3从业者。我们的目的是致力于打通web2.0和web3.0的桥梁,帮助对区块链技术以及对web3充满憧憬的你无论是传统web2程序员或是区块链技术研究爱好者给予踏入web3的机会!

这是给那些有兴趣了解区块链技术的朋友准备的,欢迎来到Web3!

 

Flow介绍

在Dapper Labs开发Crypto Kitties的时候,我们从中学到了很多。最重要的是,我们意识到那个时间点的技术还没有为这类的应用准备好。为了长远的发展,我们决定为我们接下来的计划打造更好的技术,也就是现在的Flow区块链。

 

区块链架构最大的困难之一是如何在最少的时间内处理最多的交易,也就是吞吐量。多数区块链会尝试提升运行网络中的单一节点的效率。Flow提出一种新颖的,从根本上提升吞吐量的方案,把传统上矿工做的工作分解成不同的角色,使得交易的选择和排序与执行脱离开来。

 

节点类型&数据流

Flow链有多种不同的主体称为节点,这些节点为Flow协议的运转工作,也是协议网络的一部分。下面是对5种节点类型的概括介绍。

 

■ Access Node入口节点

Access Node为外部客户端提供访问最新区块的入口,并且把交易从客户端发到收集节点群。Access Node会决定把这笔交易发往哪个收集节点群。

 

 Collection Node收集节点

收集节点会组成一个个的收集节点群(Collection Cluster)。在一个群里的收集节点会一起把交易整理到一个集合(collection)里。一个收集节点群会决定把哪组交易以集合保证(Collection Guarantee)的格式发到网络。集合保证(Collection Guarantee)会被用来获取有关这个交易集合及相关交易的完整信息。

 

■  Consensus Node共识节点

共识节点会依照收集节点发来的交易集合信息来组织和提议区块。

 

■  Execution Node执行节点

执行节点会执行交易,并且依照交易更新数据(比如一笔转款交易会改变余额)。执行节点会把执行收据(Execution Recipt)发到网络中。一个执行收据(Execution Recipt)包含一个执行结果,也就是当实行完成那一刻的数据的哈希值。

 

■  Verification Node验证节点

验证节点会对执行节点的工作的准确度进行评估。验证节点会把结果许可(Result Approval)发到网络中。结果许可会与共识节点的执行结果进行比对来检测执行的正确性。

 

下面这个是数据在网络中如何流动的高度概括:

 

共识委员会使用的是HotStuff共识协议来为提议的区块达成共识。更详细的协议介绍可以参看这里:HotStuff协议白皮书(https://arxiv.org/abs/1803.05069)

 

你也许会想问,为什么要有这么多种节点类型? 让我来解释下。我们的目标是打造一个不仅性能优秀且易于开发的区块链,不同于Layer2或者分片这种以提高开发难度为代价的解决方案。我们采用的方案是把传统一个区块链节点的角色分成多个角色,这给予了我们扩大网络的灵活度。我们分成了不同的角色,交易的选择和排序,执行交易,区块打包和交易执行验证。这使得我们得以打造一个,不牺牲安全的,分布式的,同时还把多数的计算量集中到很少的高效节点的网络。

 

让我们再近距离的看一下这些实现了高效网络的数据和角色。

 

整个系统的交易吞吐量取决于共识算法的效率,也就是由共识节点运行的,四个主要节点类型之一。我们经常把共识节点称为共识委员会。在收集节点把用户发来的交易整理成集合之后,收集节点会把交易集合发到共识委员会。委员会中的节点必须快速的对区块中的交易集合的顺序达成共识。就像你能想象的,这项操作的速度非常受区块大小的影响,因为区块需要发到共识委员会中的所有节点。Flow协议通过不包含区块中交易的具体内容来实现高效率。取而代之的,区块只会包含收集节点对其能被网络接入的许可,称为集合保证(Collection Guarantee),简单说来,也就是一个集合的验证标签。集合保证由共识首领添加到区块中。因为他们只是简单的验证标签,而不是较大的交易,节点可以更快的处理和对其排序。

 

区块在被共识首领批准之后,它接下来就能交由执行节点处理了。执行节点会监听p2p网络中的活动并找到新的由共识委员会提交的要被处理的区块。一个执行节点会用区块中的集合保证去向收集节点索要集合中的内容从而处理其中的交易。区块的执行需要按次序进行来保证最终结果的正确性(改变交易的顺序会带来不同的结果,并行的交易处理会带来其他的挑战,本篇文章就先不提及)。因此,处理的速度对交易的吞吐量也是非常重要的。执行节点需要数据中心级别且具备非常强大的运算能力和内存。

 

当区块被执行之后,每个执行节点会发布一个交易结果,交易结果需要由验证节点验证从而确保执行是正确的。验证的意思是,执行交易并将结果与执行节点发布的结果对比。与区块执行不同,区块的验证可以并行进行,因为每笔交易的执行结果都可以独立的被验证。这也就是说验证的扩大规模是容易实现的(多个验证节点验证同步的验证不同的交易)。验证进程的同步进行是通过把一个区块分成若干小块实现的。一个验证节点会从一个区块中包含的执行结果确定小块的任务,并向执行节点索要小块的数据包。验证节点会把结果的许可发到网络***识节点会用结果的许可验证区块的执行并最终封装这个区块(我们会在接下来的文章中详细讨论这个流程)。

在2022年Flow协议的实现中,小块(chunks)和集合(collection)是一一对应的关系。集合是将来被处理的,小块是已经被处理过的。

 

希望你现在对数据流已经有了个大概的了解。在接下来的文章中,我们会更详细的探讨区块的具体的每个阶段,交易的声明周期还有数据存储。在那之前,我们会过一遍协议的时间点(Timing),我认为这对了解其他概念也会很有帮助。

 


协议时间点(Protocol Timing)

为了真正理解协议是如何运行的,我们需要理解协议中的不同组件的时间点。

 

有一些情况是能够按严格的时间表可预计的发生的(确定的,同步的),但也有一些情况是通过事件触发的并且他们的时间点是不能预知的(不确定的,异步的)

 

协议中的不确定的异步的部分是执行和验证,因为集合中的交易对计算量的要求不同。

 

协议中的确定的同步的部分是收集和区块创建,因为他们是按View的时间表创建的。

简言之,View指的是某一个共识节点被预先设定成首领(Leader,该节点通常被称为primary主要节点)的一段时间。

 

注意在实际情况中,一个共识节点会决定一个View的长度,因为它要尽力和其他节点保持同步-我们不能指望在去中心化的网络中使用中心化的时间服务端,因此节点会用一种叫做“速度制造者(pacemaker)”的算法来保持同步。

在这段View时间中的共识首领会创建包含从上过一个区块起创建后开始累计的异步事件的区块。

 

 

现在我们了解了网络中流通的数据是如何做成一个区块的,我们现在可以开始了解一个区块是如何被构建的,并且共识委员会是依据什么判断这个区块是否被接受的。

 

区块创建

我们首先解释下法定人群证书(QC,Quorum Certificate) 是什么,以及它在这个进程中扮演什么样的角色。

 

法定人群证书QC是一个被提议区块获得足够共识节点的足够的“投票权利”(权重)的证明-他们同意认可这个区块是有效的,并应该被加到链中。

 

看一下下面的这个表格-这些是一些规则,能帮助我们更好的理解发生了什么:

1. 在每一个View里都有一个预先指定的共识节点作为共识首领

2.区块总是由共识首领提议的

3.共识首领只能提议基于拥有QC证书的母区块的区块。

 

我们一起来过一下上面这个图:

1.共识首领A把它收集到的信息(在它的“内存池mempool”累计的信息)并提议区块0(B0)。

2.共识节点收到B0,验证这是否是个有效的区块,并且把他们的投票发给下一个View时间段的共识首领。提议区块的验证过程是一个复杂的话题,将不会在本文中讨论,但大概来说是包括:

随着在这一进程在一个又一个的View中重复,区块链得以增长,每一个区块中的交易得以被执行,用户账户中的不同资产(代币,NFTs)得到更新。

 


区块链分叉

我们需要了解为什么区块链会分叉,以及区块链是如何分叉的,从而更好的理解为什么区块链的最终确定是很重要的。

 

Flow协议区块链会在3种情况下分叉:

1)共识首领没有收到最新的区块

 

 

 

2)共识首领没收到足够权重的投票来创建法定人群证书(Quorum Certificate,QC)。仍像上面这个图表提到的,但不是没有收到B2a区块,共识首领D没有收到足够的投票去为B2a区块创建QC。在这种情况下,共识首领D会提议一个,基于上一次有发送QC到链上的区块,的区块。

 

3)可疑的共识首领创建了一个父区块不是最新的区块的区块。这个可疑的节点做出这种举动可能是出于多个原因,比如他想把他不想执行的交易排除在外。

现在我们了解了区块链分叉,接下来我们来看一下区块的最终确认。

 

 

区块最终确认

区块的最终确认在建造Flow区块链的时候是非常重要的一个概念 -它意味着共识节点认可了这个区块并且区块获得了保留在链上的保证。

 

对于发送了一笔被包含在确认后的区块的交易的用户来说,这也是一个保证,保证这笔交易被区块链确认并且会被执行。

 

区块的最终确认对参与网络的节点也很重要,因为当一个区块被最终确认之后,节点就可以扔掉任何不包含最终确认的区块的分叉。

 

 

我们终于会来研究一下区块的封装,也就是区块整个生命周期的最后一步。在我们正式讨论区块封装之前,我们需要先来解释一下Flow里存储机制,因为这对理解区块封装擅长做什么以及为什么它很重要是很关键的。

 

Flow上的数据存储

Flow网络有两个用来存储数据的地方。

 

协议状态(Protocol State),就是主要的区块链它本身,用来存储有关网络状态的数据,比如谁被允许加入协议,收集证明,执行收据,结果批准等等。

 

执行状态(Execution State)是一种叫做Memory-trie(MTrie)的数据结构,包含所有由Cadence智能合约操纵的数据(账户的代币余额,NFTs,已部署的智能合约等等)。每当一个集合被执行的时候,一个更新了的MTrie也会被生成。MTrie数据的新状态是以单一的哈希(root-nood hash)指代。这个哈希是,执行节点许可了的并由共识首领加入到区块中的从而能被验证的执行结果。

 

Flow本身并不存储信息,也就是说,账户的信息并不是存在链上,而是存在执行状态里。

 

 

区块的封装

 

区块的封装是区块生命周期的最后一步。对于提交一笔交易的用户来说,区块的封装是一个执行结果(交易后的账户状态)已经被成功验证的保证,注意一个包含封装的区块在被认为发布到链上之前仍需要被最终确认。

 

 

 

封装的区块是当已执行的区块已经收集到足够的结果许可后被加入到链中。

让我们一起看一下这最后一个图例。

 

1.在View1阶段,共识首领A提议把 区块0(B0)加到网络中。

 

2.共识节点收到并执行B0,并把执行收据发到网络中。

 

3.理想情况下,共识首领C收到执行收据要把B0的执行结果加到区块2(B2)中去。也就是说,共识首领C会把执行结果合并到B2中,高效的把B0的执行结果(MTrie根哈希)添加到区块链里。

 

4.当区块3(B3)由共识首领D提出的时候,验证节点可以使用B3中添加的随机源来决定他们的任务块。然后验证节点会从收集节点索要任务块中的交易并开始验证他们分配的任务块。注意,验证节点会一直等到B3被最终确认,这是为了避免一些比如区块链分叉B3所在的那个分支被舍弃这样的非必要的工作。

 

5.验证节点完成他们分配的任务块的验证后,验证节点会把结果许可发到网络中。假设共识首领H收到了足够的在View8中的结果许可,它就会为B0创建一个封装并加到区块7(B7)中。

 

6.当B7在区块10(B10)中最终完成时,区块B0会被封装,且封装会被完成。

到这里,提交这笔被加进了区块B0集合的交易的用户可以确定他的交易已经被执行并且交易的结果已经被发布到了链上。

 

 

 

简而言之,这也就是说这个交易的结果不会再改变了。如果你正在把你汽车的所有权转给一个新主人,那现在你可以把车钥匙交给他们了,车已经是他们的了。

 

这个系列在这里就结束了,我希望大家觉得这个会有点意思!

其他链接

Flow技术文档: https://www.onflow.org/technical-paper

******************************************************************

 

扫码添加技术社区官方账号

#实习下班后你在做什么##寒冬裁员##区块链##自学#
全部评论
感谢分享,不然都不知道有这种东西
点赞 回复 分享
发布于 2022-06-26 12:46

相关推荐

迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务