Polkadot:畅想一种异构的多链架构(第五部分)

本文译者:岳利鹏

6.7  平行链的验证

验证人抵押了大量的保证金,他们的主要目标就是校验平行链区块是否有效,包括但不限于:状态转换、囊括外部交易、执行等待在入口队列的提交、执行出口队列的最终状态。这个过程本身是比较简单的。验证人一旦完成了前一个区块的打包,他们就可以自由地为后面的几轮共识准备平行链的候选块。

验证人一开始通过平行链收集人(下面介绍)或他的某个副验证人找到一个平行链区块。平行链候选块的数据包含区块头、前块头、外部数据输入(对于以太坊和比特币,这些数据被称为交易,然而他们也可能是任意结构、任意目的)、出口队列数据、状态转换有效性的内部证明数据(对于以太坊,这可能是用来执行每个交易的很多状态/存储树节点)。实验性的证据显示对于目前的以太坊区块,这个数据集最多有几百K字节(KiB)。
如果校验没有完成,验证人会尝试从前一个块的转换中获取相关信息,从前一个块的验证人开始,之后到所有签名了这个数据的验证人。

一旦一个验证人接收到了这么一个候选块,他们就在本地验证它。验证过程包含在平行链这个大类的验证人模块里,这个需要共识的软件模块必须写在所有的Polkadot实现里(原则上可以在多个实现里共享一个C ABI的库,但这会降低安全性,因为他们只是单一实现的引用)。

这个过程会提取前块头,然后用刚达成共识的中继链区块中记录的哈希值来检验。一旦父块头的有效性得到了验证,就会调用平行链类中特定的验证函数。这是个会接收很多数据项(大概就是目前给出的几种)的函数,返回值是对于区块是否有效的简单判断。

大多数这种验证函数都将首先检查头部的数据项,这些数据都可以直接从父块衍生出来(例如父块哈希、高度)。之后为了处理交易或提交,他们会尽力填充内部数据结构。对于以太坊这样的区块链,需要执行全部的交易才能往梅克尔树填充这么大量的数据。其他类型的区块链可能有其他的处理措施。

一旦完成验证,入口提交和外部交易(或代表的其他)都会根据链的规则而被固定。(一个可能的默认方式是需要所有入口提交都在服务外部交易之前处理,然而这应该由平行链的逻辑决定)。通过这个规定,一系列的出口提交都会被创建,而且确实符合收集人的候选块要求。最终会一起检查合理填充的块头和候选块头。

验证人完成了对候选块的校验后,就对块头哈希进行投票,并发送必要的验证信息给小组里的其他副验证人。

6.7.1 平行链收集人

平行链收集人不需要交押金,他们完成的是类似目前区块链网络里矿工的任务。他们属于特定的平行链。为了开展工作,他们必须要有完全同步的中继链和平行链。

完全同步的精确含义取决于平行链的种类,尽管它们都包含平行链入口队列的当前状态。在以太坊这个例子中,它还至少要有最近一些块的梅克尔树数据库,但也可能包含非常多的其他数据结构,例如证明账户存在的Bloom过滤器、遗传(familial)信息、日志输出、和对应高度区块的分叉回退表单。

为了保持两条区块链的同步,他们必须维护一个交易池来“钓取”(fish)交易,并接收公网上正确验证的交易。有了链和交易池,收集人就可以为每个块的被选验证人(由于同步了中继链所以知道他们身份)打包新的候选块,再附属一些必要信息(例如从节点网络来的有效性证明等),然后提交给验证人。

他们收集所有交易的手续费作为回报。这里有很多经济激励手段。在一个激烈竞争的市场中,如果收集人有富余的话,还可以跟平行链验证人分享手续费,以激励他们打包特定收集人的区块。同样地,一些收集人可能提高所需支付的手续费,使区块对于验证人更有吸引力。在这种情况下,正常的市场机制会使那些更高手续费的交易跳过队列,并能更快地打包到链里。

6.8 网络设计

以太坊和比特币等传统区块链中的网络设计需求一般比较简单。所有的交易和区块都未受引导地用gossip广播。同步模块中牵涉到的东西会更多一点,以太坊就可以根据不通类别做出不同的响应,但现实中这更多是节点的策略,而不是协议本身的内容。

以太坊基于devp2p协议改进了目前的网络协议,支持在单一节点连接中进行多个子协议的多路复用,因此同时支持多个p2p协议,但以太坊的协议仍然相对比较初级,而且它还没有完成例如支持QoS等重要功能。当初创造一个无所不在的“web3”协议的愿望基本上失败了,只剩下从以太坊众筹出来的几个项目。

