区块链设计模式系列(四)状态计算

之前区块链设计模式系列(二)本地优先里提到区块链和分布式数据库在一致性方面的差异。
区块链和分布式数据库另外一个很重要的差异是:

  • 数据库通常只用于数据的存储,数据的处理都在业务系统里。虽然早期有存储过程之类功能,但是目前的实际使用中,尤其是分布式数据库中,已经不再使用。
  • 区块链则是兼顾了链上数据存储和链上数据的处理。这是因为链上数据的可信程度和本地数据不同,为了在处理过程中延续数据的可信程度,链上数据处理(合约)及其结果也必须经过共识。

这个差别导致的一个情况是,基于数据库的IT系统只有两部分:存储部分的数据库和进行数据处理的业务系统;但是基于区块链的IT系统有四部分:链上数据,链上数据处理(合约),本地数据存储(数据库),本地数据处理(业务系统)。这导致区块链系统和业务系统之间始终存在一条鸿沟,让两者无法很好的融合。
因此,区块链很适合在一个封闭的数据集上,随着时间不断叠加操作的场景,典型的场景就是帐本。
但是,CITA-Cloud的目标是让区块链能够更加贴合传统的IT系统,因此要想办法打破两者之间的鸿沟。

公链领域为了扩容,先后提出了很多的解决方案:侧链,状态通道,Plasma,还有现在大火的Rollup。
也造出了很多名词:layer2,跨链,分片等等。
但是究其本质,就是两个核心问题:

  1. 数据可用性。一条链上的数据是经过了验证节点验证的,也就是前面说的可信程度比较高的数据。但是到了另外一条链上,就没有可信度了,怎么让别人接受这些数据的可信度?
  2. 状态计算的有效性。同理,一条链上的状态也是经过验证节点验证的,怎么让别的链也接受这些状态的有效性?

根据目前公链领域的发展情况来看,数据可用性问题很难解决,但是状态的有效性是好解决的。
因为数据来源多种多样,很难去做验证。但是一旦相关数据都确定下来,单纯的计算就是一个数学上的映射函数,零知识证明等技术就可以解决其验证的问题。
目前大火的Rollup方案其实就是这样的,它不解决数据可用性问题,所有计算用到的数据都是要上链的,但是状态计算放在链外执行。
除了使用零知识证明的Zk-Rollup方案之外,还有基于投机的Optimistic-Rollup方案。后者是让一方来进行实际的计算,链直接接受其计算结果。等到有人挑战,产生争议,再在链上实际执行,进行仲裁。然后根据仲裁结果,对相关参与方实施一些经济激励,来鼓励大家参与其中。

1赞

在联盟链里,这些方案的扩容效果,包括一些压缩交易减少gas消耗的技巧就不是那么重要了。
更重要的好处是让计算放在链外,可以更好的跟传统的IT系统融合。

使用零知识证明的Rollup方案效果是最好的,但是目前还不太成熟,性能也比较差。针对联盟链可以看看有没有通过降低一点零知识性,来换取一些性能的方案。

投机方案的话,联盟链不太适合做经济激励,但是也可以通过一些链外的约定来解决。
具体方案上,因为参与方不如公链那么多,需要做些修改。比如:

  1. 可以把交易的共识和状态计算异步起来。之前通常会在交易共识之后,就串行做状态计算,然后算出state root,跟下一个块一起共识。其实可以考虑状态的共识独立出来,异步的进行。这样的话,状态怎么组织,怎么验证也可以根据具体场景灵活的设计。
  2. Rollup方案其实就是把链上计算下放到链外,链上只承担一个仲裁的职责。这样可以直接把仲裁这部分在链上原生实现,状态计算放在链外就可以灵活的替换不同的executor。而且如前所述,状态怎么组织,怎么存储,怎么验证,也变成了这个仲裁协议的一部分,链外的executor只负责计算,可以设计的更加轻量级。
  3. 验证方案可以更加的灵活。比如每个节点只验证块中的一部分交易,但是所有的诚实节点合起来,还是覆盖了所有的交易。之前大家一直在提的类似Fabric的channel功能,或者类似Quorum的隐私方案,其实就是不需要全部节点验证,只需要指定的部分节点验证。在这个架构下,就很容易实现。
1赞