您正在查看: Cross chain-优秀转载 分类下的文章

干货 | 共识算法的比较:Casper vs Tendermint

权益证明的漫漫长路

权益证明的定义可以查看理解权益证明。

1982年,拜占庭将军问题首次被Lamport,Shostak和Pease提出。Cosmos的Ethan Buchman这样描述它:”这是一个在可妥协的通信网络中实现分布式协议的问题,也就是在不可靠的环境中建立一个可靠的系统的问题“。从1982年到1999年,都没有人能够创造一个可以解决拜占庭将军问题系统。长久以来,拜占庭将军问题与计算都是无关的,因为在那个时候,互联网演进出基于云的中央中心化计算模式,所需要解决的只是容错问题。

所以,故障容错算法得到普及,例如1998年发明的Paxos算法和2013年发明的Raft算法被广泛的应用。而1999年发明的实用拜占庭容错(PBFT)却没有被学术界之外采用。直到2008年,中本聪将网络规模级别的分布式拜占庭容错(BFT)算法设计到区块链方案中,才使拜占庭容错得到推广。当这种原型出现之后,系统研究界的人都开始围绕将学术界“奇物”应用到真实世界而去构思各种想法。

在2011年,BitcoinTalk论坛对一个叫做权益证明(PoS)的概念组织了一场讨论。最初的PoS协议例如点点币,实现结果的并不理想。第一个真正提出将BFT研究应用到PoS公有区块链环境中是Jae Kwon,他在2014年创造了Tendermint。

在当时,PoS研究做出了很大的假设:假设系统中的一系列对等节点都是静态的,并且在长时间内都是稳定的。在区块链环境中完全是不现实的。 Jae Kwon的重大突破是使Tendermint能够使用区块,哈希链接,动态验证器集合和循环的领导者选举来将BFT研究适应复制状态机(区块链)的领域。

在Tendermint环境中,出现了大量的共识算法(Honeybadger, Ouroboros, Tezos, Casper),它们都包含了BTF研究的元素以及在区块链上其他模块观察的元素。

为权益证明做的所有研究都指向一个重要问题:在不耗尽物质稀缺资源的情况下,我们可以达到工作量证明(PoW)的安全级别吗?这个问题可以转化为:PoS的投票权以链上货币计价而不是计算力计价。区块链的POS共识问题比可扩展性更被广泛讨论,运行PoW挖矿的高开销成本以及环境外部性方面存在的问题都刺激了大量资源涌入PoS安全研究。

本文主要探讨了在加密货币中使用了权益证明的三个主要PoS协议的特性:由Vlad Zamfir带领研究的Casper the Friendly Ghost(CTFG)和由Vitalik Buterin带领研究Casper the Friendly Finality Gadget(CFFG)以及Jae Kwon带领研究的Tendermint

权益证明的陷阱

无利害关系

起初,有多种不同的说法来描述权益证明的一般陷阱,无利害关系就在这时被提出。Jae Kwon 2014年5月以“错误选择谬论”的不幸名字第一次提到这个问题。在2014年7月Vitalik把比特币开发者所描述的确切定义的问题普及推广为“无利害关系”。问题呈现出此情况:验证者通过在给定高度为多个有冲突的区块投票可以有效的破坏安全性而不用付出任何代价。

简单的PoS实现对于这些攻击而言是非常脆弱的。灾难性的是,因为没有任何的激励来鼓励大家永远集中在一个独一的链上,并且每次激励都要同时在相互冲突的链条上进行重复签名,所以为了获得更多的区块奖励,在经济上最优的策略就变成了尽可能的在多个分杈上进行投票。下面这张图就展示了:

在简单的PoS设计中竞争链上的期待投票数高于单一链上期待的投票数

在工作量证明中,对于在多个链上进行挖矿的矿工“惩罚”是他们必须分开他们的计算力(非常稀缺的资源)。在现代非简并的PoS设计中,这种成本必须嵌入到协议里面以此模仿物理PoW挖矿的限制。

Vitalik Buterin在2014年1月引入的“slasher”概念或协议内惩罚可以减轻这个攻击。Jae Kwon在同一年进一步推算了此方法,这是实现Tendermint共识协议的第一个迭代进展。苛刻以及允许这种惩罚的条件,对于所有的非简并BFT协议都是有帮助的,甚至在本文中出现的三种共识都采用了。

远程攻击

远程攻击来源于用户不得不撤回保证金的权利。这就产生了一个基本问题,因为这意味着攻击者可以从任意长度的距离建立一个分杈而不用担心被削减。一旦保证金被解除绑定,激励不从某个高度区块前进行长距离投票就被取消了。换句话说,当超过2/3的验证者解除了绑定,那么他们就可以恶意的创造包含之前验证者集的第二条链,这可能导致任意的交易。

对于权益证明协议这是相当致命的,因为安全模型必然是“主观”的。当参与网络要求大量的社会信息,那么这个安全模型就会被称为是“主观的”。一个新节点加入网络之后,对于当前网络的状态可能会得出不同的结论,因为他们的决策是基于主观信息的,即社会声誉。在相反面,工作量证明的安全模型必然是“客观的”,因为当前网络状态总是工作量最多的那个状态,新节点对于网络状态的结论总是相同的,因为他们的决策是基于客观信息。

PoS的远程攻击在弱主观性模型下进行了纠正,这要求接入到网络中的后续新节点:

  • 当前必须是被绑定的。只相信当前有保证金的验证节点
  • 解除绑定保证金必须要经过一个"解冻"期。解除绑定之后,代币需要数周到数月的“解冻”时间,用以实现“同步性”前提(即延迟的消息)
  • 禁止在N个块之前恢复,其中N是保证金的长度。 这个规则使任何长程分杈无效。
  • 可选择的将验证者集存放在PoW的链上

