ADA共识算法Ouroboros简介
Posted 飘飘白云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ADA共识算法Ouroboros简介相关的知识,希望对你有一定的参考价值。
ADA
项目简介
名称
ADA
,中文称为艾达币,是卡尔达诺(Cardano
)的代币,Cardano
项目发起于2015年,名字的由来是来自16世纪的意大利数学家Gerolamo Cardano
。而 ADA
则是以19世纪英国贵族 Ada levea
的名字来命名,她是拜伦的女儿,被称为人类史上的第一位程式员。
团队
卡尔达诺的整个团队由卡尔达诺基金会,Input Output HK
(简称 IOHK
)和 Emrugo
公司三方组成。
卡尔达诺基金会:负责规范,保护和推广卡尔达诺协议技术;
Emrugo
:负责开发、支援和孕育商业企业,协助将这些业务整合到卡尔达诺的分散区块链生态系统中,类似于公司的市场推广;
IOHK
: 是一家成立于香港的世界级区块链工程公司,负责卡尔达诺项目的技术开发,由Charles Hoskinson
和Jeremy Wood
两位重量级人物创办。
目标
卡尔达诺要实现的是一个非常宏伟的计划。其它公链基本是瞄准目前公链存在的某一个问题去解决,比如:EOS
和 IOTA
追求可扩展性,他们宣称可以达到很高的 TPS
(每秒交易数);AE币
和瑞波币致力于可交互问题的解决;达世币和泰达币致力于解决治理性的问题,而卡尔达诺试图解决目前底层公链存在的所有问题。
卡尔达诺想要解决目前区块链生态面临的三个问题:
可扩展性(
Scalability
):通过分层技术及共识机制。
可交互性(Interoperability
):通过侧链来解决币种之间的直接交互。
可持续发展性(Sustainability
):通过链上资助计划,每个区块奖励的一部分会流入国库(treasury
)中,国库会对最热门的提议释放资金,来鼓励和资助开发者实现这一改进方案。
本文主要关注可扩展性。卡尔达诺主要通过分层技术及共识机制来解决可扩展性问题。
可扩展性实现
分层
分层的逻辑是将不同的交易在不同的层级里去完成。卡尔达诺将其架构分成了清算层和计算层:
清算层(
Settlement Layer
):卡尔达诺的代币ADA
在该层流动,是卡尔达诺整个系统的基础。可以把清算层理解为升级版的比特币系统。
计算层(Computation Layer
):卡尔达诺将在该层提供智能合约,身份认证,消息通信等等功能,以方便开发者在此开发DAPP
。可以把计算层理解为升级版的以太坊系统。
共识机制
共识机制类似于区块链生态中的宪法,或者说平台治理的价值观。目前主流的三种共识机制:
工作量证明(
POW
):Proof of Work
,依赖机器进行数学运算来获取记账权,资源消耗相比其他共识机制高、可监管性弱,同时每次达成共识需要全网共同参与运算,性能效率比较低,容错性方面允许全网50%节点出错。典型代表比特币。
权益证明(POS
):Proof of State
,节点记账权的获得难度与节点持有的权益成反比,相对于POW
,一定程度减少了数学运算带来的资源消耗,性能也得到了相应的提升,但依然是基于哈希运算竞争获取记账权的方式,可监管性弱。典型代表以太坊。
权益代理证明(DPOS
):Delegated Proof of State
,与POS
的主要区别在于节点选举若干代理人,由代理人验证和记账。其合规监管、性能、资源消耗和容错性与POS
相似。这种机制有些偏于中心化,但极大地提高了共识和出块效率。典型代表EOS
。
卡尔达诺采用了一种称之为乌洛波洛斯(Ouroboros
)的共识机制,这也是一种POS
机制,与通常的理解的权益代理证明(Delegated Proof of Stake
)不同,它是动态权益证明(Dynamic Proof of Stake
)。
乌洛波洛斯
POW
是算力竞赛,设计一个计算哈希的难题,谁先算出来谁赢,算力高的赢的概率高,算力低的赢的概率低,以这样的方式保证胜出者是随机的,且易于验证。POS
是选举,根据区块链账本中股权者所拥有权益的比例,随机投票选举下一个出块人。POS
的选举投票需要在非常多的节点之间达成一致,这对一致性验证、防伪等要求较高。为了解决POS
达成一致性效率低以及无利益攻击(Nothing-at-stake attack
)的问题,DPOS
采取在拥有权益的有限集合范围内(即Leader
之间)进行投票达成一致。
验证基于链的POS
方案尝试从链上现有数据入手,比如使用上一个区块的哈希值,上一个区块的时间戳等等来作为随机数的来源,但这些会带来额外的安全风险。因为区块本身的信息就是节点写进去的,然后又要根据这些信息来选取后续的出块者,存在循环论证的嫌疑,安全性不会太好。这也是为什么普遍认为POS
方案不如POW
可靠的部分原因。
为了确保区块链的安全性,选取股权者来产生区块的方法必须是真随机的。为了实现领导者选举(Leader election
)过程的随机性,IOHK
首席科学家Aggelos Kiayias
教授领导的团队设计了名为乌洛波洛斯(Ouroboros
)的共识机制。乌洛波洛斯是第一个具有科学凭证其安全性的权益证明协议,该协议由系统随机筛选产生记账者,从而不会产生恶意攻击。下面就来详细介绍该机制的运作过程。
随机数协议
简单随机数协议(Coin-Tossing
)
假设张三李四要玩剪刀石头布,用传统方式作弊者如果稍微出的晚一点,可以等看到对方的手势后再做选择。为了防止这种情况,他们分三步执行一套“分歧终端机”流程:
先各自做出选择,然后把自己的选择做个哈希,交换这个哈希;
等双方都收到对方的哈希后,再交换双方的选择;
验证对方的选择和之前的哈希一致;
这样双方都知道了对方的选择,也能确认对方的选择是提前就做好的。这个哈希值就叫做承诺(Commitment
),因为它里面包含了保密信息,但又没有泄漏保密信息,而最终发送对应的保密信息,就叫做打开承诺(Open
)。
多方随机数协议
简单随机数协议只是一个两方参与的协议,下面扩展该协议来设计一个生成多方随机数协议:
每个节点在本地产生一个随机数,并把它的承诺广播给其他人;
当它收到所有人广播的承诺后,再把打开也广播给其他人;
最后大家把得到的随机数异或到一起,因为异或操作满足交换律和结合律,所以操作顺序不影响结果;
最终大家都得到了一个一致的无法被操纵的随机数。但这个协议的问题在于,部分节点可能因为网络掉线或者因为恶意可以选择终止协议不发送自己的打开,会使得其他人无法进行下去。
可验证秘密共享(Verifiable Secret Sharing
)
为了解决多方生成随机数协议中部分节点不可用的问题,乌洛波洛斯引入了可验证秘密共享方案。该方案的规则如下:把一个需要保密的信息,拆分成N
份,分别发送给N
个人,只要恶意节点不超过一定数量,最终大家可以综合各自的信息片段把原始信息还原出来。并且就算分发者如果作弊,也可以检查出来。
结合该技术,就有了一个完整的随机数生成协议了。下面综合一下来看整个协议流程:
提交阶段(
Commitment phase
):每个节点本地生成随机数和对应的承诺,同时把随机数拆成N
份匹配其他的投票节点,并且用相应投票节点的公钥对每一份信息进行加密,保证它只能被对应的节点解密,然后把承诺和加密后的拆分信息一起广播给区块链。
打开阶段(Reveal phase
):当大家收到大部分节点的承诺和拆分信息后,每个节点把自己的打开广播到链上。
恢复阶段(Recovery phase
):每个节点检查是否有节点发送了承诺但没有发送打开,如果有,则解密自己对应的那份拆分信息并发布,然后根据大家发布的拆分信息恢复出该节点的随机数。现在大家就有了所有节点的随机数,把它们异或到一起,最终得到了一个一致的随机数。
追寻中本聪算法(Follow the Satoshi (FTS)
)
有了安全的随机数,就可以以该随机数作为随机源,按照各节点的权益比例选择出下一个出块的Leader
,乌洛波洛斯是通过追寻中本聪算法来实现该选择过程的。
+-----+
SEED --->| FTS |---> ELECTED_SLOT_LEADERS
+-----+
追寻中本聪算法的原理非常简单:将所有的权益组成一棵Merkletree
,其形式是非叶子节点的权重为左右子树的权重之和,叶子节点的权重即为某个权益所有者的权益值。然后根据随机数在左右子树中进行选择。
下面分别就选择与验证两阶段来介绍:
选择
从该Merkletree
的根节点开始,以前面生成的随机数作为随机源,使用伪随机数生成器生成一个小于当前树节点权重的随机数,如果该随机数小于左子树的权重则选择左子树继续遍历,否则选择右子树继续遍历,直到选择某一个叶子节点,也即选择了该叶子节点所代表的权益所有者作为下一个出块的Leader
。
验证
由于使用的是伪随机数生成器,因此当不同生成器使用同一个随机数当做随机源来生成随机数序列时,该随机数序列是相同的。因此验证的过程与选择的过程类似,从该Merkletree
的根节点开始,以前面生成的随机数作为随机源生成随机数进行节点选择,然后比较选中的树节点的哈希值,相等则验证通过。
实现
在Cardano
的运行中,时间被分为 slot
,每个 slot
时长为20
秒。每个slot
只能产生一个块,若这个块有问题,或者应该产出这个块的“矿工”(也就是stakeholder
的候选人)不在线,或者产出的块没有广播给大多数人,那么这个slot
是当作废弃的,也就是会跳过这个slot
的块。多个slot
为一个 epoch
,权益的计算是以每个epoch
开始前的历史来计算,也就是说在这个epoch
中所产生的权益变化不影响当前的这个epoch
中的slot
的出块者的选择和其他和历史相关的东西。当前epoch
中所产生的这些历史只能在以后的epoch
中生效。
把每个epoch
的slot
分成10
等份,整个epoch
被分为了三个阶段:Commitment Phase
, Revel Phase
, Recovery Phase
,分别占比4:4:2
,对应可验证秘密共享协议的三个阶段。
具体的实现流程如下:
1. 从链的真正创世块开始,硬编码进入了一些公钥和这些公钥对应的权益S
及初始的随机种子ρ
,之后,这个epoch
会采用这些基础信息继续运行。
2. 每个节点自己独立运行代码,根据当前epoch
的随机种子ρ
,执行追寻中本聪算法F
,把genesisblock
中的权益,随机种子ρ
和slot
的index
作为输入,根据概率获得当前这个slot
应该由谁出块。若发现是自己出块,则执行打包交易等等操作,和bitcoin
没有太大区别,但是除了基础工作之外,还会生成一个随机数,但是这个随机数不放到链(块)中,而是放一个承诺Com
中。若不是自己出块,则等待出块者出块并广播。收到这个块的时候就进行和bitcoin
类似的检查,要是长时间未收到(超出这个slot
的时间)则会认为这个slot
的块废弃。
3. 在当前epoch
中不断重复2
的流程直到这个epoch
中的所有slot
结束。
4. 在整个epoch
的过程中会产出一个在这个epoch
参与出块者们(slot leaders
)都共同认同的随机种子ρ
。
5. 在自己的内存里记录好这个随机种子ρ
及下一个epoch
参与的stakeholders
,开启下一个epoch
周期,进入2
的流程。
引用:
以上是关于ADA共识算法Ouroboros简介的主要内容,如果未能解决你的问题,请参考以下文章