区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全

阅读更多区块链论文请查看本专栏 https://zhuanlan.zhihu.com/blockchain-top-paper

阅读本文前,建议先阅读下面链接的文章:

​https://zhuanlan.zhihu.com/p/166148498

https://zhuanlan.zhihu.com/p/165991447

本文的主要内容来自顶会25th {usenix} security symposium论文Kogias, Eleftherios Kokoris, et al. "Enhancing bitcoin security and performance with strong consistency via collective signing."25th {usenix} security symposium ({usenix} security 16). 2016.

这篇文章是三个主要技术巧妙结合的结晶:cosi,bitcoin-NG,Practical Byzantine Fault Tolerance (PBFT),通过前面所给的两个链接可以了解cois和bitcoin-NG,另请读者自个补充PBFT的知识。

当前比特币存在的问题:

交易冲突,形成叉链。当两个或者多个矿工几乎在同一时间挖矿成功的时候,就会形成叉链。
区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第1张图片
区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第2张图片

而最终区块链选择最长的那个链,也就是只会在叉链中选择一个,其他的被丢弃。那些被丢弃的区块的矿工的资源就浪费了。
该问题出现的本质原因是比特币系统缺少新区块生成和发布的统一入口,任何人都可以挖矿且发布新区块。系统以最长链原则来解决叉链冲突问题,冲突的解决依赖时间的流逝,因此,客户端需要依靠概率或者等待很长的时间(1h)来确定一个交易确实被包含到区块链中。这导致叉链攻击。

解决方法1(Naive Solution)

区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第3张图片

上面图片显示一个最简单的解决方案。三角形所形成的网络是一个PBFT网络,该网络的节点是固定且不公开的,所有的交易都由这些节点认证和打包,然后追加到上面的blockchian中。这样的方案简单暴力地解决了区块链分叉的问题。
该PBFT网络充当了比特币共识组的功能。所有新挖出来的区块必须要经过这个共识组所形成的“统一的入口”。
但是,这个方案的问题是,PBFT网络不能是公开的,即不是任何人都能够称为PBFT的节点,因为如果是公开的,就会存在女巫攻击(Sybil Attacks)。
为了让PBFT网络公开,让其他任何人都可以加进来,使用下面图示的方案。

解决方法2

区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第4张图片

跟方案1相比,架构没变,但是我们设置了虚线所示的时间窗口,只有在当前这个时间窗口内成功挖到矿的矿工才能成为PBFT网络的成员,任何人都可以通过PoW方式挖矿,挖到矿之后,该矿工称为共识组成员,时间窗口往前移一个区块,意味着可能会有另一个矿工退出PBFT共识组。在一个时间窗口内,可能存在一个矿工多次成功挖矿的情况,这时候它就拿到多个share。每一次成功挖矿,所获得的奖励按照共识组内部矿工所持有的share的比例来分配。最新挖矿成功的矿工作为共识组的leader。
区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第5张图片

PBFT的通信复杂为O( n^2 ),认证的时间复杂度为O(n), 我们可以使用非对称加密算法签名的方式让通信时间复杂度由O( n^2 )下降为O(n),进一步地,我们可以使用集体签名cosi协议让通信和认证过程的复杂度下降到O(1). 具体怎么做呢?
区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第6张图片

上图表示cosi的两个来回(two round),它可以分别对应上面表格中的pre-prepare, prepare, commit 和reply. 因此,两个rounds的cois就可以实现PBFT。

为了提高系统的吞吐量,我们进一步引入bitcoin-NG协议。跟bitcoin-NG类似,区块分为两种,分别是key block和micro block。区块链的结构变成下图所示的样子。结构跟bitcoin-NG基本一致。
区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第7张图片
区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第8张图片

现在总体的系统设计便变成上图所示。
因为任何人都可以解决PoW问题来竞争进入共识组,所以就可能出现在几乎相同的时间成功挖矿的两个矿工,冲突形成,由于地理空间距离和网络延迟,一部分节点可能首先收到第一个矿工的消息,另一部分矿工可能首先收到另一个矿工的消息。怎么解决这个冲突呢?也就是这两个挖矿成功的矿工中应该决定谁进入PBFT共识组呢?
区块链论文:Byzcoin,通过集体签名让比特币具有强一致性且强化安全_第9张图片

思路是,将这两个或者几个成功挖矿的矿工的地址加入一个数组中,升序排序,对这个数组进行hash计算取模,得到一个整数i,数组中下标为i的矿工便是入选者。
另一个问题是,使用cosi的时候需要构造一个二叉树。如何构造和更新这棵树呢?了解数据结构的读者会知道,我们可以使用一个数组来表示一个完全二叉树。现在我们把那个时间窗口内的所有区块元素来表示这个数组,是不是就可以形成一个统一的完全二叉树了?因为区块链是一致的,所以所有的节点都能根据相同的区块链形成一样的完成二叉树。

reference

Kogias, Eleftherios Kokoris, et al. "Enhancing bitcoin security and performance with strong consistency via collective signing."25th {usenix} security symposium ({usenix} security 16). 2016.

https://www.youtube.com/watch?v=m1s2F_626iI&list=PLyqSpQzTE6M8wy_JBTgplS_HGuOYU1qkm&index=29

https://www.youtube.com/watch?v=OMEBdljRlK4

https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/kogias

https://www.usenix.org/system/files/conference/usenixsecurity16/sec16_paper_kokoris-kogias.pdf

你可能感兴趣的:(区块链,密码学)