Casper(s)和Tendermint采用一种简单的锁定机制(“Tendermint”中俗称“冻结”)来锁定股权一段时间(几周到几个月后“解冻”),以防止任何恶意联合验证者 违反安全。在CFFG算法中,一个分杈选择规则永远只能修改最终块之后的块阻止了远程攻击。通过使用时间戳,在CFFG中的长距离分叉试图修改比最终块还要更早的块的时候会被协议直接忽略掉。

卡特尔形式

第三,最后的障碍是面临任意价值的任何经济形式都将面对一个真正的寡头垄断问题,就算本土加密货币也不例外。

“加密货币令人难以置信的集中,挖矿算力也是一样。寡头垄断竞争是很多现实市场的常态。少数相对富有的验证者之间的协调比多数相对贫穷验证者之间的协调要容易的多。在我们这种情况下,卡特尔形式是完全被预料到的。”
——Vlad Zamfir,Casper的历史第4章节

Tendermint依靠额外协议管理方法来与寡头垄断验证者进行对抗。虽然在审查制度方面没有任何协议措施,但依靠带外社会信息解决卡特尔形成,其中的基本原理是:用户最终将不可避免地注意到卡特尔的形成,社会上也会对此到处八卦,然后放弃或者投票重新组织受到攻击的区块链。

到目前为止,Vlad的Casper协议是唯一一个明确使用共识内审查激励来打击卡特尔形式一种模式。

概述

有很多不同的方式来实现权益证明的算法,但是权益证明设计的两个主要原理是基于链的PoS和基于拜占庭容错(BFT)的PoS。Tendermint是基于拜占庭容错的PoS设计,CTFG是基于链的PoS设计,而CFFG则混合了两者。

计算机科学中的CAP理论返回在分布式数据系统中提供超过2/3担保的不可能性:可用性、一致性、分区容错。基于链的PoS算法倾向于选择可用性高的而不选择一致性高的,因为可用性高意味着所有的交易都能被处理,不过要以牺牲整个网络中一致性状态复制为代价。基于BFT的却相反,会倾向于选择高一致性。

基于BFT的权益证明

拜占庭容错共识算法源于30多年的丰富研究。Tendermint(2014)是Castro和Liskov在1999年引入的实用拜占庭容错(PBFT)算法的第一个PoS的改编版。基于BFT的PoS协议伪随机的安排一个验证者在多轮投票的过程中提出一个区块。但是,提交和最终化区块取决于大多数——所有验证者中2/3的验证者在提交的区块中签名。在区块最终化之前可能需要进行几轮(译者注:这种多轮投票和现实世界的波尔卡舞蹈类似, 这也是polkadot 名字的由来)签名。BFT系统只能容错1/3的失败,其中失败包括故障或是恶意的攻击。

Tendermint核心

Tendermint主要包含两个主要的技术:区块链共识引擎和通用的应用接口。共识引擎被称为Tendermint核心模块,确保相同的交易在每个机器中都按照相同的顺序被记录下来。应用接口被称为应用区块链接口(ABCI),让交易可以被任何编程语言编写的程序处理。

在核心模块中,Tendermint基于循环投票机制进行工作,这也是共识协议的原理。一个回合被分成3个处理步骤:验证者提出一个块、发送提交意图、签名后提交一个新区块。这种机制为原子广播提供了一个安全的状态复制机,增加了一个责任层——安全故障可以完全归结于Tendermint。

Tendermint共识算法从验证者集开始。验证者们都维护了一份区块链的全拷贝,并且可以用公钥来识别验证者的身份。在每个新的块高度他们轮流的提出一个区块。每轮投票都只有一个验证者可以提出块,并且要用验证者相应的私钥对此进行签名,这样的话如果有错误发生就可以找到为此负责的验证者。然后剩下的验证者就需要对每个提议都进行投票,投票都需要用自己的私钥进行签名。这些组成一个回合。不过可能因为网络的异步需要好几个回合才能提交一个新块。

验证者提交块的时候由于几种原因可能会失败:当前的提议可能下线了,或者网络可能遇到了延迟。Tendermint允许验证者可以被跳过(就是轮到一个验证者出块的时候但是此验证者没出块)。验证者在移到下一轮投票之前等待一小段时间来接收提议者(此轮出块的验证者)提出的整个区块。这种对超时的依赖让Tendermint成为一个弱同步协议,而不是一个异步协议。不过,剩下的协议是异步的,并且验证者只有在接收到了超过2/3的验证者集消息时才会进行处理事物。正是因为这样,所以Tendermint需要大多数的验证者可以100%正常运行,如果1/3或更多的验证者离线或脱机,网路就会停止运行了。

假设少于1/3的验证者是拜占庭,Tendermint保证安全永远不会被破坏——也就是,验证者(2/3以上)永远不会在同一个高度提交冲突的区块。因此,基于Temdermint的区块链永远不会分叉。

目前为止,Tendermint的设计决策确实是把安全性和不可改变性地位放在了灵活性之上。在现实世界上有相当高的可能性是,系统真的会停止运行,参与者将会需要在协议外组织在某种软件上更新后重启系统。

在数字加密货币社区中只有少数人理解 Casper以及为什么它很有价值的时候,Tendermint就为Casper研究奠定了基础。这个洞察力就是:如果一个链的本身是高度容错的,那么你就可以依赖链来对于谁来生产区块做出一个好的决定,但是如果链的本身就是不可靠的,那么你就陷入了鸡和鸡蛋的问题中去了,这也是之前所有其他共识算法的灭顶之灾。

这个设计决策被认为不如可用性优先的协议例如以太坊和比特币。比特币中的权衡是:如果它的网络被分裂了,比特币在各种攻击的情况下就失去了它的安全保证。这其实就是一个不可修改理论,也就是你的置信区间是100%的时候,那么你跟随的就是一条正确的链,你会使用这条链来选择谁来生产下个区块,但是一旦你转移到一条不安全的链上之后,并没有一条明确的路径让你回到正确的链上。

Tendermint的明确属性
  • 可证明的活跃性
  • 安全阈值:1/3的验证者
  • 公有/私有链相容
  • 即时的最终确定性:1-3秒,取决于验证者数量
  • 一致性优先
  • 在弱同步性网络的共识安全

