Monoxide: Scale out Blockchains with Asynchronous Consensus Zones

这是2019年NSDI上一篇关于区块链分片的论文

作者是针对公链(比特币)做出的改进

如何确定哪个账户在哪个分片

每个账户都有一个地址,地址是公钥的哈希,Monoxide中分片的数量是2^k,因此我们只需要看账户地址的前k位即可确认该账户在哪个分片中。

跨片共识

片内共识作者采用的是POW,这里就不在叙述。

如何解决跨片交易问题?

A在片1中,B在片2中,从A->B 10元, A很容易扣除10元,如何保证B加10元和A扣10元的原子性? (要么都成功,要么都失败)

作者采用的是最终原子性。

分片1的A扣除10元后,将交易写入区块,会发送一个消息给分片2,消息包含这个交易的Merkle树路径,分片2收到消息后就知道A已经扣除10元了,就把B+10元的消息写入区块

分叉

对于单个分片内的分叉很好解决。

但如果分片的分叉影响到了其他分片怎么办?

比如上述例子,写有A-10元的区块在分片1中被分叉了,但是分片2中B已经+10元了要怎么处理?

作者采用的方法是等到分片1的A-10元的区块之后生成了x个区块(确定不会被分叉),分片2才会把b+10元写入

(ps:这里可以看出这个系统交易确认时间爆炸...)

安全

传统的POW算法需要恶意节点的数目不超过50%。

但是经过分片后,诚实矿工会趋向于往矿工数目少的分片内进行挖矿(因此诚实矿工数目一定会趋于平均)。

但是恶意节点可能集中攻击某个分片,导致不需要51%的算力就能使系统不安全。

作者采用的使连弩挖矿的思想。

即矿工可以同时挖连续K个分片的矿。

做法就是把这个k个分片的块头按续排列形成一个merkle树,只需要根据merkle树的root进行挖矿即可,证明的时候发送Merkle树有关的路径给相关的分片。

上一篇:“WPF老矣,尚能饭否”—且说说WPF今生未来(上):担心


下一篇:C#使用OpenCV剪切图像中的圆形和矩形