万法归一,一归何处? --《禅师语录》

区块链总体来说是在一个不可信的环境下完成指定的计算。

专门研究解决这种问题的技术叫可验证计算/Verifiable computing

有两类方案:

  1. 多个副本独立计算,然后相互对比计算结果。
  2. 密码学方案,比如零知识证明。

Account Model采用的链上计算的方式,可以归为第一类方案。每个验证节点都是不可信的,但是多个验证节点执行同样的交易,然后通过共识算法选择多数节点一致的结果。从Prover和Verifier角色的划分来看,区块链同时担当了这两个角色。从整个系统的角度看,对于用户来说就像一个可信计算环境了。

只要严格控制好输入,那么整个系统的问题就不大。当然对于支持合约的系统来说,输入不仅仅是交易中的参数,还有用户部署的合约代码。参数比较好处理,只要做好合法性检查即可。合约代码问题很难完全防范,进行形式化验证难度也比较大。Libra从模块化,以及模块的用户界面方面做限制,我觉得是很好的思路。

Cell Model采用链下计算,链上验证的方式,在安全性方面的问题要严峻的多。用户在链下的计算是不可信且完全不可控的,常规的形式化验证,或者限制合约能力都无法实施。因此更倾向第二种方案,通过密码学技术来强行对计算进行限制。

当然事情并不是那么的绝对。Bitcoin一个交易执行过程中余额守恒还是每个节点都去进行校验的,可以认为是第一类方案。其实这个校验也是可以做成密码学方案的。比如Zcash,这块就是通过零知识证明来实现的。反过来,Ethereum上现在也集成了零知识证明的指令,可以实现链下计算,链上验证。当然密码学方案的成本一般都比较高,所以还是要各种因素综合考虑如何选择。

所以两种模式可以统一到可验证计算的框架下。区别只是Account Model倾向于将更多的状态和计算放在链上;而UTXO/Cell Model倾向于将更多的计算和状态放在链下。

在跨链技术中,UTXO/Cell Model更有优势。首先跨链交易本身就是系统外的一个计算结果拿过来进行验证,这个更符合UTXO/Cell Model。其次UTXO/Cell Model链上的状态和计算相对比较少,在跨链的时候需要传递的信息和要验证的计算也就比较少。因此跨链协议会更简洁,效率更高。