【区块链】共识机制分支整理_选主 造块 验证_Chahot的博客
考虑一致性和共识之间的区别
虽然共识 (Consensus) 和一致性 (Consistency) 在很多文献 和应用场景中被认为是近似等价和可互换使用的, 但二者涵义存在着细微的差别:共识研究侧重于分布式节点达成一致的过程及其算法, 而一致性研究 则侧重于节点共识过程最终达成的稳定状态; 此外, 传统分布式一致性研究大多不考虑拜占庭容错问题, 即假设不存在恶意篡改和伪造数据的拜占庭节点, 因此在很长一段时间里, 传统分布式一致性算法的应用场景大多是节点数量有限且相对可信的分布式 数据库环境. 与之相比, 区块链系统的共识算法则必 须运行于更为复杂、开放和缺乏信任的互联网环境 下, 节点数量更多且可能存在恶意拜占庭节点。
结构
区块链系统的节点具有分布式、自治性、开放可自由进出等特性, 因而大多采用对等式网 络 (Peer-to-peer network, P2P 网络) 来组织散布 全球的参与数据验证和记账的节点. P2P 网络中的 每个节点均地位对等且以扁平式拓扑结构相互连通 和交互, 不存在任何中心化的特殊节点和层级结构, 每个节点均会承担网络路由、验证区块数据、传播区 块数据、发现新节点等功能。
区块链系统采用特定的 经济激励机制来保证分布式系统中所有节点均有动 机参与数据区块的生成和验证过程, 按照节点实际 完成的工作量分配共识过程所产生的数字加密货币, 并通过共识算法来选择特定的节点将新区块添加到区块链。
性能指标的评估
中心化、效能、安全性和容错率。
中心化 共识算法的去中心化程度可以用各个节点功能的对等程 度来衡量,在传统的P２P应用中,各个节点的功能完全对等, 可以称为完全去中心化.在大多数区块链共识算法中,有一 个单独的打包区块的节点,如POW 中的记账人、PBFT视图 中的主节点.特别在选举委员会一类的共识算法中,委员会 节点的职能高于一般节点,这些都是中心化的体现,但是去中 心化不代表完全没有中心化节点,我们可以用中心化节点的 权利被削弱的程度和中心化节点的选取规则来评判算法的去 中心化程度.
效能 共识算法的效能可以用其能耗、吞吐 率、区块生成时间、交易确认延迟、节点可扩展性和动态性等参数来衡量能耗指算法在运行过程中的算力,如网络、内存 磁盘空间和电力等资源消耗;吞吐量指每秒钟系统可以处理 的交易数量;区块生成时间指从打包交易到上链整个过程的 时间;交易确认时间指一笔交易从生成到确认上链的时间;节 点可扩展性指算法在运行中加入新节点的能力;动态性指算 法中的参数根据网络或者其他运行环境动态调整到更优的能力.
安全性 安全维度关注系统是否具有抵御各种攻击的能力,在区 块链环境下,常见的攻击包括双花攻击、女巫攻击、月食攻击、自私挖矿攻击和无利害关系攻击等.双花攻击指将一份钱花 两次并控制超过一半的算力,使两笔不合法的交易上链;女巫 攻击指攻击者伪造多个虚假身份来控制网络,以多数票击败 网络上的诚实节点;月食攻击指为了控制某个节点,攻击者先 控制与目标节点相连的其他节点,进而达到操控目标节点的 目的;自私挖矿攻击指先挖到矿的节点不发布区块,而是基于 挖到的区块继续挖矿,最后直接发布最长链;无利害关系攻击 指攻击者在过去不同的分叉链上进行挖矿,以获取更大的 利益.
容错 从容错率角度来讲,在传统的拜占庭容错问题中,系统中 的错误节点不能超过系统节点总数量的１/３,否则算法的正 确性或活性无法得到保证.但现在也有许多共识算法提升容 错率.
总结： 共识算法优化的４个维度如图所示,在实际的设计中 需要在４个维度中进行权衡.通常提升效能需要降低一定的 去中心化程度,同时也会导致容错率和安全性的降低.
分类多样性
算法共识和决策共识
算法共识和决策共识两个分支, 前者致力于研究在特定 的网络模型和故障模型前提下, 如何在缺乏中央控 制和协调的分布式网络中确保一致性, 其实质是一 种 “机器共识”; 后者则更为广泛地研究无中心的群 体决策中, 如何就最优的决策达成一致的问题, 例 如关于比特币系统扩容[6] 问题和分叉问题的社区讨 论与路线选择, 其实质是 “人的共识”。
拜占庭将军问题是分布式共识的基础, 也是上述两个研究分支的根源. 拜占庭将军问题有两个交 互一致性条件, 即一致性和正确性.
拜占庭容错和 非拜占庭容错
根据容错类型来进行分类。
公有链共识、联盟链共识和私有链共识
根据部署类型进行分类。
强一致性共识和弱 (最终) 一致性共识
根据一致性程度分类。
选举类、证明类、随机类、联盟类 和混合类
可根据选主策略 (即函数 f 的具体实现方式)
共识算法的过程
共识过程的核心是 “选主” 和 “记账” 两部分,在具体操作过程中每一轮可以分为选主 (Leader election)、造块(Block generation)、验证(Data validation) 和上链 (Chain updation, 即记账) 4 个阶段. 如图 1 所示, 共识过程的输入是数据节点生成和 验证后的交易或数据, 输出则是封装好的数据区块 以及更新后的区块链. 4 个阶段循环往复执行, 每执行一轮将会生成一个新区块.
选主： 选主是共识过程的核心, 即从 全体矿工节点集M 中选出记账节点 A 的过程: 我 们可以使用公式 f(M) → A 来表示选主过程, 其中 函数 f 代表共识算法的具体实现方式. 一般来说, |A| = 1, 即最终选择唯一的矿工节点来记账.
造块： 第一阶段选出的记账节点根 据特定的策略将当前时间段内全体节点P 生成的交 易或者数据打包到一个区块中, 并将生成的新区块 广播给全体矿工节点M 或其代表节点D. 这些交易 或者数据通常根据区块容量、交易费用、交易等待 时间等多种因素综合排序后, 依序打包进新区块. 造块策略是区块链系统性能的关键因素, 也是贪婪交易打包、自私挖矿等矿工策略性行为的集中体现.
验证： 矿工节点M 或者代表节点D 收到广播的新区块后, 将各自验证区块内封装的交易或者数据的正确性和合理性. 如果新区块获得大 多数验证/代表节点的认可, 则该区块将作为下一区 块更新到区块链。
上链： 记账节点将新区块添加到主 链, 形成一条从创世区块到最新区块的完整的、更长 的链条. 如果主链存在多个分叉链, 则需根据共识算 法规定的主链判别标准, 来选择其中一条恰当的分 支作为主链.
一般需要考虑的攻击
在区 块链环境下,常见的攻击包括双花攻击、女巫攻击、月食攻击、自私挖矿攻击和无利害关系攻击等.
双花攻击指将一份钱花 两次并控制超过一半的算力,使两笔不合法的交易上链;
女巫 攻击指攻击者伪造多个虚假身份来控制网络,以多数票击败 网络上的诚实节点;
月食攻击指为了控制某个节点,攻击者先 控制与目标节点相连的其他节点,进而达到操控目标节点的 目的;
自私挖矿攻击指先挖到矿的节点不发布区块,而是基于 挖到的区块继续挖矿,最后直接发布最长链;
无利害关系攻击 指攻击者在过去不同的分叉链上进行挖矿,以获取更大的 利益.
应用理论知识
非对称密码学、对策论、分布式集群关系、控制论、博弈论
未来研究的方向
分为四条主线：
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CoJTUB0B-1657694507094)(https://raw.githubusercontent.com/Haven-852/pic_llw/pic_llw/20220616152941.png)]
共识轮次、共识节点个数、底层硬件、通信模式或加密算法、出错概率等维度,归纳出BFT共识算法的５种优化思路
优化共识轮次 从算法设计上优化,易于共识流程的理解. 此种优化思路较个性化,门 槛高,普适性不
选举委员会 提高了共识效能 削弱了去中心化程度,容易 受到恶意节点攻击和控制, 安全性降低
选用合适的签名算法或底层通信模 给上层算法的设计带来便 利;减小消息复杂度 对底层密码算法或通信模式 有特殊要求
结合可信硬件 最小化可信基,减小受攻击 面,放宽了安全假设,从而给 上层算法的设计带来了便 利,提高了算法的容错率 对硬件要求更高,成本提高, 维护困难
投机与乐观 在运行良好的情况下极大地 提升了算法效能和平均 运行状况较差时效能比未 优化时更低
优化方法： 在分布式领域中常使用FLP不可能原理、CAP定理和 BASE模型来指导算法设计.
FLP不可能原理： 所有节点之间的通讯没有时差，不可能实现没有故障的状态，该理论表明，如果节点可以失效，完全异步通信的分布式系统没有办法在有限的时间内达成信息的一致性，因此分布式系统不可能满足在所有的条件场景下系统节点都能实现共识。
CAP定理： C表示在异步网络模型中的分布式系统，所有节点的数据在极短的时间内完成大规模信息同步的目的；A表示在系统节点正常工作时间内，所有节点都能得到相应的响应；P即使某个节点发生了故障，仍然可以提供以上两种服务。
BASE模型
基本上可用（basically available）：主要的需求是可用性，即使出现划分的情况下，也应该允许更新，哪怕以牺牲一致性为代价。 软状态（soft state）：网络划分可能导致数据库每个副本都有一定程度不同的状态，从而导致整体状态不明 最终一致性（eventually consistent）：当解决完划分后，要求最终所有副本行成一致。
Pow
定义： 工作量证明(Proof Of Work，简称POW)，简单理解就是一份证明，用来确认你做过一定量的工作。监测工作的整个过程通常是极为低效的，而通过对工作的结果进行认证来证明完成了相应的工作量，则是一种非常高效的方式。
哈希函数： 哈希函数（Hash Function），也称为散列函数，给定一个输入x，它会算出相应的输出H(x)。哈希函数的主要特征是：
计算H(x)的过程是高效的（对于长度为n的字符串x，计算出H(x)的时间复杂度应为O(n)）
而对于比特币这种加密系统所使用的哈希函数，它需要另外具备以下的性质：免碰撞、隐匿性、无法猜测。
以上特点是比特币的工作量证明系统可以正常运行的基石。
基本原理： 工作量证明系统主要特征是客户端需要做一定难度的工作得出一个结果，验证方却很容易通过结果来检查出客户端是不是做了相应的工作。这种方案的一个核心特征是不对称性：工作对于请求方是适中的，对于验证方则是易于验证的。它与验证码不同，验证码的设计出发点是易于被人类解决而不易被计算机解决。下图表示的是工作量证明的流程：
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znDR8ZGz-1657694507095)(https://raw.githubusercontent.com/Haven-852/pic_llw/pic_llw/20220620093423.png)]
举个例子，给定的一个基本的字符串"Hello, world!"，我们给出的工作量要求是，可以在这个字符串后面添加一个叫做nonce的整数值，对变更后（添加nonce)的字符串进行SHA256哈希运算，如果得到的哈希结果（以16进制的形式表示）是以"0000"开头的，则验证通过。为了达到这个工作量证明的目标。我们需要不停的递增nonce值，对得到的新字符串进行SHA256哈希运算。按照这个规则，我们需要经过4251次计算才能找到恰好前4位为0的哈希散列。
区块： 比特币的区块由区块头及该区块所包含的交易列表组成。区块头的大小为80字节，由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle Root Hash、4字节的时间缀（当前时间）、4字节的当前难度值、4字节的随机数组成。
区块的大致结构如图所示：
拥有80字节固定长度的区块头，就是用于比特币工作量证明的输入字符串。因此，为了使区块头能体现区块所包含的所有交易，在区块的构造过程中，需要将该区块要包含的交易列表，通过Merkle Tree算法生成Merkle Root Hash，并以此作为交易列表的摘要存到区块头中。其中Merkle Tree的算法图解如下：
工作量证明过程： 我们可以把比特币矿工解这道工作量证明迷题的步骤大致归纳如下：
生成Coinbase交易，并与其他所有准备打包进区块的交易组成交易列表，通过Merkle Tree算法生成Merkle Root Hash 把Merkle Root Hash及其他相关字段组装成区块头，将区块头的80字节数据（Block Header）作为工作量证明的输入 不停的变更区块头中的随机数即nonce的数值，并对每次变更后的的区块头做双重SHA256运算（即SHA256(SHA256(Block_Header))），将结果值与当前网络的目标值做对比，如果小于目标值，则解题成功，工作量证明完成。 该过程可以用下图表示：
具体公式：
Hash｛（前一個区块的 Hash 值）,（当前区块的交易信息）,（随机数）｝<target（目标值）
矿工必須找出一串数字，代入上述公式，让当前区块的 Hash 值开头为 18 个 0 ，例如：
0000000000000000001583447dd74c13c09280a9218827244089adadaba8c8c9
Pos
定义： 权益证明（Proof of Stake , PoS）共识机制，就是为了解决PoW 局限性所衍生的另一种共识机制，PoS 与PoW 的差别在于，PoS 用加密货币抵押量取代矿工算力的比拼，节点不需要花大笔钱买矿机或缴交巨额电费，相反的，他们必须花钱买加密货币，并将这些加密货币抵押在智能合约中。PoS 共识机制下，大部份都是根据「币龄」以伪随机的方式，选择下一个区块的验证节点，简单来说就是，「抵押越多加密货币、抵押时间越长且距离上次获得记帐权越久的节点，获得下一次记帐权的机率越高」。人性本贪，节点抵押的加密货币都是成本，作恶有可能导致币价下跌，且抵押的代币会被没收，对节点而言就像是拿石头砸自己的脚，理性的节点为了最大化利益，理论上不会选择作恶。
锻造者取代矿工 所以在PoS 机制下的节点称作锻造者(Forger)，这样的验证机制使锻造者不需要像矿工一样耗费大量的电力竞争，能源消耗的问题被解决。若锻造者希望在这个区块链之中增加竞争力，只需要抵押更多的加密货币并持续持有，而不需要新增电脑或矿机。相较之下加密货币有机会增值，电脑或矿机只会贬值，所以就经济考量， PoS 对节点也比较有利。
由于PoS 的挖矿成本比PoW 低很多，因此，PoS 共识机制下不一定需要产出新的加密货币作为区块奖励，只需以该区块的交易费作为奖励，即足以维持系统安全。且PoS 甚至可以加入销毁机制，将一部分作为交易费的代币从生态系统中销毁，借此提高代币的价值。
DPoS
DPoS的意思： DPoS (Delegated Proof Of Stake)的中文叫做权益委托证明，或是代理权益证明，它比权益证明PoS(Proof of Stake)多了”委托”两个字，也就是说它是建构在PoS的概念下而延伸出来的共识机制。
PoS (Proof of Stake)必须将加密货币抵押在智能合约中，谁的加密货币多(谁的钱多)，就更有能力去争取新的区块。
DPoS和PoS的同样必须抵押加密货币，但负责验证和记帐的工作交给票选出来的见证人(Witnesses)，因此也可以理解为投票挖矿。
依特性来简略划分，PoW可称为算力挖矿、PoS称为持币挖矿、DPoS称为投票挖矿。
加密货币的持有者抵押加密货币当选票投票给见证人(一般来说会选出数个)， 如果当选的见证人表现不佳、试图有诈欺行为，加密货币持有人可以将这些选票收回，见证人就会被除名，并再由新的见证人递补上来。
简单来说，DPoS让每个持币人进行投票，选出一定数量的见证人， 让他们负责验证和记帐的工作，这些选出来的见证人(节点)权利是相等的。
DPoS权益委托证明机制如何运作？ DPoS权益委托证明机制如何运作？ DPoS权益委托证明机制有3个主要运作方式，分别为投票(Voting)、票选见证人(Witnesses)、票选代表人(Delegates)。
1、投票(Voting)
在DPoS系统中，用户透过投票来选择见证人(用户信任的其他用户)， 获得最多票的人就有验证交易的权利。
选票是根据持有的加密货币数量而定， 越多的加密货币可以转换为更多的选票，算是一种类似民主的投票过程。
2、票选见证人(Witnesses)
得票高的人可以成为见证人，由几位见证人负责记帐，也被称为超级节点。
见证人的数量取决于项目方的设定， 这是固定的数量，例如使用DPoS的EOS币有21个见证人、BTS币有101个见证人。 见证人负责验证交易和创建区块，完成任务后就能获得相关报酬， 这种工作可以想成是PoW中的矿工身份。
每当见证人在时效内生产区块，就可以收取费用奖励，但如果见证人没有生产出区块就得不到奖励， 同时还有可能在未来被投票出局而失去见证人身份。 投票在DPoS是一个持续的过程，因此见证人有可能被一个获得更多投票的用户取代， 见证人彼此之间是非常竞争的。
3、票选代表人(Delegates)
DPoS系统中的使用者可以投票选出代表人(负责维护网路的受信任人)， 主要的工作是监督整个区块链协定的管理和性能，但不负责交易验证与区块生产。
例如：代表可以提议改变一个区块的大小、要付给见证人多少奖励费用， 一旦代表们提出提议，区块链的用户就可以投票决定是否采用这些内容。
这也意味着，投票者可以将选票，投给会给予他们最大回馈的对象，有机会让利润更加平均一点。
Byzcoin
三个主要技术巧妙结合的结晶：cosi，bitcoin-NG，Practical Byzantine Fault Tolerance （PBFT）
问题： 交易冲突，形成叉链。当两个或者多个矿工几乎在同一时间挖矿成功的时候，就会形成叉链。
而最终区块链选择最长的那个链，也就是只会在叉链中选择一个，其他的被丢弃。那些被丢弃的区块的矿工的资源就浪费了。
该问题出现的本质原因是比特币系统缺少新区块生成和发布的统一入口，任何人都可以挖矿且发布新区块。系统以最长链原则来解决叉链冲突问题，冲突的解决依赖时间的流逝，因此，客户端需要依靠概率或者等待很长的时间（1h）来确定一个交易确实被包含到区块链中。这导致叉链攻击。
解决方法1：
上面图片显示一个最简单的解决方案。三角形所形成的网络是一个PBFT网络，该网络的节点是固定且不公开的，所有的交易都由这些节点认证和打包，然后追加到上面的blockchian中。这样的方案简单暴力地解决了区块链分叉的问题。
该PBFT网络充当了比特币共识组的功能。所有新挖出来的区块必须要经过这个共识组所形成的“统一的入口”。
但是，这个方案的问题是，PBFT网络不能是公开的，即不是任何人都能够称为PBFT的节点，因为如果是公开的，就会存在女巫攻击（Sybil Attacks）。
为了让PBFT网络公开，让其他任何人都可以加进来，使用下面图示的方案。
解决方法2：
跟方案1相比，架构没变，但是我们设置了虚线所示的时间窗口，只有在当前这个时间窗口内成功挖到矿的矿工才能成为PBFT网络的成员，任何人都可以通过PoW方式挖矿，挖到矿之后，该矿工称为共识组成员，时间窗口往前移一个区块，意味着可能会有另一个矿工退出PBFT共识组。在一个时间窗口内，可能存在一个矿工多次成功挖矿的情况，这时候它就拿到多个share。每一次成功挖矿，所获得的奖励按照共识组内部矿工所持有的share的比例来分配。最新挖矿成功的矿工作为共识组的leader。
PBFT的通信复杂为O( N 2 N^2 N2 )，认证的时间复杂度为O(n), 我们可以使用非对称加密算法签名的方式让通信时间复杂度由O( N 2 N^2 N2 )下降为O(N),进一步地，我们可以使用集体签名cosi协议让通信和认证过程的复杂度下降到O(1). 具体怎么做呢？
上图表示cosi的两个来回（two round），它可以分别对应上面表格中的pre-prepare, prepare, commit 和reply. 因此，两个rounds的cois就可以实现PBFT。简单理解为就是实现了PBFT的消息传递和共识的达成。
为了提高系统的吞吐量，我们进一步引入bitcoin-NG协议。跟bitcoin-NG类似，区块分为两种，分别是key block和micro block。区块链的结构变成下图所示的样子。结构跟bitcoin-NG基本一致。
因为任何人都可以解决PoW问题来竞争进入共识组，所以就可能出现在几乎相同的时间成功挖矿的两个矿工，冲突形成，由于地理空间距离和网络延迟，一部分节点可能首先收到第一个矿工的消息，另一部分矿工可能首先收到另一个矿工的消息。怎么解决这个冲突呢？也就是这两个挖矿成功的矿工中应该决定谁进入PBFT共识组呢？
思路是，将这两个或者几个成功挖矿的矿工的地址加入一个数组中，升序排序，对这个数组进行hash计算取模，得到一个整数i，数组中下标为i的矿工便是入选者。
另一个问题是，使用cosi的时候需要构造一个二叉树。如何构造和更新这棵树呢？了解数据结构的读者会知道，我们可以使用一个数组来表示一个完全二叉树。现在我们把那个时间窗口内的所有区块元素来表示这个数组，是不是就可以形成一个统一的完全二叉树了？因为区块链是一致的，所以所有的节点都能根据相同的区块链形成一样的完成二叉树。
Sharding
在区块链中，把一个碎片（shard）比作一个仓库，以提高系统的性能。更小的碎片导致更好的整体系统性能，因为（1）一个碎片内节点的通信开销减少，从而提高这个碎片的吞吐量。（2）因为整个系统网络的节点个数一定，那么更小的碎片意味着更多的碎片，因此能够减轻整个系统的压力。（如果N表示整个网络的节点个数；n表示一个碎片内的节点个数，那么整个网络的碎片的个数为k=N/n。所以n表示碎片的大小；k表示碎片的多少。应注意区分）
上图便是传统数据库管理系统和区块链管理系统分片上的区别了。其中一个红圈表示一个碎片，在论文中表示为委员会（committee）。一个委员会包含多个节点，通过拜占庭容错算法来决定这个委员会的共识。共识的作用就是统一意见。这里，可以把一个委员会理解为一个区块链系统。当有一个交易产生时，只需要让一个或者几个委员会来处理这个交易。不同的委员会有时候需要通信，因此我们需要考虑委员会之间通信的问题。
上面便是区块链分片系统的架构了。在该架构之下，有哪一些问题和挑战呢？
（1）一个委员会内的共识算法如何设计？在节点数很多的情况下（>100）拜占庭容错算法速度慢。如下图，当系统节点个数大于67的时候，系统吞吐量下降到了很小的数值。我们是否可以在保证安全共识的情况下尽可能减少一个委员会内的节点个数呢？
（2）需要一个有效且安全的方式来分配节点到各个委员会，避免在一个委员会内有过多的恶意节点。假设整个区块链网络有100个节点，分为5个委员会，每一个委员会有20个节点，且使用的是拜占庭容错共识算法。假设其中恶意节点有10个，并且它们之间相互窜通。如果这些恶意节点全部被分配到一个委员会里面，就会有大问题，它们就能够控着这个委员会的共识结果。解决这个问题的一个方法是将这些恶意节点分散到各个委员会里面，使得每一个委员会所包含恶意节点的数量尽可能少。所以，我们需要解决这个分配问题。在第一次分配好之后，攻击者可能会慢慢把一个委员会内的节点一个一个攻破，使之变成恶意节点，导致这个委员会不再安全。因此需要周期性地重新调整或者说洗牌各个委员会的成员，让恶意节点尽可能均匀分散到各个委员会中。
（3）不同的委员会之间有时候是需要通信的，也就是数据读取或者说跨委员会的交易，我们希望委员会之间的通信具有隔离性和原子性。
本论文针对这三个问题和挑战提出了解决方案，也就是本论文的贡献点了。下面讲解如何解决这三个问题的。根据第一个挑战，提出了：
改进的PBFT算法
论文使用了TEE+PBFT来改进共识算法（TEE，可信执行环境，可参考本人这篇文章）。PBFT算法的安全假设为恶意节点的个数不大于f，其中N=3f+1，N表示一个网络的节点个数，也即是f< N/3。如果使用了TEE+PBFT，可以让f< N/2的前提下实现安全的共识（具体可以查看论文引用17）。这样的好处就是使得这个网络抵抗恶意节点窜通攻击的能力提高了。比如网络中有10个恶意节点，为了实现安全的共识，使用PBFT算法，网络至少需要31个节点，其中包含21个诚信节点；而现在结合TEE，网络至少需要21个节点来实现安全共识，其中包含11个诚信节点。这样子，在一个委会会内，更少节点个数就能实现安全的拜占庭容错共识。
在区块链系统中形成分片比在分布式数据库中更复杂。首先，节点必须以无偏见和随机的方式分配给委员会。其次，必须仔细选择每个委员会的规模，以便在性能和安全性之间取得良好的平衡。最后，必须定期执行委员会分配，以防止适应性攻击者破坏委员会中的大多数节点。
为了避免大的可信计算基（TCB，trusted computing base）导致的系统安全隐患，系统没有把整个共识协议放到TEE中执行，而是使用论文17的方式，结合日志、消息摘要和TEE密钥加密来实现安全。这里不深入讲解。
在一个委员会里面的所有节点的通信方面，论文给出了一个小改进。超级账本Hyperledger的共识消息和请求消息共用一个消息队列，导致大量的共识消息被丢弃，特别是在委员会节点数增加的时候，使得吞吐量下降。所以，论文使用两种队列来分别处理共识消息和请求消息。
针对第二个挑战，提出了如下思路：
委员会成员的分配 SGX（一种TEE产品）有两个函数用于在Enclave处理：sgx_read_rand和sgx_get_trusted_time，分别用来产生无偏见的随机数和产生一个时间戳。论文借用这两个函数来实现委员会成员分配。
总体思路：假设每一个节点都获取到了一个相同的随机数rnd，那么每一个节点都可以使用rnd作为种子（seed）来获得元素为[1:N]的一个随机全排列 π \pi π。因为种子是一样的，所以每一个节点的随机全排列 π \pi π 是一样的。再将 π \pi π 划分为k份，每一份便是一个委员会了。
现在问题是，如何让每一个节点都获取到一个相同rnd呢？
本系统是分时期工作的（比如一个时期长24h），每一个时期开始的时候就动态洗牌各个委员会。使用e来表示当前是第几个时期。为了避免攻击者选择性丢弃TEE的enclave的输出结果，导致随机数生成出现偏见，因此每一个时期TEE的enclave只能被调用一次。在每一个时期e开始的时候，执行下列步骤生成一个全网统一的随机数rnd。
如果q=0，那么该节点就生成一个包含<e,rnd>的签名证书，广播该证书到其它所有节点
使用3中的最小rnd来作为当前时期的委员会分配的随机种子seed。
每一个节点拥有一个相同的随机数rnd之后，就可以根据上述的总体思路来确定一个节点属于哪个委员会了，也就是委员会分配问题的解决。
如果所有节点生成的q都不等于0，那所有的节点都不能生成上述步骤2的证书，也收不到被广播的证书，那当前时期就无法重新调整委员会了, 怎么办？
解决思路为，所有节点的e增加，重新执行上面步骤。
另一个问题是，攻击者可能会慢慢一个一个攻破一个委员会中的节点，使得该委员会的恶意节点个数超过安全共识的临界值。所以我们需要每隔一段时期就要根据rnd重新调整委员会的成员。所有的节点同时调整是不可行的，因为会导致系统在这段时间不可用，因此采用分批调整的方式。在调整的过程中，每一个委员会最多有B个节点调整到其它委员会，这B个节点在这期间不参加共识工作。B的的大小设置需要权衡，更大的B值导致更低的系统安全性。
针对第三个挑战，提出了下面思路：
两阶段锁和两阶段提交
论文使用两阶段锁和两阶段提交来解决委员会之间通信的问题，并且满足隔离性和原子性。总体思路如下图所示，委员会之间的通信分为三个阶段，分别是准备，准备提交，提交。R表示参考委员会（Reference Committee），S1，S2，S3便是涉及到本次的transaction的委员会了。参考委员会在构造上面跟其它委员会没有区别，只是它是一个协调者的身份。“协调者”这个角色来自两阶段提交协议，即两阶段里面的协调者和这里的协调者的工作基本是一样的。只是这里的协调者是一个委员会，由很多个节点构成，使用拜占庭容错共识。简单理解协调者就是多个节点按照拜占庭容错共识来完成交易和消息的分发，然后将多个节点看为一个协调者。这样子看起来就有些像中心化的服务器，但是本质上是分布式，这样子加快消息的传递，减轻多个节点进行拜占庭容错共识的交流时间。
一个Transaction可能有多个输入和多个输出，这些输入和输出可能涉及到多个委员会，这些委员会在下图表示为S1，S2和S3。
具体的跨委员会交易执行流程是什么呢？
参考委员会自身有一个状态机，如上图所示，用户发送一个交易Tx给参考委员会，这里使用R来表示参考委员会，R就进入Started状态，它向相关的委员会发送PrepareTx，同时等待收集各个委员会的回复，如果所有的回复都为PrepareOk, 那么就进入committed状态，R正式提交交易。如果有任何一个委员会回复PrepareNotOK，参考委员会进入Aborted状态。如果任何一个委员会回复消息过时或者不回复，那么R进入Aborted状态。
参考委员会会成为系统性能的瓶颈吗？论文说不会，通过运行多个参考委员会来并行计算。
R是否会存在可用性问题呢？因为论文的假设是一个委员会的恶意节点数量小于安全共识的阈值，因此R总是能够执行诚信的共识来完成作为协调者的工作。
总结： 这篇论文针对上面三个问题和挑战，借用TEE提出了自己的解决方案。这篇论文包含的信息量比较大，阅读和理解这篇论文有一定的难度，因为作者假设读者已经清楚了一些基本概念，比如区块链分片，参考委员会的构造和管理，拜占庭容错算法，TEE，两阶段提交和两阶段锁等等。论文使用了RapidChain和OmniLeger作为对比来叙述跨委员会交易的原子性和隔离性问题。在阅读这篇论文之前，了解RapidChain和OmniLedger这两篇论文有助于理解这篇论文。
OmniLedger
参考文章： Kokoris-Kogias, Eleftherios, et al. "Omniledger: A secure, scale-out, decentralized ledger via sharding."2018 IEEE Symposium on Security and Privacy (SP). IEEE, 2018.
Byzcoin的延申。 基于processing的分片，不是基于状态的分片，以此所有的矿工需要保存所有的状态数据，或者说在矿工在不同的时期被随机分配到其它片之后，需要下载新的所在片的状态数据。
先看总体的架构，下面是naive version，然后，论文基于这个版本所存在的问题来改进。
上面图片看起来分为三个层，注意的是这三个层出现的时间呈先后关系。意思是，先生成一个随机数 r n d e rnd_e rnde​ ,那些validators（认证者）再根据这个随机数决定自己在上图第三层中的哪一个片中。每一个片都是一个Byzcoin。
上面的版本存在几个很大的问题需要解决，分别是：
1.如何生成无偏差的 r n d e rnd_e rnde​？不能使用可信的第三方，我们要做到在不相信任何一方的情况下生成。
2.认证者们如何只根据一个随机数 r n d e rnd_e rnde​就能够知道自己属于哪一个片呢？
3.如何才能成为认证者？我们需要避免女巫攻击，特别是使用PBFT的情况下。
下面一一解释如何解答上面这些问题。
论文使用分布式的无偏差随机数生成方案RandHound，在使用它的时候，存在一个问题，那么就是RandHound方案需要一个节点当leader这个角色，但是如何选择leader呢？选择leader的时候要无偏差，应避免leader是敌手。原本需要RandHound生成一个无偏差的随机数，但是，现在为了设置和初始化RandHound，需要一个无偏差的随机数。这是一个鸡蛋和鸡谁先出现的问题。因此，文章使用了基于
VRF
的leader选举算法。具体不深入，我们暂时只需知道 r n d e rnd_e rnde​被在无需信任任何一方的情况下无偏差地生成了。
对于第二个问题：如果每一个认证者都知道总共有n个认证者，且他们都收到了随机数，把这个随机数作为seed，使用下面的以python代码为例子的算法就能得到一个随机全排列，每一个数对应一个认证者的id。如果认证者都知道有m个片，那么根据n/m，他们就知道自己属于哪一个片了。
不是所有的计算机节点都可以成为认证者的，在加入之前需要获得资格。为了避免女巫攻击，可以使用WoP或者SoP的共识算法来做。在每一个时区比如一天都要将一部分认证者从一个片调到另一个片中，避免攻击者将某一个片中的很多（1/3）的节点攻破。因此，如果当前是第e时区，那么新节点需要在e-1的时区获得加入资格。为了专门记录这个，论文使用了identity blockchain。
为了实现跨片交易，这篇论文将这个工作交给client来完成。这样的一个优点是ommiledger协议在跨片上就很简单，片之间不用交流。先上图：
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TWqLtaa8-1657694507104)(https://raw.githubusercontent.com/Haven-852/pic_llw/pic_llw/20220616210340.png)] 分为三个步骤来实现一个这样的交易：将第一和第二个分片中的账户的钱转到第三个中，如上图所示。
用户要让第一和第二个片的leader生成一个证明，证明用户确实在这个片中有可用的钱。
如果第二个leader说该用户没钱在该片，拒绝生成证明，而第一个leader已经成功生成了一个证明，并锁住了该片中的该账号。这时候client是无法让第三个片的leader执行交易的，因此client只能将第一个片中的账号解开。（论文中没有说明如何解开，第一个leader如何判断client没有成功转账？如果client成功转账了，同时恶意地也向第一个leader解开在第一个片中的账号，就会存在重复花费的问题，怎么解决？）
所以跨片交易的责任都交给用户自己来做了，不同片之间不存在信息的交流。在转账交易这个场景上是合理和简单的，解决了要么所有都成功要么所有都失败的效果，但是在其它应用场景上，估计就不够方便了。因为用户会偷懒，只希望点点按钮就能全自动化完成。
其它
在论文中所提到的Trust-but-Verify的认证，是一个很笼统的描述，存在很多没有解决的问题，比如如果惩罚optimistic validators？如何选举optimistic validators和core validators？
经过一定的时区之后，一部分节点需要调换到不同的片中，这就需要这些节点下载和加载好新的片的状态数据。而这些数据可达几百Gb，在短时间内拷贝和加载可不容易。因此我们要裁剪这部分数据，只留下对认证有用的数据。如何裁剪？举一个例子，在UTXO模型中，有 a -> b -> d, 表示三个交易的输入输出关系，为了认证d的钱是来自b的，我们需要使用b来认证。如果我们从b开始生成一个checkpoint，表示b之前的交易都是合法的了，无需再认证了，那么我们就可以不用再保留a的数据，只需要这个checkpoint就可以了。这样子我们就裁剪了a这个数据。裁剪之后，需要生成一个区块，让其它节点认证通过该checkpoint。
论文中提到了ByzCoinX，所谓是byzcoin的改善版本，两者的区别是，前者是一个三层的数，第一层也就是leader，第二层是一个片的group中的一个组长，第三层就是该片的其它成员。后者是一个层数为log（k）的树，可以是二叉树。
POSp(空间证明)
参考文献 ：Ateniese, Giuseppe, et al. “Proofs of space: When space is of the essence.” International Conference on Security and Cryptography for Networks. Springer, Cham, 2014.
思路： 之前我们设置的POW是用和CPU绑定的方式来抵抗来自外界的攻击， 这时我们就需要有能验证CPU密集计算能力的算法，所以发明了POW的验证方式，而随着人们对交易信息的多次访问，是不是需要有对内存密集型验证的函数，如果有对内存密集验证的算法，那么算法是什么呢？后面论文提出一种模型和理论分析来验证自己对空间证明算法的合理性和空间下届的确定。
方法： 内存绑定函数复杂度衡量的是内存访问次数，并未考虑实际使用的内存量。在中给出的内存绑定 PoW 的主要结构中，证明者和验证者共享一个大的随机表 T。证明者必须通过对 T 中的均匀随机位置进行多次内存访问来计算一个函数。通过适当的调整在参数中，也可以强制证明者保留特定数量的内存。在另一种结构中，表明验证者不必存储 T。想法是签署所有对 (i, T[i])，然后在 T 的位置上挑战证明者。证明者将返回值 T[i] 以及可由验证者检查的聚合签名，以确保证明者持有表 T。
总结
这里主要是将pow分支中比较重要的知识点进行整理，方便以后对这些方向进行回顾。感兴趣的老铁可以和我进行讨论。