1. 分片简述
分片是一类链上扩容方案,其思路是将计算、网络、状态存储等划分到多条链上,以使得区块链整体的吞吐能力和性能超过单机性能。
在以往的分片设计中,往往采用地址来确定其所属的分片,ETH1.0的全局共享状态犹如巴别塔一般,在其之上,一切都是可组合的,他们不需要“桥”来做翻译,所有的账户都说着同一种语言,这让所有人都树立起了一个目标,即分片不仅要扩容,同时还需要拥有全局共享状态。
在全局共享状态的前提下实现可扩展,这个梦想使得跨分片的交易设计极为困难,最简单的跨分片转账涉及到一个分片的余额扣除,另一个分片的余额增加,在大多数分片设计中,这都是异步的,而更为复杂的“火车和旅馆”问题,即一个人想同时订阅火车票和订旅馆,要么都成功,要么都失败,这都是一个很难解决的问题,而目前ETH1.0上的大部分合约组合还要远比“火车和旅馆”复杂得多。
但好像大部分的分片都只考虑了账户模型,或者UTXO模型只考虑转账,而极少有考虑Extend-UTXO模型的分片,Cell模型是典型的UTXO扩展,我感觉Cell模型可能不仅是最适合Layer2扩容的编程模型,很可能它还是最适合分片的编程模型,同时Cell模型的分片将解决链上数据可用性的问题,从而使得Layer2的发展突破限制。
2. 以数据可用性为核心
但事实上,当我们明确Layer2扩容的更好的方向以后,分片设计也应该朝着如何更好的为layer2服务而设计,而其中最重要的问题不是“全局状态”,而是数据可用性。
由此可以将这个问题大大简化,即放弃全局共享状态,而转向以Data availability为核心的分片设计,目前的CKB单链,单区块大小约为512KB,同时平均每15s出一个块,即一分钟最多可以处理2M的吞吐,考虑到大部分Layer2都需要Data availability,如果可以通过分片扩展,比如1024个类似CKB单链的分片,则一分钟可以达到2GB的吞吐,这将使得Layer2扩容在短期内不会被拥挤的链上吞吐能力所限制。
3. Cell模型
与账户模型不同,Cell模型中的每一笔交易都代表着一批状态片(即Cell)的销毁,以及另一批状态片的生成,而且由于CKB组合式的编程模型,所有牵扯到的Cell都在同一笔交易中包含,通过交易中继以及预提交,可以使得所有的牵涉到此笔交易的分片都感知到这笔交易,以避免同一个Cell在不同的分片被销毁,从而失去一致性。
同时,加入现在大部分分片都具有的设计,即每个节点至少同步一个分片以及所有分片的区块头,一个交易的正确执行可以通过一个简单的Merkle包含证明就可以将交易中继到所有牵涉到的分片。
-
单分片输入交易
单分片内的输入,将使得交易不会造成任何冲突,但出于某些原因(比如如何将Cell划分到不同分片的规则),交易的输出Cell可能会归属另一个分片,所以需要将其中继到另一个分片,它的设计复杂度应该与账户模型下分片的跨分片转账类似。 -
多分片输入交易
如果一个交易涉及到多个分片,则需要通过某种预提交以避免Cell被重复销毁从而被双花,同时其输出也可能需要被中继。
除此之外,CellDeps的设计将是一个很困难的事,如果一个交易依赖的Cell在另一个分片被销毁了,怎么保证全局一致性?最简单的方案可能是,设定一条额外的合约分片链,用于部署可以被依赖的Cell,其状态定价高于其他分片链,并且所有的节点都需要同步这一条分片链,以及挖矿都需要连带连弩挖合约分片链。
在安全性上,可以借助一些想法,比如连弩挖矿,以及DAG依赖,比如每条分片链在出块时,区块头内会引用某个其他分片链的区块头,为其增加算力权重等。但每条分片链依然是单链结构,有助于设计简单的轻节点协议,方便轻节点钱包以及跨链等。
以上,仅用于抛砖引玉。