基于链的权益证明

基于链的权益证明模仿了工作量证明共识算法,在此权益证明中协议让伪随机选择出来的验证者产生一个新块,新块是哈希连接(包含上个块的哈希值)到前一个最长链的父区块上。基于链的PoS非常依赖同步的网络,通常优先考虑可用性而非一致性。Casper(s)对于倾向于活跃性而非安全性环境而言,它就是Tendermint核心思想的一个改编。

CFFG

CTFG是一个明确的PoS构造,但是CFFG是一个覆盖在已存在的以太坊PoW提议机制上的PoS——融合了PoW和PoS两者,由Vitalik Buterin带领实现。

比特币和以太坊的PoW共识协议都不会做“最终”决定,并且区块可能会潜在的被重新组织到一些过去区块高度。当区块没有机会再被修改的时候才能称为“最终确定”的。因为工作量证明没有提供这样的修改保证,所以它被认为是共识不安全的。相反,当我们持续加长链的时候区块的最终确定性概率也越来越高。为了为以太坊区块链增加想要的最终确定性和51%的攻击阻力,CFFG实现的逻辑就完美的提供了这种效果。

CFFG将通过多个步骤推出,以保守的方式将以太坊的PoW安全模式逐渐过渡到PoS安全模式。Casper的第一个迭代将会是实现这里讨论的混合PoW/PoS协议,Casper的最后一个迭代很有可能吸取CFFG和CTFG的教训,朝着一个完整的PoS协议发展。

CFFG是基于链的PoS和基于BFT的PoS的之间的混合体,因为它吸取了两者的思想。它的模块化覆盖设计让现在的PoW链的更新变得更加容易,因为它对于将系统升级到完全不同的共识模式而言是一种更保守的方法。

Casper的应用逻辑存在于智能合约的内部。要想在Casper中成为验证者,必须要有ETH并且要将ETH存储到Casper智能合约中作为杠杆的权益。在Casper第一次迭代中区块提议的机制会被保留:它依然使用Nakamoto PoW共识,矿工可以创建区块。不过为了最终化区块,Casper的PoS覆盖掌握控制权,并且拥有自己的验证者在PoW矿工之后进行投票。

Casper的PoS共识最重要的一个部分就是检查点(checkpoints)。Casper在50区块增量的时候评估最终确定性就称之为检查点,每50个块片段就称之为周期(epoch)。通过验证者在每个周期发送投票消息时触发这个处理过程。

在一个周期前最终化检查点需要2个周期才能完成,也就是需要两轮投票。例如,当超过2/3的验证者(也就是大多数)给一个检查点c投票了,那么就说这个检查点已经被"审判"了。下一个周期,当大多数人给检查点c投票了,会发生两件事情:c变成了被审判的并且c已经最终化了。c这个周期也就代表着最后一个最终化的周期(LFE)。

回顾一下,一个区块最终化需要两个条件:

  • 大多数(超过2/3)验证者在周期1的时候给区块1进行了投票,因此审判了区块1
  • 大多数(超过2/3)验证者在周期2的时候给区块2进行了投票,区块2是区块1的子区块,因此在周期2的时候最终化了区块1

在理想执行中,一个区块的最终化是按照下面的步骤的:
区块1的2/3投票→审判区块1→2/3投票区块2→最终化区块1

其中区块2是区块1的子区块

当一个检查点被最终化之后验证者就会得到报酬。不过,如果有两个最终化的检查点在相同高度上分杈时,那么就破坏了安全性,这个时候就达到了消减的条件,最少1/3的保证金将会被消减掉。当安全性被破坏的时候可以将错误归因的证据当作交易广播给PoW的矿工。然后PoW就将这个证据交易组成一个区块来进行挖矿,提交了这个证据的验证者会得到查找者的费用。当此事发生的时候,签署了在冲突区块的有罪验证者将会在两条链上被消减掉。

现在如果一个矿工进行蛮力攻击,那么会发生什么?现在Casper的最终化区块链可以防止PoW的攻击者,就算是51%或者更多的计算力重写最新检查点之外的历史也会被阻止。因此,Casper协议提供了安全。不像CTFG,因为CFFG就是不同提议机制上的一层覆盖,Casper不能确保活跃性,因为活跃性是取决于提议机制的。

验证者是被激励着集合在权威链上的,因为如果他们持续在不同的链上进行投票将会受到惩罚。Slasher 2.0的形成让验证者不仅仅会为双重投票而受罚也要为在不正确的链上进行投票而受到惩罚。不过这也造成了一个“泄气”的窘境,因为验证者担心如果出现一个分杈而自己不确定到底哪个才是权威的,然后投错票之后被消减所以选择退出投票。

CFFG的明确属性

  • 最终化:超过20分钟最终化。每隔50块(一个周期)就最终化一次区块,防止PoW挖矿暴利攻击
  • 共识安全性
  • 可证明的活跃性
  • 优先可用性

CTFG

CTFG是Vlad Zamfir的正确构造(CBC)共识协议专用于对抗寡头垄断的真实世界的环境。CTFG是工作量证明中GHOS或GHOST协议的PoS改编版,用于其分杈选择规则。CTFG背后的指导设计原则是基于加密经济学的,使用旨在实现评估安全的正规方法。与前面详细说明的CFFG混合协议不同,CTFG是纯粹的权益证明的概念。

“Casper刚刚开始的时候只是简单的‘友好的幽灵’,它对于PoS而言是GHOST的改编,完善的激励让卡特尔‘友善地’变成‘非卡特尔’的验证者。”
——Vlad Zamfir,Casper的历史第5章

与工作量证明类似,CTFG会为一致性和可用性进行权衡。特别,在区块没有被最终化的时候,随着在链中的深度越深的它们就会越安全。CTFG与CFFG有一点相似,链头部的处理总是比区块最终化的处理要快很多。

Casper的PoS提议机制与Tendermint提议机制最大的区别是相比较伪随机选择领导者,前者的验证者可以基于自己见到的块提出块。

