作者:Daniil Gorbatenko
翻译:红军大叔&BlockPunk & HunterBJ
社区:果壳宇宙(ID:DfinityFun)
译者按
我们来回顾一下DFINITY的目标:“建立互联网级别的去中心化云,让全世界的软件可以在这个云上运行”。三部曲的第二篇将从一个整体视角,来介绍DFINITY为实现目标做出了哪些努力。
需要注意的是,到目前为止,DFINITY团队仅对DFINITY的共识协议和链上治理做出了详细的介绍,相对来说分片、软件及数据管理等方面讨论的比较少。要完全理解DFINITY,还缺乏一些与token相关的,发行、供应的经济学细节。
共识机制
DFINITY最大创新在于共识机制。DFINITY的共识机制其实是包含了多个部件的,每个部件不同的方法。共识分别有四层:身份层、随机数灯塔层、公证层、分叉决议层。我们来逐层的进行讨论。
身份层
DFINITY虽然是PoS机制,但和现在流行的委托方案有所不同,DFINITY中不会存在任何的特权节点(比如超级节点或100强验证人)。一个节点(即客户端)要想参到网络中进行出块,必需满足最低的硬件需求才能进行注册,还需要质押一些DFN作为保证金,以此来确保每一个节点能尽职尽责。在网络发展到成熟的情况下,DFINITY网络预计将运行数百万个客户端。和以太坊类似的是,每一个客户端必需锁定一些token作为权益证明(PoS),但严格来说其目的是为了抵御女巫攻击,并激励对整个系统有益的行为。
随机数灯塔层
DFINITY上共识算法的核心是随机数。随机数允许了在去中心化的网络中,不需要特别繁琐的通信过程(比如比特币),就可以选出唯一一个的“领导者”进行出块。在PoW系统里, 挖矿节点必需提供一个叫做“nonce”的随机数,来证明自己具备出块的权力,这个随机数是通过蛮力穷举得出的。
DFINITY在其“随机数灯塔层”上,用了一种完全不同的方法来产生随机数,这个方法被称为“阈值签名接力”。DFINITY的共识是按轮次(epoch)进行的,每一轮里系统会根据上一轮的随机数,选出一个包含了多个节点的组网(称为阈值组,TG)。然后组网的节点们会发送一个特殊交易,为自己的阀值组注册公钥并创建身份,这个过程同时还会给每一个阈值组的成员都分配一个专门用来创建“共享签名”的密钥(与控制自己财产的密钥不同)。然后,当前阈值组的成员会使用这个密钥签名上一轮共识产生的随机数,并广播“共享签名”的结果。
当系统收集到足够多的“共享签名”后,就可以把多个签名聚合成一个阈值签名,这个值就是本轮共识产出的随机数。整个过程可以看作是运行一个可验证随机函数(VRF),或者说是在连续更新一系列的随机值。
这个方案在密码学上的安全性,是基于BLS签名的。BLS论文的作者之一Ben Lynn,目前是DFINITY团队的全职成员。在每一轮共识结束时,产出的随机数会被用来选择节点从而生成下一个阈值组,让生成随机数的工作在不同的节点组间接力(这也是阈值接力的由来)。
这种产生随机数的方法,比起PoW的穷举计算来,可以节省很多的计算资源,因为每个节点只需要在每一轮次开始的阶段,生成一个“共享签名”即可。阈值组的成员只需要单独地对上一轮产生的随机数签名,并在网络中广播即可,节点之间是不需要交换信息的,所以整个流程执行的会非常快。一但系统在这一轮里收到的“共享签名”数量,达到了临界值(即为阈值,一般为50%),那么系统就可以计算出这一轮的随机数了。这就是“阈值签名接力”中,“阈值”术语的来源。这个方案的神奇之处在于它的“唯一性和确定性”,这意味从同一阈值组中,只要收到的“共享签名”的数量达到了阀值,不管是选取的哪个节点的结果,都会生成唯一的一个随机数。
公证层
这些阈值组不仅在每一轮共识里产生一个随机数, 而且还会使用这个随机数,为本轮打包的区块作“公证”。DFINITY的“公证”本质上是给区块打上一个复杂的时间戳,它能确保在本轮共识里,打包产生的区块能被添加到链上。按照DFINITY团队的说法,这个过程是根据最高原则执行的(只选择权重最高的区块,权重同样由随机数确定),阈值组成员之间无需进行通信,这节省了大量的时间。
分叉决议层
然而公证机制可能会失效的,因为在某一轮里,阈值组的成员偶尔会公证两个区块,这时就产生了分叉。这种情况下会启动分叉决议的流程,它在下一轮中使用一个叫概率插件协议,来从多个被公证区块中选出一个唯一的结果。
DFINITY共识机制,可以大大的缩短出块共识的时间(低至一秒),且一个交易在两个区块时间之后,就可以做到最终不可逆的确认,这是因为分叉决议需要在下一轮中完成。这两点与目前最主流的区块链形成了鲜明对比。
分片
考虑到DFINITY最终目的是要在链上运行世界上大多数的软件,所以不太可能只在一条链上跑,因此必须考虑分片技术。然而DFINITY是特别适合做分片的,因为前面讨论过的多个阈值组间,可以很轻松的并列运行。
DFINITY的实现关键,在于片间通信和保持片间账目的一致性,应该有一个片间协作的机制,但这部分的实现并没有在公开。
软件与数据管理
Dfinity的客户端不仅负责达成共识,还负责运行和存储那些部署在网络上的软件。这意味着每个节点都必须为DFINITY上运行的软件子集(软件子集对应着不同的分片)提供存储和计算资源。
DFINITY上面运行的软件可以使用任何一种编程语言开发,因为最终是编译为WASM字节码的形式,因此允许软件在浏览器上直接运行。当然,未了更好的优化软件开发体验,DFINITY团队专门开发了一门全新的语言ActorScript。
DFINITY以这种方式运行软件的主要好处是不需要API和数据库。例如,数据可以直接存储在软件里(反例就是数据必须存储在RAM里的EOS合约)。这极大地简化了软件的创建和管理,并补偿了分片执行软件的成本(多个分片并行执行同一应用程序时,需要建立对每一个分片都建立一个副本,因此存在成本问题)。
治理
在治理方面,DFINITY做了不少创新。DFINITY引入了一个名为“神经元”的投票单元系统,共同组成一个区块链神经系统。乍一看,这种安排非常类似于EOS使用的委托权益证明(DPoS)投票模型,因为DFINITY的上的神经元所有者,都拥有与其持有token数量成比例的投票权。EOS的DPoS模式是不受学者和区块链从业者的待见的,大家普遍为这样是非常低效的。
然而,DFINITY的治理就要复杂得多了。通过设置神经元自动地追随其他神经元的投票选择,它允许神经元近乎完全程序化地做出投票决定。这些被追随的神经元的所有者,可能是专家或社区的KOL。神经元所有者必须将DFN锁在神经元中才能投票,同时还能获得投票的报酬。
这种模式主要是为了解决投票参与率低的问题,这个问题一直困扰着其他token-holder-voting(token持有者参与投票)的方案。即使一个持币者不愿意经常关注项目的进展,也懒得去判断投票的结果,那么他就可以将投票委托给一个了真正了解DFINITY的人。
当然,这种方法并没法阻止神经元被试图作恶者骗走选票,但如果某些意见领袖支持的决策会损害整个网络的机制,那么token的持有者将会主动取消追随,因为这关系到他们质押的DFN的价值。这样做的主要是为了阻止作恶者损害到token的经济价值。
DFINITY的这种方法还潜在地降低的系统的中心化,削弱了单个节点对网络的控制。与EOS或Lisk中的委托不同,DFINITY上的知名的权威节点虽然有归票的能力(当然它得说服别人信任他),但不会直接获得委托投票的报酬,因此不存在DPoS被诟病的中心化,以及系统鲁棒性弱(只要集中攻击21个节点就可以破坏网络)的问题。
总结
总的来说,Dfinity是一个多管齐下、高度复杂的项目,随着更多细节的发布,它的具体实现在未来会变得更加清晰。DFINITY的理想非常宏伟,它将引入多种技术创新,并实现无上限的可扩展性,最终为全球的软件用户提供服务。
网友评论