出品:OneBlock+
作者:Jeff Burdges, Alfonso Cevallos, Peter Czaban,Rob Habermeier, Syed Hosseini, Fabio Lama, Handan Kılınc Alper, Ximin Luo, Fatemeh Shirazi, Alistair Stewart, Gavin Wood
翻译:波卡高级大使 @ 郭斌、波卡高级大使 @ 冯路、波卡初级大使 @Faye Wang
编辑:雅珣
导语
目前,现有的很多不同功能的区块链项目,可能在设计时未考虑相互协作的能力。这导致用户难以在不同的区块链之间使用大量交互的应用程序。此外,随着项目数量的增加,每个项目单独提供的安全性变得越来越弱。
本文对于全面深入理解 Polkadot 具有较大的价值,适合具有一定区块链基础的读者阅读。在这篇文章里,我们描述了异构多链协议 Polkadot 的设计组件,并解释了这些组件如何帮助 Polkadot 解决区块链技术的一些现有缺点。
Pol kadot 旨在为多条链提供一个可扩展且可互操作的框架, 该框架具有 池化安全性 ,这是通过本文中描述的组件集合实现的。
01
简介
Internet 最初是为 TCP/IP 等去中心化协议设计和构建的,但是,它的商业化导致了当今所有流行的 Web 应用程序的中心化。我们指的不是物理基础设施的任何中心化,而是指 逻辑中心化对基础设施的权力和控制 。
两个突出的例子是像 Google 和 Facebook 这样的大公司:虽然它们以物理上分散的方式在世界各地维护服务器,但这些最终都由一个实体控制。
控制系统的中央实体会给每个人带来许多风险。例如,他们可以随时停止服务,可以将用户的数据出售给第三方,并在未经用户同意的情况下操纵服务的运作方式。这对于严重依赖这些服务用于商业或私人目的的用户尤其重要。
随着个人数据所有权意识的觉醒,网络用户对更好的安全性、自由度和控制的需求日益增长,并由此产生对没有单一实体控制的更分散的应用系统的需求。
如今,这种分布式的思想很常见,它已被用于网络和其他系统开发的许多领域,例如自由软件运动。
区块链是为解决这些问题而提出的一项技术,旨在建立一个去中心化的网络。然而, 只有当它能被普通用户轻松接受和便捷使用时,才能具备与集中式网络竞争的实力。
其中一个重要方面是,单独的应用程序必须能够交互,否则每个应用程序都会变得孤立,不会被尽可能多的用户采用。要想构建这样的一个互操作机制带来了新的挑战,其中许多难点在集中式模型中并不存在,因为两种范式之间的信任模型存在根本性的差异。这些差异给区块链之间的互信带来困难。
区块链技术需要解决的另一个挑战是可扩展性。 现有的区块链系统普遍存在高延迟,每秒只能进行数十笔交易,而 Mastercard 或 Visa 等信用卡公司则执行每秒数千笔交易。
区块链可扩展性的一个突出解决方案是并行运行许多链,通常称为分片。Polkadot 是一个多链系统,旨在 将所有这些链的安全力量集中在一个共享的安全系统中。 它于 2016 年由 Gavin Wood 首次引入 ,在本文中我们将详细介绍。
简而言之:Polkadot 利用称为中继链的中央链与称为平行链(平行链的组合)的多个异构和独立分片链进行通信。中继链负责为所有平行链提供共享安全,以及平行链之间的可信跨链交易。
换句话说, Polkadot 旨在解决如上讨论的内容:互操作性、可扩展性以及因算力分流所削弱的安全性问题。
**
**
02
概要
本小节的目的是描述 Polkadot 的主要功能,而不会详细介绍设计方案和推论。
Polkadot 系统由一个称为中继链的开放协作去中心化网络构成,该网络与许多其他并行运行的外部链交互,称为 平行链 。从上层的角度来看, 平行链是中继链的客户端 ,中继链为这些客户端提供安全服务,包括安全通信。这是中继链的 唯一目的 ;平行链是提供应用程序级功能的载体。
平行链的内部细节不是中继链关心的问题;平行链只需要在我们指定的接口上显示。其中一些期望是基于区块链的基础组成部分,因而得名。但是,其他非区块链系统也可以作为 Polkadot 平行链运行,只要它们满足该接口即可。如下所述:相关部分加下划线。
综上所述, Polkadot 是一个可扩展的异构多链协议。
2.1 节点与角色
Polkadot 中继链网络由节点和角色组成。节点是物理执行 Polkadot 软件的网络级实体,角色是执行特定目的的协议级实体。节点可以扮演多种角色。
在网络层面,中继链是开放的。任何节点都可以运行软件并作为以下任何类型的方式参与:
1. 轻客户端 - 从网络中检索某些与用户相关的数据。轻客户端的可用性无关紧要 - 它们不会对其他节点 / 客户端提供服务。
2. 全节点 - 检索所有类型的数据,长期存储,并与其他全节点同步通信。因而必须是高可用的。
(a) 哨兵节点 - 公共可访问的完整节点,为私有完整节点执行受信任的 代理服务,由同一运营商运行。
有时我们指的是平行链的完整节点。对于由非区块链所构成的平行链来说,这意味着他们参与到足够的程度,以至于他们可以验证通过它的所有数据。
除了分发数据之外,中继链节点还可以执行下面列出的某些协议级别的角色。其中一些角色具有与之相关的限制和条件:
1. 验证人 - 执行大部分安全工作。必须是中继链的全节点,与平行链收集人交互,但不需要作为全节点参与平行链出块工作。
2. 提名人 - 支持和选择验证人列表的利益相关者。可以由轻客户端完成,它们不需要对平行链有任何了解。
平行链可以决定自己的内部网络结构,但预期通过如下角色与 Polkadot 交互:
3. 收集人 - 收集平行链数据并将其提交给中继链,遵守以下描述的协议规则。它们是由平行链定义并选择的,并且必须是完整节点。
4. 钓鱼人 - 对平行链操作是否正确进行额外的安全检查,并获得钓鱼人奖励。这个角色是自我分配和奖励激励的,并且必须是平行链的完整节点。
2.2 协议
波卡中继链协议,包括与平行链间的交互,其工作原理如下:
1. 对于平行链 :
(a) 收集人会实时跟踪中继链区块的生成过程和共识协议 ,分别执行下面的步骤 (2) 和 (5)。例如,作为全节点参与到中继链当中,基于此来确定最有可能成为最新中继链的区块。另一方面,最新平行链区块(或其他数据)也将由这一最新中继区块所确定。
(b) 收集人对上述最新平行链区块上构建的数据完成签名后,将信息以间接形式递交到其平行链委派的验证人 (平行链验证人简称验证人),通过此步骤将信息输送到中继链。理想情况下, 为提高执行性能,收集人仅递交唯一的方案。
(c) 由验证人决定支持哪一个平行链区块,并公布该区块的相关数据,以表明其将作为该平行链的候选验证人被添加至下一个中继区块当中。
2. 中继链上负责区块生成的验证人会从所有平行链上收集候选区块,并把这些候选区块和最新的中继链外部调用一起放入中继链最新生成的区块中。 考虑到执行性能,这一过程产生的数据不包含平行链的完整数据,仅包含元数据和部分数据,当然安全相关的元数据包含在内。
在不利的情况下,这可能导致分叉,步骤 (5) 中会给出详细说明。该子协议被设计成即使有分叉,参与者也能知道最有可能成为最终块的区块,类似于工作量证明协议。
3. 子协议的运行以确保完整数据确实可用、涵盖并分发到其他各种中继链节点。
4. 平行链递交数据时可能包含其向另一条平行链发送的信息 ,包括提供元数据协助完成这个过程。现在这些数据将包含在中继链区块头部分,所以作为接收方的平行链可以得到新信息输入的相关信号。相比当前,接收方需要通过检索发送方的信息正文才能获取相关信息。
5. 验证人提交他们对区块的投票并最终确定,解决了因意见不同而产生分叉的问题。 上述投票将会被添加到中继区块中。
03
序言
3.1 角色定义
波卡网络节点的运行是基于接下来我们要介绍的相关角色和功能设定而展开的。
验证人:
验证人在波卡网络拥有最高权限,控制并承担新区块的打包工作。 验证人需要质押足够多的资金 ,但是由于我们允许其他有资金的提名人推举一个或多个可以代表他们的验证人,所以验证人的部分资金可能并不是自有资金,而是来自提名人。
各验证人运行中继链的客户端,必须具备高可用性和高带宽的性能条件,节点必须准备好在每一个中继区块上批准某一平行链的新区块,有时候可能是几个新区块的确认。这个过程包括接受、验证、再发布候选区块。
平行链的任务分配给验证人存在随机性,且变化频繁,要求验证人维护所有平行链的数据并保证数据库的完全同步,显然是不合理的,于是,“收集人”概念应运而生,作为第三方平行链的新区块。
指定验证人集合一旦合理地批准所属平行链的所有新区块,验证人本身必须进行中继链的区块批准工作。过程包括更新交易队列的状态(将数据从一条平行链的输出队列传输到另一条平行链的输入队列),处理已批准的中继链的交易批次以及对最终区块进行审批。
如果查证到验证人没有达到职责要求,将会被重罚。 例如,质押在他们名下的所有资金或者部分资金被没收。某种意义上,验证人角色和基于 POW 区块链的矿池有类似之处。
提名人:
提名人作为利益相关方,为每一个验证人贡献安全性资金。 提名人主要作用就是将风险资本质押到他们信任的一个或一组验证人,以代表他们行使维护网络的职责,除此之外,无其他角色职责安排。 根据其资金贡献量,提名人会得到其资金占验证人总质押金额里相应比例的奖励或惩罚。和收集人一样,某种意义上,提名人和基于 POW 网络的矿工相类似。
收集人:
交易收集人(简称收集人)作为帮助验证人生产有效平行链区块的一方,会运行某个特定平行链的全节点,也就是说收集人需要保留所有授权新区块所必需的信息,用于打包新块并执行交易,就跟基于 PoW 区块链的矿工一样。在正常情况下,收集人收集并执行交易,并创建一个“未封装”的区块,连同有效性证明信息将区块递交给一个或多个当前负责审查该平行链区块的验证人。
钓鱼人:
不像其他的两个参与方,钓鱼人并不直接参与区块打包的过程。他们是独立的 " 赏金猎人 ",激励他们的是一次性的大额奖励。
严格来说, 我们希望通过“钓鱼人”的设置,减少恶意行为的发生。 即使发生类似情况,希望也只是因为资金质押方私钥不小心泄露,而不是出于蓄意的恶意企图。该名字缘由是考虑到其期望奖励的频率,选择参与的最小要求以及最终能够获得奖励的数量。
钓鱼人的奖励来自于能够及时发现资金质押方的非法行为,这对于检测无效平行链区块的批准是非常有价值的。钓鱼人通过及时证明至少有一方(收集人或验证人)存在作弊行为而获得奖励,这对监控无效平行链区块生成与批准很有价值。
钓鱼人有点类似于区块链系统中的全节点,所需的资源相对较少,并且不需要承诺稳定的正常运行时间和带宽。他们的不同之处在于钓鱼人必须绑定一小笔保证金。这部分绑定的保证金可以防止因女巫攻击而浪费验证人的时间和计算资源。
虽然钓鱼人是波卡安全模型的一部分,但由于并没有为钓鱼人设计激励模型,所以对 Polakdot 的设计需要保证在没有他们的情况下系统也很安全。我们未来工作的一部分是为钓鱼人增加一个激励模式。
如图 1,图例展示了 Polkadot 协议中定义的结构元素和不同的角色:拥有 6 条平行链、18 个验证人以及每条平行链拥有 5 个收集人。图 2 显示了包含 5 个中继区块的中继链。需要注意的是, 分配给一条平行链的验证人数量,是通过验证人总数除以平行链的数量来决定的,但收集人的数量是独立于平行链数量的 。桥是允许外部链与 Polkadot 互操作的子协议。
图 1:一个保护六个平行链区块的的中继块。每个平行链有 5 个收集人和 3 个验证人
3.2 Polkadot 对抗模型
角色:
通常我们假设诚实的一方会遵循协议算法,而恶意的一方可能采用任意的算法。我们假设四分之三的提名人质押行为属于诚实的一方。基于这一假设,被提名人选出的验证人有三分之二以上是诚实的。我们对恶意钓鱼人的数量没有设定任何限制,因为他们的恶意行为可以被发现并受到惩罚。
平行链:
一方面,我们对平行链的区块生成机制没有任何安全假设。另一方面,我们假设大量的收集人是诚实的。Polkadot 的安全性并不取决于任何特定的诚实收集人,但它需要存在一些诚实的收集人。
图 2: 拥有五个中继区块(包含六条平行链的区块,但区块数量可能不同)的中继链
部分协议假设每条平行链至少有一个诚实成员;如果这个不可行或不现实,我们就不遵循这一假设,而是对完全恶意的成员进行额外检查。
密钥:
我们假设恶意方通过任意算法生成密钥,而诚实方总是安全地生成密钥。
网络和通信:
所有验证人都有他们自己的本地时钟,且不依赖于任何中央时钟。我们假设验证人和收集人处于部分同步的网络中。这意味着验证人或收集人发送的消息,最多在 时间后到达网络中的所有各方,其中是未知参数。我们假设信息的最终传递是在 Polkadot 上。同时,我们假设收集人和钓鱼人可以连接到中继链网络中来提交他们的报告。
04
组件和子协议
波卡的验证人采用 NPoS (Nominated Proof-of-Stake)选择机制 ,是基于对 PoS 的改进,它允许任意数量的 Token 持有者以提名人的身份参与到网络中,他们的质押构成了大量但有限的验证人集合。
这个范式同时实现了高安全性和可扩展性,并通过投票机制中广为人知的 比例代表制 ,来达到一个前所未有的去中心化水平。提名人在经济上赋予系统安全性,对验证人的表现起着监督者的作用。基于提名人对候选验证人表达的偏好,每一个 era 中系统都会选择一组获得的质押数量支持尽可能高的、提名人分布尽可能均匀的验证人集合。
同时,提名人也可能会因为把自己的选票贡献给了太少选择数量的验证人而在经济上不受激励,这有助于随着时间的推移持续保持系统的分散度。此外,选举机制对突然的变化具有很强的适应性,比如一些验证人在被大幅罚款后被踢出,选举机制此时会自动在一组新的验证人之间重新分配提名人的支持,即使选票本身没有变化。
波卡的安全性目标是参与者在理性的情况下实现拜占庭容错。我们认为在 NPoS 机制下,质押人选择的一组验证人集合中,至少有 2/3 的验证人是诚实的。被选中的验证人集合负责运行中继链。每个平行链的收集人负责生产平行链区块,验证人被分为轮动的子集,一个平行链一个子集,在这些平行链区块的区块头被纳入中继链之前需要被验证有效性。
为了使其发挥作用,我们需要平行链具备回滚功能,直到我们大概率确定所有平行链都是正确的。这意味着,我们需要具备重构链的能力,为此,链需要能够进行分叉。
因此我们采取了 BABE 作为块生成机制,虽然由验证人运行,但具有类似 PoW 链的特性。具体来说,我们采用最长链规则作为我们共识的一部分,所以并不会预先知道谁是下一个区块生产者。
就其本身而言,BABE 要求我们从一个区块产生的那一刻起,到它被最终确定的那一刻,即当我们可以确信该区块永远不会被回滚时,需要等待很长的时间。在某些情况下,为了确保区块的可用性,需要使终态化进程放缓。但大多数时候,我们更倾向于快速确认区块终态。
为此,验证人使用 GRANDPA 来确定区块的终态,这是一个与区块生成完全分离的终态敲定工具。BABE 和 GRANDPA 的分离运行,使得 GRANDPA 具有自动调节性,并允许我们延迟确认区块终态直到其可用性被验证,但这并不会减缓区块的生成速度。GRANDPA 在确定一个区块终态时使用拜占庭协议,并允许我们向跟踪验证人集合的实体证明哪些块已经被确定终态,这对转接桥来说很重要。
如果 Token 的交易结合 SPREE 模块来进行,则可以保证只要平行链正确运行,Token 只能以约定的方式被创建和销毁,同时可用性和有效性机制保证了链上代码的正确执行。SPREE 也确保 Token 交易逻辑所需的共享代码是正确的。即使平行链可以改变他们自己的代码,却不能改变 SPREE 模块的代码。
相反,SPREE 模块的代码是集中存储的,该代码的执行及存储将与状态转换的其他部分进行沙盒处理。这就保证了 Token 交易消息被正确解析,且确保我们获得了想要 Token 的保证。
中继链自身的逻辑会不定期的升级,治理机制允许波卡 Token 持有者参与到决策流程,而不是通过中心化的权利来对系统作出任何改变——或者是类似一些去中心化系统,通过团队开发者来决定,他们一次有争议的代码改变通常会导致区块链陷入僵局或永久分岔。
我们希望有一个机制可以平衡系统,可以在需要的时候快速做出没有争议的改变,同时也可以有工具对有争议的提议做出果断且正确的回应。波卡最终的想法是对所有重要的决定:比如代码变更,通过 DOT 持有者参与的质押加权的民主公投来决定如何回应。
4.1 NPoS 和验证人选举
波卡网络出块采用自定义的提名人权益证明 NPoS,是具有确定性终态的共识协议,例如在 Polkadot 中,需要一组注册的验证人集合,其规模是有数量限定的。
Polkado t 将维护数据为 的验证人集合。这个数字最终由治理决定,并随着平行链数量的增加线性增长;但验证人的数量将独立于网络中的用户数量,以确保网络的可扩展性。NPoS 允许数量不限的 DOT 持有者作为提名人参与,他们通过质押来提供更多价值,以帮助网络维持高水平的安全性。因此,NPoS 不仅比工作量证明(PoW)更高效,而且比传统形式的 PoS (如 DPoS 和 BPoS)更安全。我们认为相对来说, NPoS 机制比其他基于 PoS 的保护方案更加优异。
设计一种实现比例代表制的选举制度的想法在文献中已经存在了很长时间。特别值得注意的是斯堪的纳维亚半岛的数学家 Edvard Phragmen 和 Thorvald Thiele 在 19 世纪末的工作。
最近,学术界作出了相当大的努力来正式确定比例代表制的概念,并重新审视了 Phragm´en 和 Thiele 的方法,在算法上对其进行优化。我们的验证人选择协议是对 Phragm´en 方法的改进,且确保遵守比例合理代表制 (PJR) 的技术特性。
从形式上看, 如果每个提名人 ,质押 并支持一组候选人 ,协议就会选择一组 验证人 ,如果这里有少数提名人 , 那么:
对一些 1 < t < ,则有 。换句话说,如果少数 至少有 t 个普遍信任的候选人,它可以“负担得起”提供至少 权益的平均支持(即,选出的集合 中的平均验证人支持上限),那么这个少数群体就可声称在 中至少有 t 个候选人,尽管不一定普遍信任。
安全性: 如果每个提名人 质押 ,且支持候选人子集 ,那么该协议不仅必须选出一组 拥有 PJR 属性的验证人 ,而且还需要根据提名人支持且被选中的验证人中定义一个分布,即函数
这个目标所定义的问题在文献中被称为最大化支持,并且已知是 NP-hard。我们已经为它开发了几种有效的算法,这些算法提供了理论上的保证(常数因子的近似值),也有很好的扩展性,并在我们的测试网上成功测试。要了解更多信息,请参见我们关于 NPoS 中验证人选举的论文。
4.2 中继链状态机
从形式上看,Polkadot 是一个可复制的分片状态机,其中分片是平行链,而 Polkadot 中继链是协议的一部分,它确保所有平行链之间的全局共识。
因此, Polkadot 中继链协议本身可以被视为一个可复制的状态机。 为此,我们说明了中继链状态,以及由中继链区块中的交易分组所支配的状态转换的细节。
状态转换:
像任何基于交易的转换系统,Polkadot 的状态变化是通过执行有序的指令集,即所谓的 extrinsics。它们涵盖了从机器状态的 " 外部 " 提供的任何数据,可以影响状态转换。
Polkadot 中继链分为两个主要部分,即 "Runtime" 和 "Runtime 执行环境 "。状态转换功能的执行逻辑主要封装在 "Runtime" 中,而所有其他的通用操作,通常在现代基于区块链的复制状态机中共享,被嵌入到 "Runtime 执行环境 " 中。特别是,后者负责网络通信、区块生产和共识引擎。
Runtime 函数被编译成一个 WebAssembly 模块,并作为状态的一部分存储。Runtime 执行环境将外部信息传递给 Runtime 并与其交互以执行状态转换。通过这种方式,状态转换逻辑自身就可以作为状态转换的一部分进行升级。
Extrinsics:
Extrinsics 是提供给 Polkadot 中继链状态机以使其转换到新状态的输入数据。Extrinsics 需要被存储到中继链区块中,以便在状态机之间实现共识。Extrinsics 分为两大类,即:交易和 "inherents",它们代表中继链区块固有的数据。区块的时间戳 t 即为一个必须包含在每个 Polkadot 中继链区块中的固有 extrinsics 示例。
交易被签名并在节点之间的网络上被广播。相比之下,inherents 不会被签名,也不会被单独广播,除非它们被包含在了一个区块中。如果绝大多数验证人都认为这个 inherents 是有效的,那么一个区块中的 inherents 也会被假定为有效。中继链上的交易主要涉及中继链和 Polkadot 协议的整体操作,例如 set code, transfer, bond, validate, nominate,vote 等操作码。
中继链区块格式:
一个典型的中继区块由 header 和 body 组成。body 由一系列 extrinsics 组成。
header 包含父块的哈希值、区块号、状态树的根、Merkle 树的根(通过将 extrinsics 排列在 merkle 树中获得)以及摘要信息。
摘要会存储来自共识引擎的辅助信息,这些信息将用来验证区块的有效性以及区块的来源,同时帮助轻客户端在无需访问状态存储的情况下验证区块。
4.3 共识
Polkadot 的混合共识协议由 BABE 和 GRANDPA 组成,前者是中继链的区块生产机制,提供概率最终性,后者提供可证明的最终性,独立于 BABE 工作。
通俗的说,概率性终态即经过一定时间后,中继链中的一个区块将以非常高的概率(接近 1)得到终态确定,但可能后期不会被纳入获得大部分验证人一致认可的中继链分支;而确定性终态意味着一个被确定了的区块将永远保持确定性。此外,可证明的终态意味着我们可以向没有积极参与共识的各方证明一个区块是终态化的。
4.3.1 BABE
BABE(Blind Assignment for Blockchain Extension) 由一个个称为 epochs( , ,...) 的时间分隔组成,其中每个 epoch 由多个连续的 slot 组成 ( = { }),网络可以设定的每一个 epoch 的 slot 数目上限 R。在每个 epoch 开始时,每个验证人都知道它应该在其中哪个 slot 中生成一个区块。当属于它的 slot 到来时,验证人通过证明它已分配给该 slot 来生成区块。
一个 epoch 中的某个验证人可执行如下操作,以了解它是否有资格在 slot 的 中生成区块:
1. 如果 =1 或 =2,则 BABE 获取创世区块中的随机性;否则,需要获取 ( ) 之前的两个 epoch 生成的随机性;
2. 它使用秘密私钥和输入运行 VRF:随机性和 slot 号 。
图 3:当 =9 时,第一个 epoch 内相对时间协议执行流程示意
在每个 sync-epochs (不同于 BABE 中的 epoch),验证器根据相对时间协议的结果更新他们的时钟,并使用新时钟直到下一个 sync-epochs。第一个 sync-epochs 在创世区块被释放后立即开始。当最后一个(概率上)被确定了终态的区块的 slot 号是 时( 是最小的 slot 号),另一个 sync-epochs 开始。这使得 ,其中 是 中最后一个(概率上)确定了终态区块的 slot 号。这里 是链密度(CD)性能参数,它将根据链的增长来定义。
更详细地,每个验证人在 sync-epoch 期间将块的到达时间 与块中的 slot 号 一起存储。在 sync-epoch 结束时,验证人检索 sync-epoch 期间生成的概率性终态区块的到达时间 ,并计算下一个 sync-epoch 的第一个 slot sl 中一些候选人的开始时间,即 。 中的时间被视为候选人时间集合。为了选择一个候选人,验证人对候选列表 进行排序,并输出排序列表的中值作为 sl 的开始时间。图 3 是在第一个 sync-epoch 中执行相对时间协议的示例。
4.3.2 GRANDPA
如上所述,我们希望有一个灵活的、与区块生产分离的最终确定机制,这一点由 GRANDPA 实现。为了与 GRANDPA 一起工作,对 BABE 的唯一修改是改变分叉选择规则:验证人生成的区块不是建立在最长的链上,而是建立在被敲定的最终完成的最长的链上。GRANDPA 可以与许多不同的区块生成机制一起工作,并且有可能用另一种机制来取代 BABE。
我们假设,我们可以向分叉选择规则询问给定的最佳区块。基本的想法是,我们想在大家都同意的链的前缀上达成拜占庭共识。为了使其更加具备健壮性,我们试图就 2/3 的验证人同意的链的前缀达成一致。
图 4:GRANDPA 票数及其汇总方式
我们在投票规则上使用了 贪婪最重可观测子树(GHOST)算法 ,很像 Casper TFG 或一些建议用于 Casper FFG 的分叉选择规则。我们的内部结构上像一个更传统的拜占庭协议形式来使用这个规则处理投票。
如图 4 所示,GHOST 规则工作原理如下:我们设置一组由区块哈希给出的投票,诚实的验证人有且只有一票,并去由以下方式归纳形成的链头。我们从创世区块开始,然后包括该区块中 2/3 的投票者投票给其后生成的区块,只要正好有一个这样的即可。这个区块头包含 g( ),其中 是投票的集合。
如图 4 所示,左边是单个区块的票数,右边是每个区块及其所有后代的总票数。创世区块位于顶部,我们从它的子块中选出得票率为 100%(>2/3)的票数。该区块的子代分别拥有 60% 和 40% 的票数。因为这些票数低于 2/3,所以我们停止并返回第二个区块。
一轮 GRANDPA 共识有两个投票阶段:预投票和预提交。首先,验证人对最佳链进行预投票;然后,他们根据 2/3-GHOST 规则,g,应用于他们所看到的预选票集 并对 g( ) 进行预提交;最后,他们对看到的预提交集合 和最终确定 g( )。
4.4 平行链
4.4.1 区块生成
概括地说,收集人产生一个平行链区块,将其发送给平行链验证人,验证人对区块头进行有效签名,有足够签名的区块头将被放在中继链上。根据 BABE,这个中继链区块在最佳链中,那么平行链区块也在最佳链中,当这个中继链区块被最终确定时,平行链区块也在最佳链中。
因为平行链验证人经常切换到不同的平行链,它们是平行链的无状态客户端。因此,我们区分了平行链区块 B 和有效性证明(PoV)区块 ,前者通常能够让平行链完整节点如收集人更新平行链状态,后者则使不具备平行链状态的验证人能够验证。
任何验证人都应该能够在给定中继链状态的情况下,使用平行链的状态转换验证功能(STVF)来验证 ,其 WASM 代码以类似中继链 runtime 的方式存储于中继链上。STVF 将 PoV 区块作为输入,包含从该平行链最新的区块头和中继链状态中的少量数据。
4.4.2 跨链消息传递(XCMP)
XCMP 是平行链用来相互发送消息的协议。它旨在保证四件事:第一,信息快速到达;第二,从一个平行链的信息按顺序到达另一个平行链;第三,在发送信息的平行链历史数据中,到达的信息确实已被发送;第四,接收者将公平地收到不同发送者的信息,帮助保证发送者不会无限期地等待其信息被看到。
XCMP 有两个部分:(1) 一个平行链区块的发送信息的元数据被包含在中继链上,随后这些元数据被接收平行链用来验证信息。(2) 与该元数据相对应的信息体需要从发送者实际分发到接收者,同时还要证明该信息体确实与相关元数据相关。
为了实现一致性,当作为发送源的平行链 S 向接收方平行链 D 发送平行链 B 中的消息时,那么我们就需要使用中继链状态来验证这些消息,而中继链状态是根据中继链中包含的平行链 B 对应的平行链区块头 PH 来更新的。我们需要在中继链状态中限制像 PH 这样的头文件的数据量,同时也要限制中继链在处理这种平行链头文件时需要做的认证工作。
为此,平行链头 PH 包含一个发送消息的消息根 M,以及一个表明该区块中哪些其他平行链被发送消息的位域。消息根 M 是该区块发送消息的每个副链 p 的头哈希 的 Merkle 树的根。头 的哈希链有所有从 D 发送至 S 的信息的哈希值,不仅仅是在块 B 中,而是在块 B 之前的任何块中从 S 发送至 D 的信息。这允许从 S 到 D 的许多消息依次从 M 处被验证。无论消息本身如何被传递,它们也应该与 Merkle 证明一起被发送,该证明允许接收平行链的节点认证它们是由头 在特定中继链区块中的 B 发送的。
一个平行链 D 接收一个平行链 S 在一个平行链块中发送的所有信息,或者不接收任何信息。D 的一个平行链头 PH’包含一个水印。这个水印由一个中继链区块 R 的块号和一个源平行链 S 的平行链 id 组成。这表明 D 已经收到了中继链区块 R 之前的所有链所发送的所有消息,并且在排序中对 R 块中由平行链(包括 S)发送的消息进行了操作。
4.5 经济激励层
4.5.1 中继区块限制和交易费设计
对资源使用的限制:
我们对一个中继区块所能处理的交易量进行了限制,目的是:a)确保每个区块即使在性能较差的节点上也能有效处理,避免区块生产的延迟;b)即使在网络流量很大的情况下,也能保证一定数量的高优先级、业务交易(如不当行为报告)的可用性。特别是,我们对以下资源设置了区块约束:链上字节长度,以及处理交易所需的时间和内存。
我们还增加了一个 额外的资源约束: 用来区分普通交易和高优先级交易 ,只让普通交易占到每个区块资源限制的 75%。这是为了确保每个区块的高优先级交易至少有 25% 的资源保证空间。
我们还制定一个自适应的交易费用计划以应对不同流量状况,并确保日常区块避免满载的情况,因此活动的高峰期可以得到有效处理,并最小化尖峰时刻的出现概率。特别是,每笔交易的费用都乘以一个参数,该参数根据当前的网络流量随时间变化而变化。
4.6 治理
Polkadot 使用复杂的治理机制,一个关键和不变的规则是,对协议的所有修改必须由利益相关者加权公投同意——确保多数股权总能控制网络发挥作用。
波卡的每个 DOT 持有者都有权:
a)提交提案;
b)认可一项公共提案,以便在公投时间表中优先考虑;
c)对所有正在进行的公投进行投票;
d)成为理事会席位的候选人;
e)对理事会候选人进行投票。
此外,任何 DOT 持有人都可以成为参与 NPoS 的提名人或候选验证人。
4.6.1 提案和公投
Polkadot 逻辑的核心是在链上存储在一个无定形的状态转换函数中,并以一种平台中立的语言定义:WebAssembly。每个提案都以 Runtime 的特权函数调用的形式出现,能够修改 Runtime 的代码本身,实现无缝升级,避免出现 " 硬分叉 " 的情况。然后,一个提案被提交,并通过公投进行表决。
提案可以通过以下几种方式之一启动:
- 公共提案:任何 DOT 持有人均可提交;
- 理事会提案:由理事会成员提交;
- 自动提交的提案:由前轮公投的部分内容,作为提案自动递交;
- 紧急提案:由技术委员会提交。
投票率的偏差: 以公共提案形式来要求所有利益相关者参与解决某些细小问题上似乎是不必要的。例如,要求出块时间降低 5% 这类问题。
然而,如果没有这个规则,网络很可能是不稳定的,因为把它的控制权放在利益相关者的手中之外,会产生一种错位,可能会导致不作为或更糟。
然而,通过利用投票率很少是 100% 这一事实,我们可以根据情况产生不同的结果,在主动和被动的利益相关者之间建立起权力平衡。例如,简单的投票系统通常会引入一个法定人数的概念,即必须达到最低的投票人数才能通过一项变革。
图 5:自适应投票率偏差
最后,在理事会提案得到所有理事会成员一致支持的特殊情况下,将观察到 " 负投票率偏差 "。这是第一种情况的对称反面,即额外的投票率总是使变化的可能性降低,我们在投票率低的情况下有利于赞成方,要求反对者的超级多数来拒绝提案,当投票率接近 100% 时,要求调低为多数通过,见图 5。
4.7 密码学
4.7.1 账户密钥
账户密钥有一个相关联的余额,其中部分可以被锁仓,以便在质押、资源租赁以及治理中发挥作用,包括等待几种时间类型的解锁期。由于这些角色施加的限制不同,且多个解锁期是同时运行的。所以,我们允许不同锁仓活动采用不同的锁仓时间。
账户密钥方面,我们支持 ed25519 和 Schnorrkel/sr25519 两种规格。两者都是使用 Ed25519 曲线的类似 Schnorr 的签名,因此两者的安全级别相近。另一方面,Schnorrkel/sr25519 提供更多区块链友好功能,如分层确定性密钥派生 (HDKD,Hierarchical Deterministic Key Derivation) 和多重签名。
特别是,Schnorrkel/sr25519 采用 Mike Hamburg 的 Decaf 的 Ristretto 压缩算法,Ristretto 压缩算法提供 Ed25519 曲线的 2 阶的扭点作为质数群。Polkadot 中大部分常规哈希都采用 Blake2b 算法,但是 Schnorrkel/sr25519 本身使用 STROBE128,是基于 Keccak-f(1600) 并提供非常适用于签名和非交互式零知识证明(NIZK)的哈希接口。
4.7.2 会话密钥
每个会话密钥在共识或安全方面扮演一个特定的角色。通常,会话密钥获得仅来自会话许可的授权,由代表一定质押量的某些控制人密钥签字。
我们更倾向于会话密钥能够绑定到一台物理设备,以最大程度地减少意外风险的发生。我们要求验证器和操作员通过 RPC 协议发起会话许可,而不是通过会话密钥本身去操作。
在 BABE 中,验证人使用 Schnorrkel/sr25519 密钥作为常规 Schnorr 签名,也可以用于基于 NSEC5[28] 的可验证随机函数 (VRF)。当区块生产者 VRF 输出 VRFsk (rℯ‖slot_number) 的得分足够低,那么,任何拥有 VRF 公钥的人可以验证区块是否在正确的 slot 中产生,但只有区块生产者才能通过他们的 VRF 密钥提前知道他们的插槽。
4.8 网络
4.8.1 网络概况
Polkadot 由一个独特的中继链与许多不同的平行链组成,同时中继链为平行链提供安全服务。
为此,需要满足以下网络级别功能,大致分为以下方面:
- 与所有区块链协议一样,中继链需要满足以下功能要求:
a. 接受并分发来自用户的交易和其他外部的数据(统称为外部数据或外部源)
b. 分发收集子协议的工件
c. 分发终态子协议的工件
d. 同步先前完成的状态
作为一个重要的示例,平行链可以根据上述结构自行选择执行与否,甚至可能重新使用相同的子协议。波卡的部分实现被构建成了一个单独的程序库,称为“Substrate”,专门进行基础框架构建。
- 关于中继链和平行链交互,需要:
a. 接受来自平行链收集人产生的平行链区块
b. 分发包含有效性证明的平行链区块元数据
分发平行链区块数据并使其一段时间内可用,以完成审计。
4.8.2 存储和可用性
Polkadot 不要求每个人对整体系统的状态进行存储,准确的说,即不需要所有区块都存储网络的全部状态。相反,每个平行链区块通过擦除码被分成几个碎片,这样每个验证人都有一个碎片,总共有 N 个碎片。
出于安全因素考虑,擦除阈值设置为 ceil(N/3)。所有碎片信息由指定的收集人提交。且最初都可以在相关的平行链验证人处获得,(在这个角色中,平行链验证人也被称为初检员)然后这些分片信息将根据以下步骤进行分发:
1. 分发 - 每个平行链验证人最初都想要其中一个碎片,而平行链验证人也必须按一人一分片的要求进行分发;
2. 检索 - 审批检查者(即中继链验证人)需要确认有 ceil(N/3) 的验证人有他们的碎片,并且其中部分中继链验证人将尝试进行碎片检索;
3. 进一步检索 -作为可选项,其他非验证方也可能想要执行进一步检查,例如响应钓鱼人警报,再次提出 ceil(N/3) 分片的需求。
这个子协议的目的是确保 ceil(N/3) 这个阈值可行,以及可以在合理的时间内得到相关验证人中检索,直到至少完成了后面几个阶段的时候。我们将遵循一个类似 bittorrent 的协议,但有以下区别。
-
对于分发和检索,接收者的集合是已知的。因此,除了 bittorrent 的 pull 语义之外,碎片可以通过已经拥有碎片的验证人提前推送;
-
哨兵节点背后的验证人将使用这些作为节点作为代理,而不是直接发送;
-
与中心化的追踪器不同 , 像谁拥有什么碎片信息这样的追踪 , 会通过中继链的 Gossip 网络进行传播。
4.8.3 授权、传输和发现
Polkadot 使用与许多其他区块链类似的方案,即使用广泛使用的分布式哈希表(DHT),Kademlia。Kademlia 是 DHT 的一种,采用 XOR 距离度量,常用于高流失网络。我们采用 Protocol Labs 的 libp2p Kademlia 并在执行过程中进行改进来达到使实体和其地址建立关联的目标。
为防止日蚀攻击,我们允许路由表足够大以包含最小限度的诚实节点,并且实现多路径路由的 S-Kademia 执行。
目前,地址簿服务也被用作主要发现机制——节点在加入网络时进行密钥 / 键 (key) 空间随机查找,并连接到任何一组返回的地址。同样,节点接受任何传入连接。这便于支持轻量化客户端和其他非特权用户的支持,但也容易造成 DoS 攻击。
结语
这是一篇全景式解析波卡核心技术的文章,在一万五千字的背后,是一份接近四万字的波卡技术论文报告。
包括核心技术设计:
混合共识 GRANDPA/BABE、中继链状态机、经济模型、治理模式、XCMP/SPREE 等内容。
最后,我们整理了部分可参考的内容供感兴趣的读者继续探索波卡技术:
1、针对波卡技术的设计思路,可进一步参考 Polkadot Wiki ;
2、如果想要更深入了解设计背后的代码逻辑,可参考 Polkadot github 进一步研究;
3、如果想下载完整版 PDF,可以关注本公众号,回复「波卡论文」就能领取;
同时,可访问 github 地址:
https://github.com/AmadeusGB/Overview-of-Polkadot ,获取更多信息。最后,如果喜欢的话请帮忙点一个 star 。
完整版 PDF
请关注 OneBlock+社区公众号,回复「波卡论文」领取。