假如Cell用于分片-以数据可用性为核心

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依赖,比如每条分片链在出块时,区块头内会引用某个其他分片链的区块头,为其增加算力权重等。但每条分片链依然是单链结构,有助于设计简单的轻节点协议,方便轻节点钱包以及跨链等。

以上,仅用于抛砖引玉。

6 Likes

非常好的洞察力!

我觉得最主要的原因是在Cell之前没有比较完善的Extend UTXO,因此很难想到这个方向上来。

Cell很像是对Account做了”分片“:原本一个dapp的状态是在一个account里面保存,现在分散到许多cell里面了。从这个角度说,Cells are Account shards. 如何基于这种细粒度的shard去构建更大的shard是很有意思的方向,欢迎大家一起来探索!以数据可用性为核心是一种思路,不过我觉得没有必要局限于此。

如果能整理出更具体的思路和方案,我觉得会是一个很好的 grants project.

2 Likes