Casper提供的一个独特功能是参数化安全阈值。与比特币中使用6个确认来确定一个经济最终状态类似,CTFG中的“评估安全”提供了一个验证者可以有一个与其他验证者不同的安全阈值功能。Casper的设计目标是在网络维持PoS低开销的时候能够允许验证者选择自己的容错阈值。

Casper对Tendermint的核心优势在于网络随时可以容纳一定数量的验证者。因为Tendermint中的区块在创建的时候需要最终化,所以区块的确认时间应该短一点。为了达到短区块时间,Tendermint PoS能够容纳的验证者数量就需要有个限制。由于CTFG和CFFG到在区块创建的时候都不需要安全性,所以以太坊网络相对于cosmos容纳100个验证者来说,可以容纳验证者的数量会更加的多一点。

CTFG的明确属性
  • 可用性。Casper的节点在它们达成共识之前可以块分杈
  • 异步安全性
  • 生存。Casper的决策可以在部分同步中存活,但是不能在异步中存活
  • 卡特尔阻力。Casper的整个前提是建立在抵制寡头垄断攻击者基础之上,因此不会有任何勾结的验证者可以超越协议
  • 安全性。取决于每个验证者的评估安全阈值

未来的工作

公链在产品上运行是一个比较新生的技术。在这个范例中到目前为止显示出不会腐败的唯一安全模型就是工作量证明。权益证明的设计空间还非常的大,而且工程学上权衡的理解也远远不够,因为权益证明是一个研究前沿也没有足够的数据。不用多说,要达到一个最佳的PoS共识算法,我们还有很多未来工作需要完成。

Tendermint的一个改进可能是新的提出机制,或者将Tendermint的多轮投票过程压缩成一轮投票。

第二个未来工作的领域可能是利用更高级的加密技术让区块头的签名更小一点。因为我们是通过Cosmos来建立一个“区块链的互联网”,所以将轻客户端证明从一条链上移到另一条链上就是我们的核心工作。从这个观点来看的话,使用更加高级的密码学将区块头的大小减少三十倍或者更多是非常有利的。目前,100验证者,Tendermint的区块头接近4KB,它们都是验证者的签名。我们可以使用高级的加密技术让100个签名从3.2KB减少到64字节。

还有一些优化p2p层的方法,这样我们就可以显著减少点对点需要最终化块的流量。在未来的工作中,不仅仅是压缩区块头中的数据量,还会减少发送到对端的数据量。这样的话,在Cosmos网络初始100个验证者的阈值之上,Tendermint还可以增加更大的验证者集。

转载自:https://ethfans.org/posts/consensus-compare-casper-vs-tendermint

引介 | Ethermint 入门指南

Ethermint 是一个在 Tendermint 上的 Ethereum 优化的产物。将 Ethermint 和 Cosmos Hub 同时发布是为了双方能够促进对方发展:在保证智能合约可编写和执行,同时利用Tendermint引擎提高效率。

Ethermint的主要特性:

  • Web3兼容
  • 高吞吐
  • 横向扩展性强
  • 交易确定性

Cosmos简介

因为以太坊使用的是工作量证明的安全模型,Go Ethereum (Geth)性能很差,也不能提供交易确定性。 使用 Ethermint 不但可以通过 web3 RPC 来部署智能合约,而且操作的速度提升了20倍左右。这得益于区块大小的增长。Geth 的处理速度在 12.5TPS( 每秒交易,transactions per second)。Ethermint 的处理速度在200 TPS,这得益于 Tendermint PoS的确认速度。

Ethermint 相关文档:http://ethermint.readthedocs.io/en/develop/
Ethermint 代码库GitHub:http://github.com/tendermint/ethermint

架构:Hub&Spoke


图解:Cosmos Hub 和 Spoke 架构,每一个空间(Zone)都可以代表一个不同的区块链,也可以是同一条链的多个复制本以实现横向扩展性(Horizontal Scalability)

Tendermint 的核心与应用区块链交互界面(ABCI)

Tendermint 主要由以下两部分组成:区块链共识引擎和上层应用接口。共识引擎称为:Tendermint Core, 它用来保证系统每个节点内交易的顺序是一致的。上层应用接口称为 Application Blockchain Interface (ABCI), 保证交易能被应用处理,不受编程语言的限制。

Tendermint 也可以被用于保证任意应用的状态一致性。它可以作为一个即插即用的共识组件来替代已有的共识引擎。所以,开发人员可以将任意版本的Ethereal代码(Rust,Go,或Haskell),把它当作一个ABCI运行在Tendermint共识引擎之上。这就诞生了一个新的Ethereum 。

另一个例子是 Cosmos network,运用 ABCI&Tendermint Core 实现应用和共识过程的分离。

当我们建立好不同的 zones, 可以使用相应的 Inter-blockchain Communication (IBC)协议进行沟通,实现跨链交互。

主要特性

Web3完全兼容

Ethermint 完全兼容 Ethereum 的 web3 接口和 RPC 调用方法。对于一个已经开发好Ethereum 上的钱包软件的开发者,他很容易将钱包转移到 Ethermint 上运行:只要该改变服务的URL。

开发工具 Truffle 简化了部署智能合约的流程,开发者不需要控制和 Ethereum 节点的交互。若将 Ethereum 节点替换为 Ethermint 节点, 那么你就可以将合约部署在Cosmos上。 这样就实现了合约的交互,花费的时间不超过10秒钟。

吞吐量达到更高的数量级

Tendermint 的 PoS 共识引擎无疑能将大大提高Ethermint 的运行速度,这也是它毫无疑问的优势。建立在容许更高吞吐量的共识引擎之上的效果是使得执行智能合约的成本更低。因为 Tendermint 可以处理速度比 Ethereum 虚拟机(EVM)高20倍,这意味着不会再因为网络缓慢的交易导致费用上涨。 因此,在 Ethermint 中执行一个合约可节省20到50倍的交易费用。

不设限的水平扩展

