教程网

您现在的位置是: 首页 > 百科

Fabric基础架构原理(2):共识与交易

Fabric基础架构原理(2):共识与交易
本文选自新书《区块链核心技术与应用》,略有删节。上期介绍了超级账本的主要组件,本次介绍共识机制和交易流程。Fabric 的网络节点本质上是互相复制的状态机,节点之间需要保持

本文选自新书《区块链核心技术与应用》,略有删节。上期介绍了超级账本的主要组件,本次介绍共识机制和交易流程。Fabric 的网络节点本质上是互相复制的状态机,节点之间需要保持相同的账本状态。为了实现这个目的,各个节点需要通过共识( consensus )过程,对账本状态的变化达成一致性的认同。

Fabric 的共识过程包括 3 个阶段:背书、排序和校验。

1. 背书

在背书( endorsement )阶段中,背书节点对客户端发来的交易预案进行合法性检验,然后模拟执行链码得到交易结果,最后根据设定的背书逻辑判断是否支持该交易预案。如果背书逻辑决定支持交易预案,它将把预案签名后发回给客户端。

客户端通常需要根据链码的背书策略,向一个或者多个成员的背书节点发出背书请求。背书策略会定义需要哪些节点背书交易才有效,例如需要5个成员的背书节点中至少3个同意;或者某个特殊身份的成员支持等。客户端只有在收集满足背书策略的支持之后,广播出去的交易才能被视为有效。

2. 排序

排序( ordering )阶段就是由排序服务对交易进行排序,确定交易之间的时序关系。排序服务把一段时间内收到的交易进行排序,然后把排序后的交易打包成数据块(区块),再把区块广播给通道中的成员。采用这种方式,各个成员收到的是一组发生顺序相同的交易,从而保证了所有节点的数据一致性。

Fabric 1.0 中的排序服务支持可插拔的架构,除了提供的 SOLO 和 Kafka 模式外,用户可以添加第三方的排序服务。SOLO 是单机确认模式,仅适合开发测试中使用。Kafka 模式是基于 Kafka 开源的分布式数据流平台,具有高扩展性和容错能力,适合用在生产系统。需要注意的是,Kafka 只提供了 CFT 类型的容错能力,即仅可对节点的一般故障失效容错,缺乏对节点故意作恶的行为进行容错的能力。

排序服务是共识机制中重要的一环,所有交易都要通过排序服务的排序才可以达成全网共识,因此排序服务要避免成为网络上的性能瓶颈。

3. 校验

校验( validation )阶段是确认节点对排序后的交易进行一系列的检验,包括交易数据的完整性检查、是否重复交易、背书签名是否符合背书策略的要求、交易的读写集是否符合多版本并发控制 MVCC ( Multiversion Concurrency Control )的校验等等。当交易通过了所有校验之后,将被标注为合法并写入账本中。因为所有的确认节点都按照相同的顺序检验交易,并且把合法的交易依次写入账本中,因此它们的状态能够始终保持一致。

基于上面的共识机制,Fabric 的交易流程如下图所示:

1)应用端首先构建交易的预案,预案的作用是调用通道中的链码来读取或者写入账本的数据。应用端使用 Fabric 的 SDK 打包交易预案,并使用用户的私钥对预案进行签名。

应用打包完交易预案后,接着把预案提交给通道中的背书节点。通道的背书策略定义了哪些节点背书后交易才能有效,应用端根据背书策略选择相应的背书节点,并向它们提交交易预案。

2)背书节点收到交易预案后,首先校验交易的签名是否合法,然后根据签名者的身份,确认其是否具有权限进行相关交易。此外,背书节点还需要检查交易预案的格式是否正确以及是否之前提交过(防止重放攻击)。

在所有合法性校验通过后,背书节点按照交易预案,调用链码。链码执行时,读取的数据(键值对)是节点中本地的状态数据库。需要指出的是,链码在背书节点中是模拟执行,即对数据库的写操作并不会对账本作改变,所有的写操作将归总到一个写入的集合( Write Set )中记录下来。

在链码执行完成之后,将返回链码读取过的数据集( Read Set )和链码写入的数据集( Write Set )。读集和写集将在确认节点中用于确定交易是否最终写入账本。

3)背书节点把链码模拟执行后得到的读写集( Read-Write Set )等信息签名后发回给预案提交方(应用端)。

4)应用端在收到背书响应之后,检查背书节点的签名和比较不同节点背书的结果是否一致。如果预案是查询账本的请求,则应用端无需提交交易给排序节点。如果是更新账本的请求,应用端在收集到满足背书策略的背书响应数量之后,把背书预案中得到的读写集、所有背书节点的签名和通道号发给排序节点。