Polkadot的需求更加根本。相比于一个完整的统一网络,Polkadot有很多种参与方,每方都有不同的需求,参与方需要有很多不同的网络信道来交换数据。从本质上讲,这意味着需要一个能支持更加层级化的网络结构的协议。另外为了促进更多新类型的区块链来扩展网络,也需要有一个新的层级结构。

对于网络协议更深层面的探讨不在本论文范围内,我们需要更多的需求分析。我们可以把网络参与者分为两类(中继链、平行链),每个都有三小类。每条平行链的参与方之间相互通信,而不和其他链通信:
中继链参与方

验证人:P,为每条平行链分割成多个子集P[s]
可用性保证人:A(在基础协议里由验证人代替)
中继链客户端:M(每条平行链的成员)
平行链参与方:
平行链收集人:C[0],C[1],…
平行链钓鱼人:F[0],F[1],…
平行链客户端:S[0],S[1],…
平行链轻客户端:L[0],L[1],…
通常我们认为网络成员和他们的设置间会发生如下几种通信:
P | A<-> P | A:为了达成共识,验证人/保证人必须连接。
P[s]<-> C[s] | P[s]:每个作为平行链成员的验证人会和其他成员连接来发现区块并分享区块,例如收集人。
A <->P[s] | C | A:每个可用性保证人将需要从验证人那里收集签过名的共识相关的跨链数据;收集人可以广播给保证人来优化对他们区块的共识。一旦完成,数据会广播给其他保证人来促进共识。
P[s]<-> A | P[s’]:平行链验证人将需要从前一个验证人或可用性保证人集合收集额外的输入数据。
P[s]<-> A:当需举报时,钓鱼人公告给任何参与方。
M <-> M| P | A:中继链客户端输出数据给验证人和保证人。
S[s]<-> S[s] | P[s] | A:平行链客户端输出数据给验证人和保证人。
L[s]<-> L[s] | S[s]:平行链轻客户端从全客户端获取数据。

如果为了保证高效的传输,那种每个节点无差异的平层网络(类似以太坊devp2p)就不再适应了。协议里很可能扩展引入一个合理的节点选择和发现机制,还可能计划一些前瞻性的算法,保证节点的顺序在适当时候是“偶然”连接的。

各类不同参与方节点的具体策略会不一样:对于一个能伸缩的多链系统,收集人要么需要持续地重新连接被选的验证人,要么连接一个验证人小组来保证他们永不断线,即使大多数时间他们对于自己是无用的。收集人也会保持和可用性保证人集合的一个或多个稳定连接,来确保需要共识数据的快速传播。

可用性保证人将保持相互连接,还要保持与验证人(为了共识和需共识的平行链数据)、一些收集人(为了平行链数据)、一些钓鱼人和一些全节点(为了缺失的信息)的稳定连接。验证人倾向于寻找其他验证人,特别是那些在同一个小组里的,还有那些可以提供平行链区块的收集人。

钓鱼人和一般中继链或平行链客户端会倾向于和验证人或保证人保持一个连接,但和他们相似的很多节点却不这么做。平行链轻客户端除了连接其他轻客户端外,也会连接一个平行链全客户端。

6.8.1 节点轮换的问题

在基础协议的预案里,每个块的验证人小组随机变换,验证人被随机分配去验证某条平行链的交易。如何在不相关的节点间传递数据会是一个问题,这就必须依赖一个全分布式并且连接良好的节点网络,才能保证所需的跳跃距离(最坏的延迟)只按照网络规模(一个类似的Kademlia的协议会有帮助)的log级别增长,要么就必须延长区块时间,来支持必要的连接谈判,建立能够满足该节点当前通信需求的节点集合连接。

这些都不是好的方案:强迫变成更长的出块时间会让网络无法支持一些特定的程序或区块链。即使是一个完美公平的网络连接也会导致带宽浪费,因为要推送大量数据给不相关的节点,所以会影响到网络的伸缩功能。

然而这些方向都会促进问题的解决,一个可以降低延迟的优化方案是降低平行链验证人集合的易变性,在一段区块后才重新分配(比如15个区块,如果是4s的区块时间,那么只需要每分钟才重新连接),或者一段时间内只轮换一个验证人(例如如果有某条平行链分配了15个验证人,那么平均情况是一分钟内才全部轮换)。通过提高平行链局部的可预测性,来降低节点轮换的次数,并仍然保证连接的优势,我们就可以保证节点间连接的随机性。

6.8.2 通往高效网络协议的路径