Ethereum 目前的主要问题之一是可扩展性。 Ethereum 处理速度在12.5 TPS,这就是网络到达瓶颈的地方。 Ethermint 的上限在200 TPS。

但是,假设 Cosmos 上线,网络可达到200 TPS 的上限。 由于模块化的 hub 和 zone 的设计,我们可以轻松地添加第二个 Ethermint zone。也就是说,我们可获得了400 TPS的吞吐量。 再加上两个Ethermint zone,我们得到800 TPS。 这种水平可扩展性的方法是 cosmos 所独有的,它可无限扩展。

实时交易确定性

Bitcoin 和 Ethereum 的 PoW 的共识算法都不会做出“最终”决定,而且在51%的攻击下,理论上过去的块可以被重写。 当没有机会修改过去的块时,块被认为是有“确定性”的。 由于 Nakamoto 协议一致没有提供这样的保证,实际上的共识并不被认为是安全的。

在Ethereum目前的PoW建设中,由于块永远不会“最终化”,您必须等待6个确认,然后才能“确定”您的交易已经进入块状。 通常情况下,Bitcoin 的6次确认大约需要60分钟,而Ethereum 需要2分钟。 在 Ethermint 中,您可以获得 Tendermint 的交易最终确定性,平均在1秒钟内确定块。

Ethermint 的实现

由于Tendermint的共识机制的作用,我们可以即时保证交易的最终性。 在Tendermint中,协商一致的节点首先在对块的内容达成共识之前首先进行多轮投票提案流程。 当这些节点的绝对多数决定一个块时,它们通过状态转换逻辑运行它。 在Ethereum中,共识的过程是相反的,矿工们将交易包含在一个块中,运行状态更新,然后做“计算”来尝试挖掘块。

转载自:https://ethfans.org/posts/a-beginners-guide-to-ethermint

深度剖析区块链跨链技术Cosmos(下篇)

导读

2017年以来,区块链项目出现了井喷式地上升,然而在喜人增长态势的背后,人们也注意到大部分项目都缺乏与其它区块链项目互连互通的能力而成为孤立的网络体系。

因此,跨链技术也逐渐进入了大家的视野,本文将为大家解读一个跨链项目Cosmos,看看它是如何做到让不同区块链的价值网络实现互通的。通过对该项目的解读,让大家对跨链项目有个初步的了解。

同时受限于篇幅,我们会分为上下两篇,上篇让大家了解了Cosmos的核心技术Tendermint,详情可见上篇:深度剖析区块链跨链技术Cosmos(上篇)。此篇将为大家着重介绍Cosmos。

跨链技术背景

随着区块链技术的火热,越来越多的企业和开发人员加入到区块链的浪潮中,市面上也出现了许多不同类型的链,应用在金融、健康医疗、供应链、资产管理和溯源等领域。然而大部分链上应用(加密货币或者智能合约)都无法跨越当前链的边界,不能与其他链协同合作实现价值的流通从而限制了区块链的发挥空间。如何能让不同类型的链协同合作实现价值的流通成了探索的方向,这也是跨链技术的起因。跨链技术是打开链与链之间互通的钥匙,能很好地解决价值孤岛的问题,建立价值网络的桥梁。

目前主流的跨链技术包括:

  1. 公证人机制(Notary schemes)
  2. 侧链/中继(Side chains/relays)
  3. 哈希锁定(Hash-locking)
  4. 分布式私钥控制(Distributed private key control)

而本文所要介绍的主角Cosmos就是中继技术的一个典型案例,接下来将逐步为大家揭开Cosmos的面纱。

Cosmos概述

Cosmos是Tendermint团队推出的一个支持跨链交互的异构网络,它最终的目标是创建一个区块链互联网,允许大量自主且易开发的区块链互相扩展和交互。基于Tendermint开发,采用的Tendermint共识算法,是一个类似实用拜占庭容错共识引擎,具有高性能、一致性、具备拜占庭容错等特点。关于Tendermint的详细介绍可以参考本文上篇:深度剖析区块链跨链技术Cosmos(上篇)

Cosmos网络由许多独立的并行区块链组成,网络中第一个区块链是Cosmos Hub,其他的并行链称为Zone,通过跨链协议(IBC)与Hub进行跨链操作。

目前Cosmos Hub已经经过了多个版本的迭代,MVP版本也趋于完成,同时测试网络也在前不久更新到gaia-7001,但主网的上线时间团队还未给出,所以对Cosmos感兴趣的朋友还需要一些耐心。

Cosmos架构

从Github上可以看出Cosmos主要的代码是cosmos-sdk,它包含Cosmos Hub的程序代码,同时也是一个区块链开发框架,为其他区块链开发者提供一些通用的功能模块,比如:共识,P2P网络,IBC,账户,治理,认证等。大致框架如下:

不难看出cosmos-sdk其实就是一个ABCI应用。主要有:

  • baseapp:定义了一个基本ABCI应用的模版,与Tendermint通信。开发者也可以根据自己的需求重写。
  • 应用程序:包括gaia、basecoin、democoin。其中gaia就是hub主程序,basecoin以及democoin是提供的两个示例应用。
  • plugins:cosmos-sdk的基本单元,每个plugin都是baseapp的功能扩展,包含各自的消息和交易处理逻辑。目前SDK已经集成了一些重要的
    • staking:POS相关的实现,包括:绑定,解绑,通货膨胀,费用等操作。
    • ibc:跨链协议IBC的实现,也是Cosmos支持跨链的主要插件。
    • governance:治理相关的实现,如提议、投票等。
    • auth:定义了一个标准的多资产账户结构(BaseAccount),开发者可以直接嵌入自己的账户体系中。
    • bank:定义资产的转移。

因此基于cosmos-sdk框架,利用其插件功能,可以非常快速的开发出属于自己应用的区块链,同时也可以很方便的加入Cosmos生态网络,支持不同链之间的互操作,在插件的设计上和EOS也有异曲同工之妙。

