登录 注册
Polkadot(波卡链)> Polkadot白皮书(第4,5章)

【译者:岳利鹏 lipeng@chainx.org

【版权所有:因特链社区,国内最具前瞻性的跨链技术社区,未经许可,禁止转载】 


4    Polkadot的参与方

有四个基本的角色在维持Polkadot网络:收集人(collator)、钓鱼人(fisherman)、提名人(nominator)、验证人(validator)。在Polkadot的一个可能实现里,最后一个角色有可能会被拆分成两个:基础验证人和可用保证人(guarantor),将会在6.5.3节讨论。

四个角色.jpg

图1. Polkadot四个角色的交互

4.1      验证人

验证人有最高权限,帮助在Polkadot网络里打包新区块。验证人需要抵押足够多的押金,因为我们允许其他有资金的提名人推举一个或多个可以代表他们的验证人,所以验证人一部分的押金并不是他们自己所拥有的,而是属于提名人的。

一个验证人必须在高可用和高带宽的机器上运行一个中继链的客户端。每个区块上,节点都必须准备接收一个已提交的平行链上的新区块。这个过程涉及接受、验证、再发布候选区块。验证人的任命是确定性的,但实际上也很难预测。因为不能期望验证人拥有所有平行链的全同步数据,所以他们希望把这个提议平行链新区块的工作指派给第三方,也就是收集人。

不同的验证人小组一旦都确定性地批准了自己所属平行链的新块,他们就必须开始批准中继链自身的区块。这包括更新交易队列的状态(也就是从一条平行链的出口队列转移到另一条平行链的入队列)、处理已批准的中继链的交易集合、批准最终的区块、吸收平行链的最终改变。

在我们选择的共识算法下,会惩罚一个没有履行他们职责的验证人。最开始如果不是有意的错误,就只是会扣留他们的奖励,但如果是重复的错误会扣减他们的押金(通过烧毁),例如双向签名(double-signing)或合谋提供一个非法区块等可证明的恶意行为,会导致他们丧失全部的押金(烧毁一小部分,大部分奖励给信息提供方和诚实的验证人)。

在某种程度上,验证人和目前PoW区块链的矿池相似。


4.2      提名人

提名人是一个拥有权益的群体,他们把安全性押金委托给验证人。他们没有更多的角色,除了通过有风险地投放资本来表示:他们信任某个特定的验证人(或群体)可以代表他们维护整个网络。按照他们的入金比例,他们也会受到和验证人总押金同样比例的奖励和扣减。

和下面的收集人一样,提名人和目前PoW网络的矿工相似。


4.3      收集人

交易收集人是帮助验证人制造有效的平行链区块的群体。他们会运行一个特定平行链的全节点,这也意味着他们有全部的必要信息,可以打包新块并执行交易,就跟目前PoW区块链的矿工一样。在正常情况下,他们会收集并执行交易,并创建一个”未密封”(unsealed)的区块,再加上一个零知识证明一起提交给一个或多个当前负责提议(proposing)该平行链区块的验证人。

关于收集人、提名人、验证人的精确关系可能还会修改。起初,我们希望收集人和验证人能够紧密合作,因为可能只有一些(甚至一个)交易量很小的平行链。最初的客户端实现会包含一个RPC接口,来支持一条平行链的收集人节点把可证明的有效平行链区块,无条件地提供给一个(中继链)验证人节点。由于维持所有的全同步平行链的成本越来越高,所以我们设计了附加的结构,有助于分离独立的、经济驱动的、和其他的参与者。

最终,我们希望看到收集人群体为了更多手续费,竞争性地去收集信息。在一段时间内,为了持续增长的份额收益奖励,这些收集人可能只服务于特定的验证人群体。或者自由职业(freelance)的收集人也可以简单地创建一个市场,提供有效的平行链区块,而不是获得立即支付的竞争性份额奖励。同样地,去中心化的提名人群体也会允许多个有抵押的参与者来协调和分担验证人的职责。这种能力保证了参与的开放度,有助于成为更加去中心化的系统。


4.4      钓鱼人