5)排序节点在收到各个节点发来的交易后,并不检查交易的全部内容,而是按照交易中的通道号对交易分类排序,然后把相同通道的交易打包成数据块( blob )。

6)排序节点把打包好的数据块广播给通道中所有的成员。数据块的广播有两种触发条件,一种是当通道的交易数量达到某个预设的阈值,另一种是在交易数量没有超过阈值但距离上次广播的时间超过某个特定阈值,也可触发广播数据块。两种方式相结合,使得排序过的交易可以及时广播出去。

7)确认节点收到排序节点发来的交易数据块后,逐笔检查区块中的交易。先检查交易的合法性以及该交易是否曾经出现过。然后调用 VSCC( Validation System Chaincode )的系统链码检验交易的背书签名是否合法,以及背书的数量是否满足背书策略的要求。

接下来进行多版本并发控制 MVCC 的检查,即校验交易的读集(Read Set)是否和当前账本中的版本一致(即没有变化)。如果没有改变,说明交易写集(Write Set)中对数据的修改有效,把该交易标注为有效,交易的写集更新到状态数据库中。

如果当前账本的数据和读集版本不一致,则该交易被标注为无效,不更新状态数据库。数据块中的交易数据在标注成“有效”或“无效”后封装成区块(block)写入账本的区块链中。

上述的交易流程中,采用了 MVCC 的乐观锁( optimistic locking )模型,提高了系统的并发能力。需要注意的是,MVCC 也带来了一些局限性。例如,在同一个区块中若有两个交易先后对某个数据项做更新,顺序在后的交易将失败,因为它的读集版本和当前数据项版本已经不一致(因为之前的交易更新了数据)。(未完待续)

众所周知,比特币是“挖”出来的,而且是用“矿机”来挖,同时比特币是采用一种称为“工作量证明”比特币共识机制来判断谁记账。说到这里,有的萌新就要问了,比特币共识机制是什么?比特币共识机制原理又是什么呢?接下来小编就来为大家解答。

比特币共识机制定义

由于加密货币多数采用去中心化的区块链设计,节点是各处分散且平行的,所以必须设计一套制度,来维护系统的运作顺序与公平性,统一区块链的版本,并奖励提供资源维护区块链的使用者,以及惩罚恶意的危害者。

这样的制度,必须依赖某种方式来证明,是由谁取得了一个区块链的打包权(或称记帐权),并且可以获取打包这一个区块的奖励;又或者是谁意图进行危害,就会获得一定的惩罚,这就是共识机制。

比特币共识机制原理:

比特币共识机制有很多种,今天小编就以POW工作量证明来举例。工作量证明系统的主要特征是客户端要做一定难度的工作来得到一个结果,验证方则很容易通过结果来检查客户端是不是做了相应的工作。这种方案的一个核心特征是不对称性:工作对于请求方是适中中的,对于验证方是易于验证的。它与验证码不同,验证码是易于被人类解决而不是易于被计算机解决。下图所示的为工作量证明流程

举个例子,给个一个基本的字符创“hello,world!”,我们给出的工作量要求是,可以在这个字符创后面添加一个叫做nonce(随机数)的整数值,对变更后(添加nonce)的字符创进行SHA-256运算,如果得到的结果(一十六进制的形式表示)以“0000”开头的,则验证通过。为了达到这个工作量证明的目标,需要不停地递增nonce值,对得到的字符创进行SHA-256哈希运算。按照这个规则,需要经过4251次运算,才能找到前导为4个0的哈希散列。

“Hello,World!0"=>1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

“Hello,World!1"=>e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

...“Hello,World!4250"=>0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

通过这个示例我们对工作量证明机制有了一个初步的理解。有人或许认为如果工作量证明只是这样一个过程,那是不是只要记住nonce为4521使计算能通过验证就行了,当然不是了,这只是一个例子。

下面我们将输入简单的变更为”Hello,World!+整数值”,整数值取1~1000.也就是说将输入变成一个1~1000的数组:Hello,World!1;Hello,World!2;...;Hello,World!1000.然后对数组中的每一个输入依次进行上面的工作量证明-找到前导为4个0的哈希散列。

由于哈希值伪随机的特性,根据概率论的相关知识容易计算出,预计要进行2的16次方次数的尝试,才能得到前导为4个0的哈希散列。而统计一下刚刚进行的1000次计算的实际结果会发现,进行计算的平均次数为66958次,十分接近2的16次方(65536)。在这个例子中,数学期望的计算次数实际就是要求的“工作量”,重复进行多次的工作量证明会是一个符合统计学规律的概率事件。