那么如何使用这些插件功能呢?可以参考cosmos-sdk提供的示例应用,以basecoin为例,只需要几步:

  • 创建自己的ABCI应用,可以嵌入baseapp,也可以重载baseapp。
  • 定义自己的账户体系,可以嵌入BaseAccount。
  • 选择所需要的插件,注册到消息路由。

Cosmos跨链

Tendermint团队在15年就开始考虑跨链技术,跨链也是Cosmos网络最重要的一个特性。一般来说,实现跨链需要做到:

  • 共识算法需要具备及时最终性,也就是说在出块之后,需要能够快速确认为不可逆(固定不变)。
  • 交易确认需要高效独立的证明方法,目前的做法都是基于Merkle证明。

基于cosmos-sdk的区块链使用了Tendermint共识算法就非常容易能够做到。除此之外,Cosmos的区块链间通信协议(IBC)将不同区块链连接起来,达到价值转移的目的。

IBC协议

IBC协议是针对Cosmos网络设计的,依赖其及时最终性的特点,用于Hub与Zone之间消息传递。IBC协议中设计了两个消息:

  • IBCBlockCommitTx:发送方所在区块链的最新的区块信息。
  • IBCPacketTx:跨链交易本身的信息,及其在发送方链中被打包的区块信息。

但有了消息的传递,接收链如何校验信任消息呢?
在IBC协议设计里,两个链建立连接之前需要进行彼此注册,有两个作用:

  • 保存对方链验证者集合以及Merkle证明的算法,这样接收链才能确保消息的正确性和来源的可靠性。
  • 为对方链创建两个可靠队列,一个队列存放所有发送对方链的消息(outgoing),一个队列存放来自对方链的消息(incoming)。

我们以chain1中用户User A转100mycoin 给test-hub用户User B为例看看IBC整个的工作流程如下(基于目前IBC实现代码):

整个工作流程可以分为三个阶段:

  • User A向chain1提交跨链交易,chain1执行该交易,并将交易存入outgoing队列。
  • relayer从chain1中对应test-hub的outgoing消息队列取出跨链交易,提交到test-hub。
  • test-hub执行交易,放入incoming消息队列。

大家可以看到,整个流程比较简单,而且涉及的消息只有IBCPacket。目前Cosmos跨链实现并没有全部完成,只是完成了一个简单的交易处理流程。

PegZone

基于cosmos-sdk开发的区块链能够轻松满足实时最终性,然而现存的Bitcoin和Ethereum这类使用POW共识的区块链并不具备此特点,只能属于概率最终性,无法防止区块链的回滚。对于这类链,团队采用PegZone方案来解决。

PegZone本身其实是一条代理链,实时跟踪原始链的状态,通过设定一个安全阀值,等待原始链区块增长数达到安全阀值时就认为原始链的状态达到了伪实时最终性(回滚概率小),这点和轻客户端钱包验证是相同的原理,例如比特币安全阀值通常设置为6,以太坊安全阀值可以设置为20或者100。而PegZone本身具备实时最终性,就可以通过IBC与Hub相连,从而实现跨链。

接下来还是用例子来说明下,以Ethereum为例来看,有兴趣的朋友可参考Github上的cosmos/Peggy项目。示意图如下:

上图我们可以看出PegZone可以分为5个部分:

  • Smart Contract:资产托管的角色,保管以太坊中的代币和Cosmos中的代币。主要提供了lock、unlock、mint、burn四个方法。
  • Witness:是一个以太坊全节点,监听以太坊合约的event,并等待100个区块产生后,封装WitnessTx提交到PegZone中来证明在以太坊内状态更改。
  • PegZone:PegZone是基于Tendermint的区块链,负责维护用户的账户信息,允许用户之间资产的转移,并提供交易查询。
  • Signer:使用secp256k1对交易进行签名,以便签名能够高效的被智能合约验证,对应于智能合约的校验者公钥集合。
  • Relayer: 中继器负责交易转发。将所有Signer签名后的SignTx转发到smart contract中。

现状

跨链是Cosmos的重要特性,但在从目前的代码实现上感觉有些遗憾:

  • IBC协议目前只完成了基本消息的传递功能,并没有安全校验、注册机制以及一些异常的处理。
  • PegZone机制处于暂停状态,机制设计上团队也称处于实验性质。
  • 对于没有基于cosmos-sdk开发,但符合实时最终性的链无法使用IBC,无法做到异构链的兼容。它们可能使用不同的:
  • 签名算法
  • 序列化方法
  • Merkle证明的方式

总结

通过上下两篇文章,从架构,核心技术——Tendermint、跨链、源码以及现状等方面对Cosmos进行了详细介绍。整体来讲,Cosmos更偏向于一个区块链开发框架,让开发者可以只需要专注于自身业务而不需要考虑区块链底层技术实现,所以在架构设计上采用了灵巧的插件设计,开发者可以按需使用。

Cosmos跨链协议部分从代码上看,完成度还不太高,有些遗憾。并且设计上跨链交易都需要通过Cosmos Hub,这样会过于依赖Hub,对Hub本身的承载压力是个考验,目前其他的一些跨链实现方案也都需要依赖自身的一条链,都会存在这个问题。笔者觉得跨链未来会发展成标准化协议,就像TCP之于互联网,而不是依赖某条具体链,通过定义标准化的模块,通过路由将跨链交易转到目标链,目标链完成对原始链的校验后,确认交易合法性,并执行交易。设想示意图如下:

转载自:https://mp.weixin.qq.com/s?__biz=MzUyMjg0MzIxMA==&mid=2247483744&idx=1&sn=02baaff744429c37626dc89aed14988f&chksm=f9c4e445ceb36d53578bd8c22af2ea14023be0b787a4d980702ed0246a02a1229296e0fe53c1&scene=0

深度剖析区块链跨链技术Cosmos(上篇)

区块链的公链项目越来越多,每个项目都是一个孤立的网络体系,因此区块链项目之间的互联互通能力也是技术发展的大方向。这其中Cosmos项目是其中的优秀代表。本文作者从Cosmos核心技术Tendermint开始,深度剖析Cosmos项目,让大家对跨链技术将一个比较深入的了解。