不像其他的两个参与方,钓鱼人并不直接和区块打包的过程相关。他们是独立的“赏金猎人“,激励他们的是一次性的大额奖励。

准确地说,由于钓鱼人的存在,我们才能减少恶意行为的发生,即使发生希望也只是因为私钥不小心泄露了,而不是故意的恶意企图。起这个名字的出发点是考虑到他们期望收益的频率和最终奖励的大小。

钓鱼人只要及时举报并证明至少一个有抵押的参与方存在非法行为,他们就能获得奖励。非法行为包括对两个有相同父块的不同区块进行签名,或在平行链上批准一个无效区块。为了预防由于私钥泄露给钓鱼人所导致的过渡奖励,钓鱼人上报关于单个验证人的非法消息签名的基础奖励是从最小开始的,这个奖励会随着其他钓鱼人上报更多的非法签名而逐渐增加。依据我们基本的安全性假设:至少三分之二的验证人是诚实的,渐近线将设置在66%。

钓鱼人某种程度上和目前区块链系统的全节点相似,他们所需要的资源相对较少,也没必要承诺稳定的在线时间和大的带宽。钓鱼人有如此大的不同,所以他们只需要提交很少的押金。这个押金用于预防浪费验证人计算时间和计算资源的女巫攻击。它是立即可以提现的,很可能不会比等值的几个美金更多,但如果监测到一个不当行为的验证人,可能会收获很大的奖励。


5    设计综述

本章试图给出一个系统的全局完整描述。对系统更加深入的解释会在接下来的一章中给出。


5.1      共识

在中继链上,Polkadot通过一个现代的异步(asynchronous)拜占庭容错(BFT)算法达成对有效区块的相互共识。算法受简单的Tendermint和HoneyBadgerBFT启发。后者在有任意网络缺陷的架构下,只要满大部分验证人是诚实的,就能提供了一种高效的容错算法。

也许一个权限证明(PoA)模式的网络就足够了,然而Polkadot是个可以在全开放和公开的场景下部署的网络,不需要信任任何特殊的组织和当权者来维护它,因此我们需要一种管理验证人群体并且激励他们守法的方法。我们选择使用以PoS为基础的共识算法。

overall_cn.png

图2:Polkadot的概括性原理图。它展示了收集人收集并且广播用户的交易,也广播候选区块给钓鱼人和验证人。展示了用户提交一个交易,先转移到平行链外部,然后通过中继链再转移到另一条平行链,成为一个可以被那里的账户执行的交易。


5.2      权益证明

我们假设网络可以度量每个账户有多少权益(stake)。为了更轻松地和现有系统对比,我们把度量单位称为“代币”(tokens)。不幸的是由于它仅仅能作为对账户简单的价值度量,也没有任何个性化,因此多种原因使这个术语并不那么理想化。

通过一个被提名的权益证明(Nominated Proof-of-Stake NPos)结构,我们猜想验证人的选举不会很频繁(很可能是一个季度一次,最多一天一次)。通过按比例分配的增发出来的代币(很可能大约10%,最多每年100%)和收集到的交易手续费来进行激励。虽然货币增发一般都会造成通胀,但因为所有代币持有者都有公平参与的机会,所以代币持有者的资产不会随着时间而遭受损失,他们会很开心地参与到该共识机制中来。全网权益证明的开展所需的抵押必须达到一个特定的最小比例。会根据市场机制,达到有效的代币增发这个目标。

验证人严重依赖他们抵押进来的权益。现存验证人的押金会从他们离职的时候开始,要再保留更长时间(也许3个月左右)。这么长的押金冻结期是为了还能惩罚将来的不当行为,直到区块链周期性的检查点到来。不当行为会遭到例如减少奖励等的惩罚,如果是故意破坏网络的完整性,验证人将会损失部分或全部的权益,转移给其他验证人、信息提供者或全部权益持有者(通过烧毁)。例如一个验证人试图同时批准不同分叉上的两个分支(有时也被称为短程攻击),就会被后面的方法鉴别并遭到惩罚。

