带宽其实是区块链吞吐量的最大限制,在美国旧金山举办的 Scaling Bitcoin Meetup 中,Nervos & Cryptape 研究员张韧从「带宽利用率」角度分析了诸多共识协议的效率和可行性。html
Algorand 的带宽利用效率如何?Cardano 的 Ouroboros 怎么样?Solana、NKN 为何能有那么高的TPS?以太坊将出块间隔缩短到 15 秒,为何并无比比特币吞吐量高出不少?算法
这些问题,张韧博士都会在分享中一一回答。如下为韧博士演讲稿整理,如若但愿和韧博士进行进一步讨论,欢迎点击:https://talk.nervos.org/t/ner...,咱们在 Nervos Talk 共同探讨。编程
阅读本文对读者的区块链基础知识储备有必定要求:segmentfault
- 比特币共识协议(也就是 Nakamoto Consensus)基本概念
- 以太坊共识协议基本概念
- 孤块、叔块、自私挖矿等概念
整理:Ryan、万涔涔安全
视频连接:https://v.qq.com/x/page/g0837...性能优化
自我介绍一下,我是张韧,Nervos & Cryptape 的研究员,目前我在鲁汶大学 COSIC (Computer Security and Industrial Cryptography group) 读博士,师从 Bart Preneel。 若是你对 COSIC 不熟悉的话,不知道你是否据说过 AES,它是咱们全部人的手机中使用的加密标准。网络
固然若是你熟悉 Bart Preneel 的话,会知道他是 RIPEMD 160 的设计者。RIPEMD 160 是比特币公钥转化为比特币地址时使用的哈希算法。编程语言
Nervos CKB 是一个公有链,可以支持各类编程语言的智能合约,以及各类各样的 Layer 2 协议。在 Nervos CKB 上你能够用任意资产支付交易手续费。在 Nervos CKB 中智能合约的执行和验证是分离的,从而达到更好的隐私和性能。最后,在 Nervos CKB 中采用了 NC-Max ——一个 Nakamoto Consensus 的变体——做为共识协议,拥有更高的吞吐量。分布式
声明:本次分享内容仅着眼于 Layer 1 共识协议的分析,我将不会谈到 Lightning Network 这样的 Layer 2 方案。性能
这里是我本次分享的大纲,首先我会告诉你为何咱们会那么喜欢 Nakamoto Consensus(也就是比特币的共识协议,如下简称 NC,包含一组规则,如最长链规则、激励规则、增发规则等)。而后我会给出咱们为何不采用其余共识协议的理由。最后我会给出咱们 Nervos CKB 的共识协议 NC-Max 的设计思路。
先来回答一个问题,为何咱们喜欢比特币的 Nakamoto Consensus(NC)?
有不少的理由,首先 NC 的性能优化作的很是好,它可以节约每个传输的每个字节,以及每一个计算周期。举例来讲,它使用Compact Block来加快区块的传播,可能在将来使用 Minisketch (一个用于在分布式系统不一样节点之间同步信息时,下降带宽需求的软件库)来节省交易广播所须要的带宽资源。同时比特币的开发者提出了 Graftroot(关系到比特币上开发智能合约以及隐私性的一项提案),你能够认为它可以经过压缩比特币上的智能合约从而得到更好的隐私性和更好的性能。或许咱们还可以看到签名聚合技术(Signature Aggregation)应用在比特币之上。
知识点:Compact Block Relay,在比特币改进协议(BIP)152 中提出,可以减小 P2P 网络节点广播区块所需的带宽数量。
Compact block 是完整区块的「概要」,包含下面三部分信息:
一、新区块的区块头
二、交易 ID
三、发送方节点预测的可是接收节点不具有的完整交易
接收方会尝试根据收到的信息以及在其内存池中的交易来从新构建完整区块。若仍然缺失某些交易,它将会请求广播节点。*
喜欢 NC 的另外一个理由是它的通用性。UTXO 模型加上全局交易顺序可以支持各类分片技术和 Layer 2 方案,以及复杂的智能合约。
相比来看,以太坊的 Account 模型进行分片的难度更高;而且若是你没有一个全局交易顺序的话,好比像许多 DAG 类型协议那样,那么就很难支持复杂的智能合约,关于这一部分会在后面谈 DAG 的时候详细描述。
咱们也喜欢比特币 NC 的安全性。比特币网络经历了不少的攻击,仍是稳定运行了十年。并且严格意义上来讲,目前没有任何一个已知的工做量证实共识机制在总体上超越 NC。若是你对这个话题感兴趣,能够看这里。
然而在 NC 中有两个地方咱们但愿作出一些改变。首先在带宽利用方面,比特币的 NC 在采用隔离见证以后,人为设定了最大为每十分钟 4Mb 的吞吐量,然而现实状况是,比特币公共节点的带宽水平在过去的几年里得到了大幅度的提高。
如同上图中这个研究所指出的,连接到网络中的比特币 IPv4 节点在 2016 年时带宽中位数为 33Mbit/s,在 2017 年 2 月,这个数字达到了 56Mbit/s。
咱们很容易想到的改进方式就是,协议自身是否可以动态地调节吞吐量来适应带宽水平的变化?
Bitcoin Unlimited 作了一个糟糕的尝试,它但愿可以动态地调节比特币的吞吐量,可是它失败了,引入了多种新的攻击方式让它的协议变得不安全。上面是在 Coindesk 上发布的一篇关于 Bitcoin Unlimited 安全性研究(连接:https://www.coindesk.com/etf-...),我也是这项研究的参与者之一。
另外一个咱们但愿在 NC 中作出改变的是它的激励问题,也就是出现自私挖矿攻击的问题。自私挖矿攻击者会扣留发现的区块,但愿在网络中得到更大的领先优点。当其余诚实矿工发现区块的时候,攻击者会向网络广播这个被扣留的区块,寄但愿于这个被广播的扣留区块会在诚实区块以前,被大部分诚实矿工接收到。若是攻击者足够幸运,下一个块是在攻击者的块上面进行挖矿的,那么诚实的块将会成为孤块。若是攻击者运气好到可以连续挖到多个区块,那么它将可以很是安全地让一个诚实矿工的区块失效,由于攻击者会有更长的链。
为何自私挖矿是有利可图的呢?咱们举一个具体的例子,假设自私挖矿攻击者有全网 30% 的算力,诚实矿工控制剩下的 70%。若是没有自私挖矿攻击出现,那么攻击者在 10 个区块中可以找到 3 个,诚实矿工找到 7 个,你们都拿到应有的报酬。若是攻击者发动自私挖矿攻击,那么它可以找到 3 个区块,诚实矿工只能找到 4 个区块,由于另外 3 个诚实矿工找到的区块通过前面提到的攻击方式变成了孤块,本来可以产生 10 个区块的时间如今只产生了 7 个区块,主链增加速度减慢。
在下一个难度调整周期,因为协议发现主链增加速度减慢,会下降挖矿难度,从而攻击者可以用一样大的算力得到更多的奖励,这是自私挖矿有利可图的原理。要注意的是,矿工得到的收益是根据单位时间内得到的币的数量而不是得到币的比例来计算的。在下一个难度调整周期,因为链增加的速度降低,协议会下降挖矿难度,此时矿工在单位时间可以得到更多的币,才有收益。所以,自私挖矿在第一个难度调整周期中是没有收益的,只有在挖矿难度调整以后自私挖矿才会有收益。
那咱们为何不选择其余替代性的共识协议呢?
目前有三种替代 NC 的方式,它们分别是 PoS(Proof of Stake,权益证实),DAG 和两种区块类型的共识协议。注意这三种方式并非相互排斥的,是有可能同时应用它们之中的 2-3 种的。下面咱们来进一步分析这些协议的安全性、功能性和吞吐量。
首先是 PoS,实际上全部的 PoS 协议引入了新的安全前提。拿 Algorand 举例来讲,它要求大部分诚实用户发送的消息可以被大部分其余诚实用户在一个已知的时间范围内里面接收到。这意味着当你持有 Algorand 的 Token 时,根据协议最初的设计你须要时刻保持在线来接收消息。若是你不在线你就不是一个合格的 Token 持有者。
Cardano 的共识协议 Ouroboros 则假设全部用户有一个弱同步的时钟,而且全部消息都可以在必定时间间隔内被送达。这其实是提出了一个很是强的假设。有不少攻击方式可以让你的挖矿设备,你的公共节点或者手机上的时钟产生误差。而且这个方案在现实环境中实现起来也很是困难。
另外 Sleepy Protocol 也要求用户拥有大体同步的时钟。
当这些安全性假设被违反,会为这些 PoS 协议带来灾难性的后果。而且 PoS 协议引入了一些新的攻击方式,如 Nothing-at-stake Attack,Grinding Attack,Long-range Attack,这些攻击方式在 PoW 协议中是不存在的,在这里我不对这些攻击方式进行详细描述。
那么 DAG 协议怎么样呢?
全部 DAG 协议都有交易排序的问题,如像 DAG 协议那样让区块同步产生,那么不一样的矿工或不一样的公共节点对交易顺序的判断会有不一致:我认为这一些交易被确认了,可是其余人可能认为另外一组交易是被确认的。这时候你会有两种解决问题的思路。
一种是在区块链拓扑排序完成以后对交易进行排序,这意味着你须要等待很长的交易确认时间。
另外一种是不去确认交易顺序。合约的输入须要全局的交易顺序,若是不一样矿工判断的交易顺序不一样,那么每一个矿工对合约逻辑执行顺序的理解就是不同的,特别是对于复杂的合约。这会限制合约的功能性,复杂合约不能执行,合约中包含的 Token 会卡在合约中。
那么那些有两种区块类型的协议如何呢?两种区块类型的协议,顾名思义,它采用一种和 NC 中的区块同样的关键区块(Key Block)来保障交易确认的安全,同时在两个关键区块之间广播微区块(Micro Block)来提升吞吐量。
这些协议一般和 DAG 协议同样会有较长的确认延迟。Bitcoin NG 就采用了上述的方案。在 Bitcoin NG 的论文中明确代表,若用户须要确保交易确认,在 Bitcoin NG 中他们就须要等待数个关键区块的确认,忍受较长的交易延迟。
(本来在分享过程当中张韧提到 Byzcoin 也有相似的问题。可是通过进一步分析发现问题并不相似,若对 Byzcoin 感兴趣能够在论坛:https://talk.nervos.org/t/ner... 进一步讨论 )。
全部采用这些替代性共识协议的项目都声称它们有很高的吞吐量,那么这些项目的吞吐量究竟如何呢?(下面这一段建议观看视频,约在 15:30 部分,现场很是精彩 )
Solana 声称可以每秒可以处理 710000 笔交易。若是你可以有这么大的突破,理应得到图灵奖。我火烧眉毛地想听到他们获奖的消息。
还有这个名为 NKN 的协议,他们声称他们可以在全网拥有 10000 个节点的同时每秒处理 100 万笔交易,目前我还不知道他们是如何作到的,可是我对他们实现的方式很是好奇。
我也很好奇为何 Stellar 和 Ripple 也将本身的协议归类为 NC,我也很是好奇 10000 个节点如何实现每秒处理 100 万笔交易的。
而若是你想作个梦的话,你最好作一个伟大的梦,好比这个协议。它声称可以在低于 1 秒的最终确认时间内拥有 1000000000000TPS 。
嗯,我真的以为地球对他们而言已经不够大了,他们真的须要另找一个更大的星球来部署他们的协议。
咱们要注意的是,自称的 TPS 是没有可比性的。由于它们是在不一样的网络环境中作模拟,某些模拟甚至使用 1Gbit/s 的带宽,显然这和现实网络状况相差甚远。
而且这些协议都忽略了真实的状况。他们之中没有一个考虑到交易的同步。对它们来讲彷佛全部的交易都是已经在区块中同步好的同样,共识协议只是用来对交易进行排序的。并且一些模拟假设委员会成员(节点)之间有直接的链接,但事实是,在公有链网络中全部的消息都是经过广播进行的,而广播消息会占用公共节点的带宽。
知识点:Fresh Transaction,为何说要考虑交易的同步呢?要认识到,在比特币中一个用户从钱包客户端发起的交易并非被全部矿工都接受到,而是相邻的几个矿工。这些矿工在接受到用户发起的交易的时候会对交易进行验证才能放到交易池中,以便在将来将这些交易打包出块。所以若一个矿工成功挖到一个块并广播 Compact Block,其余矿工在检查 Compact Block 中交易 ID 的时候若发现对应的有些交易并不在本身的交易池中,则须要向发送方请求完整交易进行验证来保障区块中全部交易都是合法的,这些交易就是「Fresh Transaction」。若不进行验证就在收到区块以后挖矿,一旦完整区块广播后被发现有非法交易,将不会被矿工承认,在这个非法区块以后挖出的区块都会做废。Fresh Transaction 的概念咱们会在后面用到。
这里咱们有一个评估 TPS 的模型。如图所示,首先咱们相信全部公共节点的带宽是有一个上限的,最多可以使用 100% 的带宽,你不能使用超过 100% 的带宽。在这里带宽的占用有三个组成部分。
如上图所示,第一部分是用于同步最终确认的交易所占用的带宽比例,这一部分是真正的 TPS(This is the real TPS)。交易首先要被同步,以后才能进行交易确认。第二部分是被共识协议「浪费」的带宽所占的比例。第三部分是未被利用的带宽。
因此若是想要提升 TPS,可以作的只有两件事。
一、下降共识协议占用的带宽比例
二、下降未被利用部分的带宽比例
能作的只有这两件事情,对,没有其余的方式了,而且对于 Layer 1 的协议带宽占用不能超过 100%。
那咱们先来看看其余替代性共识协议的带宽占用。
事实上,不少协议将它们珍贵的带宽资源浪费在委员会成员之间的通讯上。
Algorand 存储区块证书以此来向新用户证实一个区块被提交。每一个区块证书的大小是 300KB ,独立于区块容量限制以外。若是你按照一个区块 1MB 的大小来计算,那么这意味着大约 25% 的带宽会永远被用于同步这些证书。所以我很是好奇为何它们声称他们的吞吐量比 NC 更好,这根本不合理。
另一种在共识协议中浪费带宽的方式是区块型 DAG 和孤块中的冗余交易。如上图的论文中所说,若是全部的节点在区块中选择包含一样的一组子交易,任何两个平行建立的区块将可能出现冲突,而且吞吐量就不会很高。
而目前全部的区块型 DAG 协议对这种状况视若罔闻。
从上面的分析中看到,显然目前的吞吐量不能知足咱们,所以,Nervos CKB 的共识协议 NC-Max 对 NC 作了一些改进:
NC-Max 有三个主要的创新
采用两步交易确认来下降孤块率
动态调整区块间隔和区块奖励来更好的提高带宽利用率
在难度调整的时候考虑周期中的全部区块,来抵御自私挖矿攻击。
接下来我会进行详细解释。
NC 有一个自然的吞吐量限制,由于想要提升 NC 中的吞吐量,只能作两件事情:
第一件是更大的区块,就如 Bitcoin Unlimited 和 Bitcoin Cash 那样,还有不少其余的项目也这样作;
第二件是下降出块间隔。
可是因为区块广播须要时间,广播期间若其余节点发现区块并广播,会和正在广播的区块产生竞争,其中之一会成为孤块。更大的区块会须要更长时间广播,下降出块间隔其实是下降出块难度,节点更容易发现区块。这两种方案容易带来的结果是孤块率变高了。这些孤块占用更多的带宽,可是它们并不为交易确认作出贡献。当孤块率提升时,系统的安全性会下降而且吞吐量也会下降。所以对于这两种方案最终会达到一个平衡,当区块大小或出块间隔调节到必定程度时,孤块率会高到必定程度,即便你进一步增长区块大小或者下降出块间隔,吞吐量也不会获得提升。
为何太多的孤块会对网络的安全和性能产生负面影响呢?在上图中咱们可以看到,当孤块率很是高时,攻击者可以很是轻易地私自构建一条更长链。攻击者只须要拥有比全网算力的 51% 低不少的算力,就可以覆盖掉区块链。而且孤块会消耗公共节点大量的带宽,这会对整个系统的吞吐量形成很大的负面影响。
那咱们如何打破 NC 吞吐量的限制呢?通过上面分析,若是咱们想要打破这个限制,就必须下降孤块率。若是孤块率降低,那么网络的安全性和吞吐量都可以提升。
如何下降孤块率呢?孤块的出现是因为区块广播的延迟,若在一个区块广播的过程当中,有另外一个区块被发现,那么其中一个区块就注定会成为孤块。若是区块广播可以瞬间完成,天然不会有孤块出现。那咱们如何确保区块可以足够快速地被广播出去呢?
比特币的开发者已经投入了很是多的资源和精力来加快区块的广播速度,咱们须要进一步找出哪些区块的广播速度较慢,或是出了问题。
咱们来详细看看这是如何发生的,请看下图。
目前的比特币网络,若是一切顺利的话,一个区块是经过一个Compact Block 中继协议来广播的。
在 Compact Block 中,并不会将整个交易(比特币每一个交易大约 250Bytes)广播出去,而是广播 Compact Block 中的交易 ID。这些交易 ID 组成了 Compact Block,这些 Compact Block 比实际的区块小不少,所以速度会快不少。
当节点 A 广播 Compact Block 给节点 B 的时候,节点 B 检查这些交易 ID ,若是对于节点 B 这些交易都不是 Fresh Transaction(也就是节点 B 的交易池中包含这些交易),节点 B 可以马上转发这些 Compact Block 给相邻节点,这种状况很是棒,过程很顺利。
然而若是在 Compact Block 中有 Fresh Transaction,节点 B 将首先须要从节点 A 那边同步 Fresh Transaction,而后验证这些交易的签名,这些步骤都很耗费时间。只有当整个区块都通过验证无误以后,节点 B 才能继续广播这个区块。这个过程避免收到的区块非法,这样矿工才会在这个区块以后挖矿并广播,若不通过验证万一以后发现是非法区块,那么在这个非法区块以后的区块都是无效的。同步 Fresh Transaction 的过程是比特币区块广播延迟的主要缘由。
因此,以太坊是一个糟糕的尝试,我来分析一下他们是怎么作的。以太坊简单地缩短了出块间隔,可是以太坊有一个问题,就是它不可以在收到区块以前验证交易的有效性。由于在以太坊中一个交易的有效性依赖于区块中交易的顺序,所以若是你想要验证一个交易的有效性你必须等到整个区块都被接收到才行,这样的话每个区块实际上都是 Fresh Transaction。
而且以太坊的网络协议维护得很是差,自从 2015 年开始就没有任何的迭代。
并且在交易广播过程当中也有大量的冗余。以太坊客户端会将同一笔交易向不一样的节点广播 7 次,这意味着每个节点将会收到同一笔交易 7 次。(以太坊有不一样的客户端,如 Parity Ethereum,Geth 等)并且不一样类型的客户端之间有不一致性,两个主要的以太坊客户端之间基本都是独立的。
所以可以连接两个不一样的网络的节点很是少,这也是为何以太坊孤块率有时会高达 30%,而且交易吞吐量很是低。
并且大矿工没有加快区块广播速度的激励。由于若是个人区块可以更慢地广播出去,意味着我实际上可以实现「自私挖矿」(这里大矿工并不扣留区块,只是区块广播比较慢,在这个过程当中出现了其余的竞争块,而由于我是大矿工有较大的几率在和其余竞争块竞争过程当中胜出)。这对我来说是好事,为何我要加速区块广播呢?
以太坊中的叔块奖励也没有提供任何帮助,毕竟若是产生了的孤块,矿工仍是可以得到奖励。所以小矿工会采用先广播区块头和空块的方式,由于广播区块头的速度会快不少。而且因为不知道下一个区块中会包含哪些交易,所以矿工一般会挖一个空块来确保区块中不会包含和以前区块交易产生冲突的交易。这很是糟糕,由于空块并不为交易确认作出贡献。
下面是咱们的设计,来缓解上面提到的一些问题。
这张图是区块的结构,咱们在比特币区块结构的基础上增长了几个字段。
上图是咱们的完整区块的区块结构。首先咱们有一个交易提案区(青色区域)。只有交易提案区可包含 Fresh Transaction,而传统的交易确认区(橙色区域)只能包含前几个区块的交易提案区的交易,若当前区块高度是 h 的话,那么就是 h-m 到 h-n 区块的交易提案区内的交易。只有这些交易可以被确认,Fresh Transaction 不能被交易确认区确认。交易提案区不包含完整的交易,只包含交易 ID(Truncated Transaction ID),所以交易提案区会很是小。
在叔块头区能够包含任意数量的叔块(紫色区域),叔块应该包含它们的区块头和交易提案区。叔块头区不计入区块大小,于是不受区块大小的限制,因此不会限制矿工添加叔块。
下面我进一步来解释交易提案区。这个区域很是小,由于它只包含交易 ID。完整的交易与区块同步广播,由于这是一个并行的过程,因此交易的广播不会影响到区块的广播。而且节点在收到广播的交易后只须要验证哈希,不会影响区块的验证过程。
尽管这意味着在交易提案区可能会有无效的交易,双花交易以及矿工可能不肯意接受的交易,可是这都没有关系。
类比以前提到的比特币区块广播过程,在咱们的协议中,发现区块的节点会先广播 Compact Block(也就是区块头和交易的 ID),Compact Block 较比特币的稍微大一点,包含交易提案区和若干叔块的区块头和叔块的交易提案区。但因为 Compact Block 自己足够小一般会马上广播给相邻的节点。
新提出的交易,若是有一部分不在节点的交易池中,它们会在发出 Compact Block 以后进行广播。这些都是并行过程,不会相互影响。节点收到交易,通过哈希验证后广播给相邻的节点。
这很天然地会有几个问题:
若是矿工拒绝提供提案交易的完整版本怎么办?
我把这个交易放到个人交易提案区,可是当你问我要完整的交易的时候,我装做不知道。
实际上这个对区块广播不会有影响,由于不论交易提案区是否有 Fresh Transaction,区块都可以广播。
而且其余矿工也会继续挖矿,由于老是有足够的提案交易须要确认。该矿工也没有必要挖空块,由于以前区块的交易提案区包含了它将打包的这些交易 ID,已经被发现的区块在 Compact Block 中都广播了打包进的交易确认区的交易 ID,矿工都知道哪些交易被打包了哪些没有,不会选择和被发现区块交易确认区内相冲突的交易,所以矿工会选择继续打包交易出块并得到手续费,为交易确认作贡献。
那么若是矿工在他们最新的区块中包含了这些提出但未广播的交易,以得到一个相似自私挖矿的优点怎么办?
在比特币的 NC 中,矿工减慢区块广播速度能够得到挖矿优点。矿工一般可以在挖出一个区块时,只广播区块头,而在广播完整区块的时候放慢动做。在这个过程当中只有该矿工可以挖矿(由于只有他知道下一个区块的信息,可以基于这个新块挖矿,这个过程相似扣留区块)。
可是在咱们的协议中,采用这种方式只会减慢 n 个区块以后的区块广播速度。由于提出但未广播的交易只有自私矿工知道,也只有自私矿工能以此做为优点。然而这个不能被用在下一个区块中,由于在咱们的协议中只能挖 n 个区块以前提案区中包含交易,中间须要有一个间隔。
矿工只可以挖 h-m 至 h-n 个区块内的提案交易,可是不能挖前一个区块的提案交易,除非这个区块也是被攻击者挖到的。
如图所示,这是咱们的共识协议和比特币 NC 的对比。在比特币 NC 中当自私的矿工找到区块 h, 它可以马上开始挖区块 h+1,此时诚实矿工只可以在收到完整的区块 h 以后才能开始挖矿,由于其余矿工须要知道区块包含的完整的交易并验证来肯定区块是合法的,而自私矿工可以经过减慢区块 h 传输的速度来让其余矿工更晚收到区块。在区块广播期间就是自私挖矿者的优点期。
然而在咱们的协议中当一个自私矿工找到一个区块 h,广播了包含区块头和交易 ID 的 Compact Block,诚实矿工可以马上开始挖 h+1。若是自私矿工想要利用这些提出但未广播的交易,它必须找到 n 个区块以后的区块(这些区块才能包含这些提出但未广播的交易),这样他们才能利用这个优点。然而这很难发生,你不能肯定在 n 个块以后的那个块是你挖出来的,这个很是难预测。
为了更好地利用带宽,咱们的协议使用了另外一种不一样的难度调整机制,设定一个固定的孤块率(根据上一个难度调节期的叔块数来计算)。
若是孤块率在上一个难度调整周期低于设定的孤块率,挖矿难度会下降,出块间隔将下降,吞吐量会提升。也就是说,更少的孤块意味着当前的网络状态实际上有能力更快地同步交易,咱们可以在提升吞吐量的同时不损害网络的去中心化。
反过来看若是难度提升,那么出块间隔会增长,吞吐量也会下降。若是孤块率很高那么意味着当前的网络在这个难度调整周期内并不能处理那么多的交易,那么协议就会下降吞吐量。
同时出块奖励会和 1/(预期出块间隔)成正比,所以在每一个难度调整周期中预期的总出块奖励是固定的。
这意味着假设咱们每十分钟出一个块,每一个块中有 12.5 个比特币,若是难度调节变成每 5 分钟出一个块的时候,每一个块会有 6.125 个比特币。所以货币的发行率也是保持恒定的。
最后,抵抗自私挖矿攻击。前面咱们提到咱们的协议和 NC 的一个区别在于,咱们的难度调整机制是根据难度调整区间中出现的全部区块来计算的,在估计总算力的时候也会包含叔块。
在 NC-Max 中,假设攻击者占总算力的 30%,诚实矿工 70%,若是没有自私挖矿攻击,在 10 个区块中攻击者可以找到 3 个区块,诚实矿工找到 7 个。若是进行自私挖矿,攻击者在 7 个区块中可以找到 3 个区块,诚实矿工找到 4 个,3 个诚实区块会成为孤块,主链会增加缓慢。
前面也提到自私挖矿在第一个难度调整周期内是没有收益的,那么在第二个难度调整周期会出现什么?
在下一个难度调整周期,难度会保持不变(由于难度会根据全部区块计算,包含孤块),攻击者并不能用一样的算力找到更多的区块,所以自私挖矿再也不有利可图。
也就是说,咱们假设币价在短期内维持稳定,因为自私挖矿攻击者是短视的,他们的奖励是根据单位时间内得到的奖励来定义,能够等价于一样的电力消耗可以得到的奖励。在比特币中,自私挖矿攻击者可以经过下降链增加速度,「迫使」协议下降出块难度,从而在难度调整以后单位时间内可以得到更多的奖励。而在 NC-Max 协议设计中,出块难度会根据全部区块来计算,包括孤块,攻击者让诚实矿工的区块成为孤块,却并不能「迫使」协议下降出块难度,以在单位时间内得到更高奖励。
最后总结一下,咱们的协议会很好地利用孤块:
咱们但愿可以经过两步交易验证来下降孤块数量,在孤块数量下降以后,咱们利用孤块率做为一个带宽利用水平的指标来动态地调节吞吐量。
而且孤块信息被写在了区块链中,咱们在挖矿难度调整算法中利用这个信息从而让自私挖矿无利可图。
NC-Max 是 Nervos CKB 的 PoW 共识协议。NC 是 Nakamoto Consensus 的简称,也就是比特币的共识协议。若是读完这篇文章,你以为这个共识协议应该有一个更好的名字,欢迎告诉咱们,或许咱们可以采纳:)欢迎讨论:https://talk.nervos.org/t/ner...。
推荐阅读:张韧博士的共识安全性分析文章《制定通用的标准:评估 PoW 共识协议的安全性》