>

复杂度 Complexity

Untested Code & Untestable Code

网络规模 Network size

交易成本,网络速度

网络拥堵:大量交易的确认延迟

容量贪吃蛇:不断增长的区块数据

目前区块链存在的问题:

扩容困难(看比特币扩容战争就知道了)
交易很贵 (曾经参投ico,10个ETH转账费用用掉了0.1个ETH)
链与链之间缺乏连接
区块链近乎重新定义了整个网络架构 ,现有企业应用起来非常困难

分级设计

分层设计

分片设计

1、分级设计

  在比特币扩容争议中,小区块的支持者最常使用的一个支持小区块的逻辑就是应该采用分层设计——主链承当结算层,闪电网络充当支付层,或者称为大额交易走结算层,小额支付走闪电网络。但我觉得主链和闪电网络将这种行驶相同功能,按功能的规模设计分成“分层”,并不能真正称为分层设计,这个应该称为分级设计。

  我以前做机械设计的,设计过过滤粉尘的机器,就经常会用到分级设计。使用一个粗孔滤芯,先过滤掉一些大颗粒粉尘,然后再用细孔滤芯,过滤小颗粒粉尘。处理同一类对象但“物理大小”不一样,设计成多级。这样设计的好处在于节省运营成本。如果过滤器不分级,直接按最小颗粒来设计滤芯,那很快就要换滤芯,越细孔的滤芯成本越高。但分级成,使用两级来分担过滤任务,粗孔滤芯更便宜,让粗孔滤芯先过滤掉大粉尘,细孔滤芯压力就小,这样可以节省成本。

  分级设计在我们生活中是非常常见的,我们家庭常用的饮用水过滤器就是分级的。比特币扩容方案选择的时候,有人提出使用闪电网络来分流主链的压力,这属于分级设计。因为这种提议,主链和闪电网络行驶的功能是完全一样的,都是发交易的支付行为。虽然有人将主链的交易行为称为“结算”,但这个叫法无法改变行为的功能。

  因为比特币主链上发交易的成本是最高的,对个人来说,需要支付矿工费,对比特币系统来说需要所有节点来完整验证交易,需要系统的CPU、带宽、硬盘。而在闪电网络上发交易的成本是较低的,对个人来说,闪电网络里的手续费更低,速度更快,对比特币系统来说,并不需要所有节点去验证闪电网络内的交易,只需要验证进出闪电网络的交易。

  同样的,使用offchain钱包来完整同钱包内的转账,也属于分级设计。因为offchain钱包,只是钱包公司自己完整数据的调整就可以了,这和在比特币网络上发交易是完全不一样的成本。

  分级设计中,第一级(主链)是根本就不需要关心第二级是什么样子的,但第二级(闪电网络和offchain等)是需要关心主链的。比如闪电网络就需要监视主链,以保证不会出现支付通道的人做广播欺诈。

  分级设计中,第二级出了问题,并不会伤害第一级主链。比如offchain钱包被盗了,跟主链毛关系都没有。但反过来则不一样。

  分级设计其实是人对成本的考量而催生出来的,并不需要顶层设计,让市场自由博弈就能涌现出来分级解决方案。