检查点锁定器(checkpoint latch)能规避长程“无权益抵押”(nothing-at-stake)攻击,防止比一般长度更长的高度危险的链重构(chain-reorganistation)发生。为了保证最新开始同步的客户端不会被误导进错误的链,网络会出现定期的“硬分叉”(最长也就是验证人的押金冻结期),把最近检查点区块的哈希值硬编码(hard-code)进客户端。将来通过逐步递减有限链的长度(finite chain length),或周期性地重置创世块(genesis-block),这种方法会运行得很好。


5.3      平行链和收集人

每条平行链将给中继链提供同样的安全性保证:平行链的区块头会被包含进中继链的区块中,还还跟着一些确认信息,用来保证不会发生链重构或双重花费(double-spending)。类似于比特币侧链和联合挖矿的安全性保证,Polkadot也强力保证平行链状态交易的有效性。会依据密码学算法,把验证人随机地分成很多个组。一条平行链对应一组,甚至每个块的组也都可能不一样。这个设置意味着中继链至少也要和平行链的出块时间一样短。本文不讨论分组的特定决定方式,可能要么是围绕类似RanDAO的提交-披露(commit-reveal)框架,要么结合平行链前一个区块的密码学哈希值。

这样的验证人组需要提供平行链的候选块,还要保证它们是有效的(否则损失押金)。有效性围绕两个重要的点:第一,它是内生有效的,所有的状态转换被公正地执行,包括引用的外部数据也被公正执行(比如交易)。第二,参与方需要可以简便地访问候选块的任何外部数据,例如外部交易等,然后就可以下载这些数据并手工执行候选块。验证人可以提交没有包含任何外部交易数据的空块(null),如果他们这样做,就要承受奖励减少的风险。他们和收集人在平行链的一个gossip协议上工作,收集人把交易收集到块里,并且要提供一个非交互的零知识证明(noninteractive zero-knowledge),用来证明本子块的父块是有效的(为该工作收取任何手续费)。

防止垃圾(spam)数据的方法留给了平行链协议自身:中继链本质上不规定“计算资源计量”和“交易费”。本质上也不强制平行链规定相关协议(尽管权益持有者不太可能愿意接纳一个没有提供合理机制的平行链)。这里明确地说明了并不会都像以太坊的手续费规则,也可以类似比特币的区块链手续费模型,或其他任何还没有提出来的垃圾预防模型。

Polkadot的中继链本身将很可能存在一个类似以太坊的账户和状态模型,可能是EVM的衍生版本。因为中继链节点将需要做大量的其他计算,将会通过提高手续费尽量减小交易吞吐量,我们的模型还会包含块大小的限制。


5.4      跨链通信

Polkadot最关键的部分是跨链通信。因为在平行链间可以存在某种信息通道,我们才说Polkadot是可伸缩的多链系统。在Polkadot中,通信可以很简单:一条平行链中的执行交易的时候(依据那条链的逻辑),可以给第二条平行链或中继链转发一个交易。目前生产环境中的区块链外部交易,都只能是完全异步的,他们并没有给它的来源方返回任何信息的原生能力。

queues.png

图3:一个基本的原理图,展示了路由已提交的交易(“提交”)的主要逻辑

为了保证最小的实现复杂度、最小的风险和最小的平行链架构束缚,这些跨链交易和目前标准的外部交易没有区别。这些交易会有个来源方字段,用来辨别平行链的身份,还有个可以是任意长度的地址。跨链交易需支付的手续费,并不像目前的比特币或以太坊系统那样,而是必须通过来源平行链和目的平行链的谈判逻辑来管理。一个在以太坊的Serenity版本中提出的改进提案,会是一个简单管理这种跨链资源支付的方法,尽管我们假设其他人会提出更先进的方法。