导读

2017年以来,区块链项目出现了井喷式地上升,然而在喜人增长态势的背后,人们也注意到大部分项目都缺乏与其它区块链项目互连互通的能力而成为孤立的网络体系。因此,跨链技术也逐渐进入了大家的视野,本文将为大家解读一个跨链项目Cosmos,看看它是如何做到让不同区块链的价值网络实现互通的。通过对该项目的解读,让大家对跨链项目有个初步的了解。同时受限于篇幅,我们会分为上下两篇,上篇带大家先了解Cosmos的核心技术Tendermint,下篇会着重介绍Cosmos。

Tendermint概述

提到区块链,大家想必已然不陌生了,不过更多人想到的可能会是众所周知的Bitcoin和Ethereum。的确,两者分别是区块链技术的起源和发展的代表,也是大家广泛传播和深入研究的对象。但是随着Bitcoin的不断推进,比特币工作量证明共识机制在速度和扩展性上的不足也逐步展现出来。

Cosmos的开发团队Tendermint其实早在2014年就开始意识到了其不足,并持续专注于寻求不依赖挖矿等高电力消耗的共识机制,提供快速的交易处理能力,它们的目标是为全世界所有的区块链提供速度、安全和可扩展性。目前,Tendermint加入了微软Azure区块链即服务平台,也成为了以太坊区块链联盟成员之一,同时Tendermint也是跨链技术Cosmos的核心技术。两者大致的关系如下:

图中可以轻松看出Cosmos就是在Tendermint基础上添加一些插件功能来实现的,上篇暂不对Cosmos做过多阐述,先来认识一下Tendermint。

Tendermint是什么

Tendermint的详细定义可以参考官方文档:
https://tendermint.readthedocs.io/en/master/introduction.html#what-is-tendermint

这里总结下有以下几点:

  1. Tendermint是一个能够在不同机器上,安全一致复制应用的软件,其中安全性和一致性也是分布式账本的关键概念。
  2. Tendermint具备拜占庭容错能力,是一种拜占庭容错共识算法。
  3. Tendermint主要有两部分组成:
    • Tendermint Core:区块链共识引擎,负责节点之间数据传输以及拜占庭共识。
    • ABCI:区块链应用程序接口,也是一个协议,支持任何语言的交易处理实现。

总体来讲,Tendermint可以理解为一个模块化的区块链软件框架,支持开发者个性化定制自己的区块链,而又不需要考虑共识以及网络传输的实现。

Tendermint设计原则

先简单说说区块链的概念,区块链是一个具备确定性的状态机,可以在不信任的节点之间进行状态复制,包括应用的状态和改变状态的交易。从架构的层面上,区块链可以简单分为三个概念层:

  • 网络层(Networking):负责交易和数据传输和同步。
  • 共识算法(Consensus):负责不同的验证节点处理完交易后,保证状态的一致,也就是将交易打包到区块中。
  • 应用程序(Application):交易的真正执行者。

大致框架如下:

目前大部分的区块链实现都是采用上面的框架,实现成单一的程序,但是这就很容易出现两个问题:

  1. 代码复用困难,代码库的分支管理变得复杂。
  2. 限制了应用开发的语言

如何去规避这两个问题呢?Tendermint设计了自己的一套框架,其设计原则是易使用,易理解,高性能,适用于各种分布式应用。它的创新之处在于,将区块链应用(状态)与底层共识进行了分离,将共识引擎和P2P网络层封装组成Tendermint Core。同时提供ABCI接口与应用层进行交互,应用逻辑可以用任何语言编写,应用做的事情实际上就是状态机控制。基于这种架构,应用的开发者可以方便地实现自己的区块链。

Tendermint的框架总体来讲分为ABCI Application以及Tendermint Core两部分,两者通过ABCI连接。下面会对这两部分依次展开介绍

Tendermint核心模块

ABCI Application

开发者定制开发的区块链应用,开发语言不受限制,可以使用任何语言进行开发,但是必须实现为一个ABCI Server,即需要满足以下几点:

  • 是一个Socket Server,需支持TSP或GRPC两种方式之一。
  • 能够处理ABCI Message。所有的ABCI消息类型都是通过protobuf来定义的,具体的消息格式可参考https://github.com/tendermint/abci/blob/master/types/types.proto
  • 实现区块链应用接口(ABCI)。ABCI是Tendermint中定义的一套Application与Tendermint Core之间交互的协议。详细定义如下(版本:0.10.3):

ABCI接口可以分为三类:信息查询、交易校验以及共识相关处理。而Tendermint Core作为ABCI Client在启动时,会与ABCI Server建立三个连接,分别用于这三类接口消息的处理。
在Tendermint Core与Application交互的所有消息类型中,有3种主要的消息类型:

  1. CheckTx消息用于验证交易。Tendermint Core中的mempool通过此消息校验交易的合法性,通过之后才会将交易广播给其它节点。
  2. DeliverTx消息是应用的主要工作流程,通过此消息真正执行交易,包括验证交易、更新应用程序的状态。
  3. Commit消息通知应用程序计算当前的世界状态,并存在下一区块头中。

Tendermint Core

Tendermint共识引擎,包含区块链需要大部分功能实现,主要有:

  • 共识算法:拜占庭POS算法。
  • P2P:采用gossip算法,默认端口是46656。
  • RPC:区块链对外接口,默认端口是46657。支持三种访问方式:URI over HTTP、JSONRPC over HTTP、JSONRPC over websockets。详细的RPC接口定义列表可以参考https://tendermint.github.io/slate
  • 其它:交易缓存池、消息队列等。

共识算法

Tendermint是一个易于理解的BFT共识协议。协议遵循一个简单的状态机,如下:

协议中有两个角色:

  • 验证人:协议中的角色或者节点,不同的验证者在投票过程中具备不同的权力(vote power)。
  • 提议人:由验证人轮流产生。

