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元的消息写入区块
(论文写的挺模棱两可的,感觉这里需要确认这个区块确实在分片1中,那样的话开销挺大的。。。)
(而且很明显一个问题就是A和C同时向B转账,A的钱够C的钱不够,怎么办?)
(此外,如何验证发送的这个中继消息不会丢失?)
分叉
对于单个分片内的分叉很好解决。
但如果分片的分叉影响到了其他分片怎么办?
比如上述例子,写有A-10元的区块在分片1中被分叉了,但是分片2中B已经+10元了要怎么处理?
作者采用的方法是等到分片1的A-10元的区块之后生成了x个区块(确定不会被分叉),分片2才会把b+10元写入
(ps:这里可以看出这个系统交易确认时间爆炸...)
安全
传统的POW算法需要恶意节点的数目不超过50%。
但是经过分片后,诚实矿工会趋向于往矿工数目少的分片内进行挖矿(因此诚实矿工数目一定会趋于平均)。
但是恶意节点可能集中攻击某个分片,导致不需要51%的算力就能使系统不安全。
作者采用的使连弩挖矿的思想。
即矿工可以同时挖连续K个分片的矿。
做法就是把这个k个分片的块头按续排列形成一个merkle树,只需要根据merkle树的root进行挖矿即可,证明的时候发送Merkle树有关的路径给相关的分片。