跨链交易的问题可以用一个简单的队列机制解决,这个队列用梅克尔树(Merkle tree)来保证数据真实。中继链的任务是把交易从来源平行链的出口队列转移到目的平行链的入队列。已转发的交易会在中继链上被引用,而不是中继链自身的交易。为了预防一条平行链往另一条平行链发送垃圾交易,规定在在前一个块结束后,发送每一个交易时,目标平行链的入队列不能太大。如果区块处理完后,入队列太大,那么目的平行链会被看做是饱和了,接下来的几个块里就不会再路由交易给它,直到入队列降到临界值以下。这些队列在中继链上管理,允许各平行链相互决定他们的饱和度大小。如果再往停滞的目标链发送交易,这样就可以同步地报告失败了(因为不存在返回路径,如果第二个交易也是同样的原因失败了,它可能也不会给来源调用者发送回复,这就需要用到一些其他的恢复方法)。


5.5      Polkadot和以太坊

归功于以太坊的图灵完备特性,至少在简单的可论证的安全性边界内,我们期望Polkadot和以太坊有丰富的交互可能性。简而言之,我们预想到了,从Polkadot出来的交易,可以让验证人先签名,然后再喂给以太坊,在那里通过一个交易转发(transaction-forwarding)合约来解释和执行。反方向,我们也预想到了,从以太坊上的一个“外向合约”(break-out contract)中的特殊格式日志,可以快速地证明一个消息是否真的要被转发。


5.5.1      从Polkadot到以太坊

通过选择一个拜占庭容错算法,验证人经由授权投票产生的一系列权益持有者组成,我们能够获得一个安全的共识机制,用不经常更改的合适数量的验证人。在一个总共有144个验证人的系统内,4s出块时间和900个块的最终性(允许举报、惩罚、修复类似双向投票的恶意行为),一个区块的有效性可以合理地考虑为用最少97个签名证明(144的三分之二再加一),然后跟着的是60分钟无风险注入的验证时间。

以太坊可以包含一个控制和维护144个签名的“内向合约”(break-in contract),由于椭圆曲线数字签名的验签操作只要花费EVM 3000 gas的计算量,而且因为我们只希望验证操作发生在大多数的验证人里(而不是全体),以太坊确认一个从Polkadot来的指令的基础花费不会超过300,000 gas——仅仅是区块550万gas限制的6%。增加验证人的数量(只有在处理数十个区块链的时候才必要)不可避免地会增加成本,然而很明显可以期望到随着以太坊技术的成熟和架构的改进,交易吞吐量会随着时间而增加。另一个事实是不是所有的验证人都会参与(例如只有最高押金的验证人才会做这个任务)这种结构的限制会比较合理。

假设这些验证人每天轮换(更保守的、更可能接收的是每周,甚至每月),网络给维持这个以太坊转接桥的成本大约是540,000 gas每天,或者按照当前的gas价格,45美金一年。一个通过转接桥的基本转发交易会花费大约$0.11;当然另外的合约计算会耗费更多。通过缓存和捆绑多个交易,内向的交易花费可以简单地分担,减少每个交易的花费。如果一次转发需要凑够20个交易,那么转发一笔基本交易的花费会降低到大约$0.01。

在这个模型中,Polkadot的验证人节点除了签名消息之外只需要再做很少的事情。为了能够把交易路由到以太坊网络里,我们假设任何一个验证人需要属于以太坊网络,更可能的只需提供很少的奖励给第一个在网络上转发消息的人(奖励会支付给交易发起人)。


5.5.2      从以太坊到Polkadot

使用一个叫做日志的概念,把交易从以太坊上转发到Polkadot上。当一个以太坊合约希望派生出一个交易给Polkadot上面的某一条平行链,它只需简单地调用一个特殊的“外向合约”就好。那个外向合约会索取任何必须的费用,然后生成一个日志打印指令,以便于通过梅克尔树和有块头哈希来证明它的存在。

在下面的两个情况中,可以非常简单地证明有效性。原则上,唯一的要求是每个Polkadot节点都要运行一个全同步的标准以太坊节点。然而这本身就是非常重的依赖。一个更轻量的方法是提供一个简单的证明,仅需要包含正确执行该交易所必须知晓的以太坊的那部分状态树,然后再检查日志的有效性。这种类似简单支付验证(SPV-like)的证明不需要提供大量的信息。更方便的是,验证人可能完全不需要自己运行节点,Polkadot内的押金系统能支持第三方参与者来提交块头,因为其他第三方(也就是所说的钓鱼人)也可能提供一个他们块头是无效的证明(具体地说就是状态根和回执根是错误的),所以这些人也冒着损失他们押金的风险。