验证人轮流对交易的区块提议并对提议的区块投票。区块被提交到链上,且每个区块就是一个区块高度。但区块也有可能提交失败,这种情况下协议将选择下一个验证人在相同高度上提议一个新块,重新开始投票。

从图中可以看到,成功提交一个区块,必须经过两阶段的投票,称为pre-vote和pre-commit。当超过 2/3 的验证人在同一轮提议中对同一个块进行了pre-commit投票,那么这个区块才会被提交。

由于离线或者网络延迟等原因,可能造成提议人提议区块失败。这种情况在Tendermint中也是允许的,因此验证人会在进入下一轮提议之前等待一定时间,用于接收提议人提议的区块。

假设少于三分之一的验证人是拜占庭节点,Tendermint能够保证验证人永远不会在同一高度重复提交区块而造成冲突。为了做到这一点,Tendermint 引入了锁定机制,一旦验证人预投票了一个区块,那么该验证人就会被锁定在这个区块。然后:

  • 该验证人必须在预提交的区块进行预投票。
  • 当前一轮预提议和预投票没成功提交区块时,该验证人就会被解锁,然后进行对新块的下一轮预提交。

可以看到,Tendermint共识算法和PBFT时非常相似的,可以说是PBFT的变种,那我们来比较一下:

相同点:
  • 同属BFT体系。
  • 抗1/3拜占庭节点攻击。
  • 三阶段提交,第一阶段广播交易(区块),后两阶段广播签名(确认)。
  • 两者都需要达到法定人数才能提交块。
不同点:
  1. Tendermint与PBFT的区别主要是在超过1/3节点为拜占庭节点的情况下。当拜占庭节点数量在验证者数量的1/3和2/3之间时,PBFT算法无法提供保证,使得攻击者可以将任意结果返回给客户端。而Tendermint共识模型认为必须超过2/3数量的precommit确认才能提交块。举个例子,如果1/2的验证者是拜占庭节点,Tendermint中这些拜占庭节点能够阻止区块的提交,但他们自己也无法提交恶意块。而在PBFT中拜占庭节点却是可以提交块给客户端。
  2. 另一个不同点在于拜占庭节点概念不同,PBFT指的是节点数,而Tendermint代表的是节点的权益数,也就是投票权力。
  3. 最后一点,PBFT需要预设一组固定的验证人,而Tendermint是通过要求超过2/3法定人数的验证人员批准会员变更,从而支持验证人的动态变化。

P2P网络

Tendermint的P2P网络协议借鉴了比特币的对等发现协议,更准确地说,Tendermint是采用了BTCD的P2P地址簿(Address Book)机制。当连接建立后,新节点将自身的Address信息(包含IP、Port、ID等)发送给相邻节点,相邻节点接收到信息后加入到自己的地址薄,再将此条Address信息,转播给它的相邻节点。

此外为了保证节点之间数据传输的安全性,Tendermint采用了基于Station-to-Station协议的认证加密方案,此协议是一种密钥协商方案,基于经典的DH算法,并提供相互密钥和实体认证。大致的流程如下:

  • 每一个节点都必须生成一对ED25519密钥对作为自己的ID。
  • 当两个节点建立起TCP连接时,两者都会生成一个临时的ED25519密钥对,并把临时公钥发给对方。
  • 两个节点分别将自己的私钥和对方的临时公钥相乘,得到共享密钥。这个共享密钥对称加密密钥。
  • 将两个临时公钥以一定规则进行排序,并将两个临时公钥拼接起来后使用Ripemd160进行哈希处理,后面填充4个0,这样可以得到一个24字节的随机数。
  • 得到的随机数作为加密种子,但为了保证相同的随机数不会被相同的私钥使用两次,我们将随机数最后一个bit置为1,这样就得到了两个随机数,同时约定排序更高的公钥使用反转过的随机数来加密自己的消息,而另外一个用于解密对方节点的消息。
  • 使用排序的临时公钥拼接起来,并进行SHA256哈希,得到一个挑战码。
  • 每个节点都使用自己的私钥对挑战码进行签名,并将自己的公钥和签名发给其它节点校验。
  • 校验通过之后,双方的认证就验证成功了。后续的通信就使用共享密钥和随机数进行加密,保护数据的安全。

应用示例

Tendermint官方项目里内置了ABCI Application的两个简单实现counter以及kvstore。这个两个Demo逻辑非常简单,运行起来也非常简单,以kvstore为例,只需要下面三条简单的指令就可以轻松的跑起来:

  • tendermint init
  • abci-cli kvstore
  • tendermint node

复杂一点,假设想使用Tendermint实现一套类似Ethereum的应用,最终应该是这样:

由Tendermint Core负责交易和区块的共享以及共识处理,开发者只需将go-ethereum和ABCI Server集成一个ABCI应用。Ethermint项目就是Tendermint团队开发的一个类似应用,大家可以参考,遗憾的是目前Ethermint目前只支持低版本的abci和go-ethereum。

Tendermint工作流

上图简单描述了Tenermint的工作流。大致为:

  • client通过RPC接口broadcast_tx_commit提交交易;
  • mempool调用ABCI接口CheckTx用于校验交易的有效性,比如交易序号、发送者余额等,同时订阅交易执行后的事件并等待监听。
  • 共识从mempool中获取交易开始共识排序,打包区块,确定之后依次调用ABCI相关接口更新当前的世界状态,并触发事件。
  • 最终将交易信息返回client。

总结

本文从概念、设计原则以及架构等方面对Tendermint做了详细的介绍,让大家可以直观了解到Tendermint的设计思想和实现原理。了解Tendermint之后,方便大家:

  • 可以快速开发出自己的区块链应用而无需关注共识和P2P网络。
  • 能够很好的兼容到Cosmos跨链生态中,因为Tendermint是Cosmos的核心技术。
  • 开发支持任何编程语言的区块链。

转载自:https://mp.weixin.qq.com/s/FwkYoxaOb-n4U4sH2iez6Q