最高效和合理的开发方向是专注于改造一个现有协议而不是自己从头开发一个。我们将会探讨的几个点对点协议包括:以太坊的devp2p、IPFS的libp2p、GNU的GNUnet。关于这些协议的全面介绍、以及其中关于如何打造一个能支持特定结构的模块化节点网络、动态节点转换、可扩展子协议等内容,本文也不做过多介绍,但这会是实现Polkadot的重要一步。

 

7 协议的可实践性

7.1 跨链交易支付

我们去除了以太坊那样的计算资源统计的gas机制,这虽然带来了更多的自由和简便性,但也引出了重要的问题:没有了gas,一条平行链如何防止其他平行链逼迫他们做运算?然而我们可以依赖“交易提交”的入口队列缓存来阻止一条链给另一条链塞满交易数据,我们还没有提供其他相同效果的防垃圾机制。

这是个更高层面的待解决问题。由于链可以在“交易提交”中附属任何数据,我们需要保证在开始之前就支付计算费用。类似于以太坊Serenity版本中的一个提案,我们可以想象平行链有一个“内向”(break-in)合约来给验证人提供保证,付费换取特定数量的计算资源预分配。这些资源可能用类似gas的机制来度量,但也可能用完全不一样的概念模型,比如主观计算时间模型或类似比特币的一般计费模型。

无论“内向”合约定义什么价值模型,我们都不能简单假设链下调用器对他们是可用的,所以这个方案的用处也不大。然而我们可以想象在来源链里的第二个“外向”(break-out)合约。这两个合约形成一个桥梁,相互认识并且提供等值交换(相互之间的权益代币可以用来支付结算)。调用其他链意味着要用这个桥梁做代理,可以通过谈判来协商如何支付目标平行链的计算资源消耗。

7.2 添加链

添加一个平行链是相对比较便宜的操作,但并不免费。平行链越多意味着每个平行链的验证人就越少,更多的验证人又意味着每人的押金也会变少。通过钓鱼人缓解了强迫一条平行链的问题。由于共识机制本身的问题,增长中的验证人集合本质上导致了更高的延迟。将来每条平行链都可能给不幸的验证人造成很大的验证算法负担。

因此,验证人和/或其他权益持有者将会对添加一条新链来定价。这个链的市场要么是如下两种:

对网络没有净贡献的链(通过锁币或烧毁权益代币的方式,比如联盟链、Doge链、特定应用链);
通过提供一些别的地方没有的功能,能给网络带来更多价值的链(例如隐私性、内部伸缩性、内置服务)
我们最终会激励社区的权益持有者来添加子链——通过经济手段或根据给中继链添加功能的意愿程度。
可预期的是刚添加进来的新链会有一个短暂的移除期,这就允许新链可以先试验,无需任何妥协和长期价值风险。

 

8 结论

我们提出了一个异构多链协议的可能方向,它是可伸缩的且能够向后兼容目前已存在的区块链网络。在这个协议下,各参与方为了自身利益共同创造了一个完整系统,它可以用非常自由的方式来扩展,而且没有目前那些普通区块链对用户的固有成本。我们给出了这个架构的大体轮廓,包括需要的参与方角色、他们的经济激励模型和他们需要做的操作。我们已经弄清楚了一个基本的设计,并讨论了它的优势和限制;我们未来的方向就是消除这些限制,向完全可伸缩的区块链方案迈进。

8.1 遗漏的材料和开放问题

网络设计一般都是从协议实现中分离出来的。还没有完全讨论网络如何从这种实验性的条件中恢复。网络需要一个确定性的非零时间,他们从中继链分叉中恢复过来应该也不是个大问题,然而需要小心地集成入共识协议中。
本文也没有具体探讨押金的没收和对应的奖励规则。目前我们假设提供的是赢者全拿(winner-takes-all)的奖励原则:但可能给钓鱼人最好的激励。一个短周期的提交-披露流程支持很多钓鱼人来索取赏金,进而达到一个更公平的奖励分配制度,但这个举报恶意行为的流程也将会引入更大的延迟。

8.2 鸣谢

感谢那些帮助发表这篇框架性文章的校对者。特别提下Peter Czaban、Ken Kappler、Robert Habermeier、 Vitalik Buterin、 Reto Trinkler 和Jack Petersson。感谢那些贡献想法的人,特别提下MarekKotewicz 和Aeron Buchanan。感谢其他所有提供过帮助的人。所有的错误仍都是我的。
本文其中一部分的工作,包括对共识算法的初始调查,是由英国政府的Innovate UK项目资助。

相关文章:

Leave a Reply

消息接收
avatar
500
wpDiscuz