在一个类似以太坊这样的无最终确定性(non-finalising)的PoW网络上,不可能存在最终可证明的一致性。为了适应这个,程序需要依赖一定的块确认数量,或者直到那个依赖的交易已经在链内某一特定深度了。在以太坊上,这个深度从最脆弱的1个块(网络都还不完全知道)延伸至1200个块(从Frontier上线到以太可交易)。在Homestead的稳定版本上,大部分交易所选择了120个块这个数字,我们也可能会选择相近的参数。

所以我们可以想象Polkadot这边的以太坊接口有一些简单的功能:可以接受以太坊网络的新块头,并能验证它的PoW,可以结合一个有足够深度的块头(还有Polkadot内转发的相应信息),来验证从以太坊那边的外向合约打印出来的特定日志的证明,还可以接收关于之前收到的但还没有确定的块头里包含无效的回执根的证明。

需要有一个转发激励机制,才能够真正地在Polkadot网络里得到以太坊块头的数据(还有任何关于有效性和一致性的SPV证明)。这可能设计成只是个简单的支付行为(由在以太坊那边收集的手续费资助),转给任何能够提供一个有效块头的人。为了能够应对分叉,验证人需要保留最近几千个块的信息,要么由协议原生支持,要么通过中继链上的合约。


5.5.3      Polkadot和比特币

Polkadot和比特币的交互是非常有挑战性的:从两边的网络角度考虑,一个所谓的“双向锚定”架构会非常有用。然而由于比特币的局限性,如何提供一种安全性的锚定个是非常艰难的任务。可以使用类似以太坊的流程,从比特币转发一个交易到Polkadot:由一个受Polkadot验证人控制的“外向地址”(break-out address)来托管转账过来的代币(和附属的数据)。可以通过结合一个确认期,来激励先知(oracles)提供SPV证明,先知们通过标识一个非一致性的区块,来证明一笔交易存在双花的可能。任何在外向地址里托管的比特币原则上也被相同的验证人群体控制。

问题是如何保证这些比特币,是被轮换的验证人集合所控制的。相比于以太坊那样可以根据在合约内任意组合签名规则的方法,比特币的局限性就更多了,大部分的比特币客户端只接受最多3方的多重签名。扩充至36个或者大家希望的最高至上千个的终极提议,在现有的比特币协议里还不可能实现。一个选择是修改比特币的协议来支持这个功能,然而硬分叉在比特币的世界里非常难以安排和讨论。另一个可能性是使用门限(threshold)签名的方法,用密码学的结构来构造一个被被多个私钥片段共同控制的公钥地址,要制造一个有效的签名需要这些人的大部分或全部人都参与。不幸的是,和比特币的ECDSA相比,门限签名计算起来非常耗资源,而且是多项式级别的复杂度(polynomial complexity)。

由于入金的安全根本性由有抵押的验证人决定,所以另一个选择是减少多重签名的私钥持有人数量至只有重度质押的验证人才能参与,这样门限签名就变得可行了(或者最糟糕的情况,也可能直接用比特币的原生多重签名)。由于要预防验证人的非法行为,这个方法会降低可托管的比特币总量。然而这是一个优雅的妥协,可以简单地设置能够安全地在两个网络里的转移的基金总额上限(验证人攻击失败可能会受到的押金损失,和攻击成功可能的会收到的比特币潜在收益对比)

因此,我们认为在现有的比特币框架下,开发出一个能够在两个网络间安全转移比特币的平行链是不现实的,尽管如此,比特币的持有者还可以在不确定的将来协调这些工作。


关于我们

“因特链” 致力于打造国内最具前瞻性的区块链和跨链技术社区目前主要讨论的公有链项目有Cosmos、Polkadot、EOS、IPFS、Dfinity、Plasma、0xproject、KyberNetwork等。

公司

 联系我们

 浙江-杭州

 lipeng@chainx.org

【浙ICP备17025508号-1】