1. 首页 > 知趣科技

波卡Polkadot白皮书全文一览(中文版)

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)。

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

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

6 协议细节

本协议可以大致分为三个部分:共识机制、平行链接口、跨链交易路由系统。

6.1 中继链操作

中继链会类似以太坊,也是基于状态的,包含一个账户信息到状态存储的映射关系,其中信息主要包含余额和交易计数器(防止重放)。把账户系统放在这里的目标是:记录每个身份在系统里控制了多少权益。但还有一些值得注意的差异:

不能通过交易部署合约;这是为了让中继链尽量缺乏功能性,不支持公开部署合约。

没有资源计数器(gas);因为公众能够调用的一些功能是固定的,gas记录系统的原理就不适用了。因此在所有功能中,会使用一个更通用的手续费标准,这样就能更高效地执行那些动态代码,交易格式也会更简单。

会有一些包含特殊功能的默认合约,他们管理交易的自动执行和网络消息的输出。

中继链会有一个基于EVM的虚拟机,但为了最大程度地简化会做很多修改。它会有一些内置合约(类似于地址在1-4之间的那些以太坊合约)运行平台的特定功能,包括共识合约、验证人合约、平行链合约。

如果不用EVM,很有可能会选择Web-Assembly(Wasm);这样的话,所有结构还是相似的,但是这些基于Wasm的内置合约使用的是通用功能的语言,而不再是EVM上面的那些带有很多限制的不成熟语言。

还可能借鉴目前以太坊上衍生出来的其他方面的概念,例如在Serenity版本中提出来一些改变,比如为了能在一个块里并行执行那些没有状态冲突的交易,将交易的回执格式简化等。

Polkadot有可能会部署一个类似于Serenity的纯净(pure)区块链系统,它不包含链的任何基础协议。但我们觉得这会带来更多的复杂性和开发不确定性,所以不太值得在目前阶段就去实现这么一个更高效且简介的伟大协议。

为了管理共识机制,需要很多小片儿的功能:验证人集合、验证人机制、平行链等。这些都可以放在一个整体的协议中。然而为了实现模块化,我们会把这些描述成中继链的合约。这意味着他们都是中继链共识机制管理的对象(类似面向对象语言),但不一定是类似EVM的字节码,也不一定能通过账户系统寻址。

6.2 权益合约

这个合约管理着验证人集合:

哪些账户是验证人;

哪些在短期内可以变成验证人;

哪些账户为了提名验证人而质押了权益

每个人的属性,包括余额、可接受的押金比例、地址列表、会话(session)身份

它让账户在想成为验证人的时候可以来注册(需满足某些要求)、也可以提名某用户、在想退出验证人角色的时候还可以来退出。它自身还包含了一些用于验证和达成一致性的功能。

6.2.1 权益代币的流动性

通常我们希望能从网络中把尽可能多的权益代币都抵押进来,因为这关系到抵押权益的总市值和网络的安全性。这可以很简单地通过货币增发和收益分发来激励验证人。然而,这么做会出现一个问题:如果代币都被抵押在权益合约里,用于防止作恶,那么如何保证代币在一定程度上的基本流动性,进而支持价格发现呢?

一种方法是提供一个前向衍生合约来管理由抵押代币衍生出来的二级代币。但这在非信任的情况下很难实现。这些衍生代币无法等值交易,原因就和欧元区的不同政府发行的债券一样:抵押的代币有可能被扣减而价值降低。至于欧洲政府,他们还可能会违约。对于由验证人质押而来的代币,要考虑到验证人的恶意行为可能会遭到惩罚的情况。

基于我们的原则,我们选择了一种更简单的方案:不能把所有的代币都质押进来。这意味着一部分(可能20%)代币会被强制保持可流通的状态。尽管从安全的角度上讲,这个方案不完美,但也没有从根本上影响网络的安全。相比于100%的质押,也将只可能没收80%的权益作为赔款。

我们还将会使用一个反向拍卖机制来公平地决定质押代币和流通代币的比例。有兴趣成为验证人的代币持有者可以给权益合约提交一个请求,说明他们希望支付的最小比例。每次会话(会话可能每个小时算一次)开始的时候,系统会根据每个意向验证人的押金和支出比例来填满验证人的插槽。一个可能的算法是从提交押金的验证人中,选择那些押金满足如下条件的人:押金不高于“总押金目标/插槽数量”且不低于“次低押金”的一半。如果不够填满这些插槽,那么我们会迅速降低这个“次低押金”来满足条件。

6.2.2 提名

用户可以把手中的权益代币非信任地交给一个已激活的验证人,让他们来履行验证人的职责。提名通过一个“批准-投票”系统来完成。每个准提名人可以给权益合约提交一个声明,指出他们信任的可以履行职责的一个或多个验证人的身份。

在每个会话期间,提名人的押金会散布给一个或多个代表他们的验证人。这些验证人的押金是等额分配的。提名人的押金用于验证人承担他们的责任,将能够获得利息或承受相应的扣减。

6.2.3 押金没收/烧毁

验证人的某些行为会导致惩罚性地没收他们的押金。如果押金降低到允许的最小值,会话就会提前结束,另一个会话开始。一个不完整的将导致惩罚的行为列表:

属于一条平行链的验证人小组,却不为该平行链的区块提供合法性验证;

签名了该平行链一个不合法的区块;

不去处理出口队列中被投票为已生效的消息;

不参与到共识流程中;

在中继链两个竞争性的分叉上同时签名。

有些行为会威胁到网络的完整性(例如签名不合法的平行链区块,或者签名多个分叉),为了驱逐这些验证人,会没收他们的押金。另外还有一些不那么严重的行为(例如不参与到共识流程中)或者那些无法清晰判别的行为(例如处于一个低效的小组),只会导致一小部分的押金被处罚。在后一种情况中,可以采用一个二级小组的搅拌功能来让恶意节点遭受到比正常节点更多的惩罚。

因为实时同步每条平行链的区块是个非常大的工作,所以在某些情况下(多叉签名和不合法签名),验证人无法很方便地检测到自身的不当行为。在这里有必要指出验证人之外的一些参与方也可以举报这些非法行为,并从中获得奖励,但他们和钓鱼人还不太一样。

 3/7   首页 上一页 1 2 3 4 5 6 下一页 尾页

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:http://www.longfuchaju.com//zqkj/4288.html

联系我们

在线咨询:点击这里给我发消息

微信号:wx123456