2、分层设计

  互联网最成功的分层设计应该是网络协议分层,就是我们熟知的七层网络结构,什么物理层、链路层、网络层……

  分层的基本设计原则是:

  各层是独立的,各自层做好自己的事即可。

  层和层之间的功能是不一样的。

  层和层之间的交流都是通过接口通信,只要接口保持不变,层内部的设计可以改变,且不会影响别的层。

  目前各种区块链的设计,各种宣称说自己是分层设计的,往往都是不符合上述原理。

  比特币比较接近分层设计的思想是侧链的设计原理。侧链可以完整独立设计成和主链完全不一样的功能,比如RSK目标是实现智能合约。而比特币主链实现的核心功能就是UTXO的转账和账本的更新维护。侧链和主链只是通过特定的交易来充当接口。但侧链往往需要关心主链在干吗,主链是不需要关心侧链的。这就是侧链和主链并不是相互独立的。

  比特币(包括BTC和BCH),尤其是BCH的OP_Return就是一个将来非常好的扩展为分层的设计。比特币主链对OP_Return里的数据只关心是否为真,并不关心具体的数据。那OP_Return就可以在里面设计出一整套新的功能,只要这里面的代码最后在BCH主链的交易里为真。而主链和OP_Return设计出来的新层是不需要相互关心的。

  很早之前,以太坊的V神就想在OP_Return上实现他的以太坊的智能合约设想,可惜当时被Core开发组限制了。比特现金BCH的开发正在拿OP_Return大做文章。其实比特币的元币协议,就是一个很好的分层设计,只是一直没有被广泛使用起来。但现在我还没有充值理解元币协议,以后搞懂了再来讲。以太坊并不是分层设计,所有的功能都是在同一层上。以太坊所有的Dapp都是在同一套账本层里做事,并没有分层处理。

  3、分片设计

  分片设计目前还没有做完,无论是在比特币还是在以太坊上,都没有实现。但我可以简单讲下原理。现在比特币网络处理交易是这样的,一个节点收到一波交易,比如1万笔,节点会先将这些交易序列化,即给这些交易编个号排队,然后一笔一笔去验证。如果碰到某一笔验证无法通过,比如需要前置零确认的交易,那就先缓存起来。如果碰到有非法的交易,则直接丢弃。

  比特币现在的这种处理交易方式就是串行的,即一个时间点,只能处理一笔交易。这样做就会有很大的瓶颈,单一电脑再牛逼,处理能力也会有上限。那能不能分成两台电脑,比如将1万笔交易,分成两波,5000笔一波,分别发给一台服务器去验证呢?不能!目前比特币还不支持这种并行验证。如何要做到并行验证呢?那就是要讲到分片设计了。比特币的UTXO的“物理实体”是这样的,一笔UTXO在电脑里存的主要数据是以下四个部分:

  生成这笔UTXO的交易的txid;

  生成这笔UTXO的交易的输出序列号index。因为大部分交易是一个或多个输入,多个输出,第一个输入序列号是0,第二个是1。

  锁定脚本lockscript。

  是金额value

  其中txid是16进制表达,即使用0到F来表达,如果将首字符来分类,0归一类,1归一类……F归一类,就可以分为16类。如果使用首两个字符来分类,00一类,01一类……FF一类,那就可以分为256类……如果使用4个字符呢?16^4类。我们将上述的一类称为一个片,这就是分片。分片后,将一类分给一台电脑去处理,另一类分给另一台去处理……,256片就可以分成256台电脑来处理。而UTXO的txid就是交易的txid,则打包交易的区块,也可以按这种分类来打包,比如分成256片,则同一区块里,可以设成256个分区,一个分区打包一个片。也就是说,UTXO、交易、和区块都可以按同样的规则分片。

  这样比特币全网就可以实现节点可选择处理哪一个分片,比如我运行一个节点,我只收、验证和广播特定分片的UTXO、交易和区块。这样就实现了比特币网络的并行扩展。但这种分片还是很复杂的,我上面讲的只是基本的原理,要完成设计是非常复杂的。比如一个UTXO去花费两次,是可以实现不同的txid,然后发到不同的分片,如果分片之间没有机制来通信,则可能会双花成功,但如果分片之间还要为这种攻击大量通信,则还不如不分片呢。

  但如果实现了分片,那比特币网络则是可以实现无限扩展,什么百万TPS,都不在话下,什么1M、8M、32M根本就不是事,至少1G区块。因为一台电脑处理不了,可以搞16^n台来处理好了,一个人买不起16^n台电脑(中心化)的话,那就找16^n个人每人买一台好了。

  以太坊的分片更复杂,我暂时讲不明白。BCH的开发正在全力开发UTXO分片,我也在努力学习这些知识,以求能贡献一点知识。