统计输入的字符创与得到对应目标结果实际使用的计算次数如下:

Hello,World!1=>42153

Hello,World!2=>2643

...

Hello,World!998=>68868

Hello,World!999=>46281

市面上比较典型的比特币共识机制:

1.POW(Proof of Work)工作量证明

依赖机器进行数学运算来获取记账权,资源消耗相比其他共识机多、可监管性弱。每一次达成共识,需要全网共同参与,运算性能效率比较低,容错性方面允许全网50%节点出错,优点是完全去中心化,节点自由进出。

2.POS(Proof of Stake) 权益证明

POS权益证明就是存在一个持币人的集合,他们把手中的代币放入POS机制中,这样他们就变成验证者。假设很多验证者,在区块链最前面发现了一个新区块,这是POS算法在这些验证者中随机选取一个,给他们权利产生下一个区块,选择验证者的权重,依据他们投入的代币多少而定。

3.DPOS(Delegate Proof of Stake)股份授权证明

BitShares社区首先提出了DPOS机制。DPOS与POS的主要区别,在于其节点选取若干代理人。由代理人验证和记账,其合规监管、性能、资源消耗和容错性与POS相似。类似于董事会投票,持币者投出一定数量的节点,代理他们进行验证和记账。

4.Ripple Consensus 瑞波共识机制

瑞波共识机制的算法主要是:使一组节点,能够基于特殊节点列表达成共识,初始特殊节点列表,就像一个俱乐部要接纳一个新成员,必须由当前该俱乐部中51%以上的会员投票通过。

共识遵循这个核心成员的51%权利,外部人员则没有影响力。与比特币和点点币一样,瑞波系统将股东们与其投票权隔开,并因此比其他系统更中心化。

5.Pool验证池

这是一种基于传统的分布式一致性技术,加上数据验证的机制,是目前行业链大范围在使用的共识机制。它的优点是不需要代币也可以工作,在成熟的分布式一致性算法基础上,实现秒级共识验证。而缺点是去中心化程度不如比特币,更适合多方参与的多中心商业模式。

根据数字资产管理公司CoinShares的一份报告,中国的比特币矿工现在控制着三分之二的全球算力。

报告要点如下:

1.中国的比特币矿工控制着66%的算力,仅四川就占据54%;

2.中国份额的增长可能是由于部署了更多更先进的挖矿设备以及矿工的盈利能力有所提升;

3.自六月份以来全球比特币哈希率已增加80%;

4.随着中国的现金挖矿设备及芯片进入其他地区或国家,中国的份额可能会有所减少。

正文

54%的比特币算力在四川

自6月份中国矿工控制着60%的算力份额之后,目前中国的份额增长至66%,这是CoinShares两年前开始所记录的最高数值。

(图片来源于thenexweb)

以目前比特币的价格(约7200美元)来计算,矿工每年生产的比特币价值约为47亿美元。

CoinShares表示,主要加密货币采矿中心位于中国的云南和四川,后者的份额占全球的一半以上(54%)。

相比5月份这一数字更高。该公司发布的报告显示,四川省占据了48%的加密挖矿活动份额,中国共占据了60%的算力份额。

此外,除中国外,目前其他地区占据的比特币算力份额约占35%。大约有31%的算力平均分配在下面这些地区或国家中,分别为华盛顿、纽约、不列颠哥伦比亚省、阿尔伯塔省(Alberta)、魁北克、纽芬兰与拉布拉多省、冰岛、挪威、瑞典、俄罗斯西伯利亚联邦区、哈萨克斯坦、格鲁吉亚和伊朗。

比特币算力较5月底增加近80%

小葱查询发现,截至12月6日,比特币两周平均算力连续6次保持在90EH/s以上,目前为93.28 EH/s。此外,挖矿难度为12.88T。而5月底,比特币的算力仅为50EH/s左右,增加近80%。

对此,CoinShares研究主管Chris Bendiksen表示,比特币算力的激增可能是由于中国矿工更多地部署了更先进的采矿设备所致。不过,随着这些新设备进入其他国家的挖矿市场,比特币的哈希率将在全球范围内更均匀地分布,而中国的算力份额可能会有所下降。

本月初,中国人民银行原行长周小川在财新发文表示,中国一度在“挖矿”方面占的比重很大,像ICO和比特币交易量都曾在国际上占很大比重,这肯定会引起监管部门关于金融市场健康性、消费者和投资者保护及金融稳定方面的一些担忧。

 1/3    1 2 3 下一页 尾页