此前PANews在文章《Layer2之后该怎么扩容,深度解读Celestia的数据可用性模块》中简单介绍过什么是模块化,但这次希望在此基础上,谈谈为什么区块链需要被模块化。
首先来复习一下模块化是什么。在这个概念中,一条公链可以被分解成安全层,数据可用层和执行层。安全层通常是承载共识的,也就是负责让最终交易结果上链。数据可用层则可以被简单理解成帮助执行层“自证清白”,防止执行层作恶的。我们常挂在嘴边的Rollup,或者Layer2就是执行层,它是一个模块,同时也是区块链模块化的产物,负责执行交易。
这三项功能原本被放到一整条公链中,直到链上的节点越来越多,区块越来越大,交易越来越忙不过来,最后的结果就是,不但Gas费爆炸了,出块速度还很慢。于是就有我们常说的区块链“不可能三角”理论,即如果用加大区块大小来提高数据流通量,就得拉高节点的门槛,淘汰掉算力不达标的节点同时,也降低公链的去中心化程度。如果想要保住去中心化,只有增加更多更强大的节点,可节点一多,交易速度又慢了,只得继续增加区块大小,就又回到了最开始的问题。这个故事有很多种讲法,核心是只能靠牺牲一部分来成全另一部分,就像Solana,价格低,速度快,但是中心化程度高,它赌的是摩尔定律,赌算力和带宽的成本增长追不上链上交易给它带来的收入增长。
到这里,模块化的必然性就已经出现了,现在我们甚至不必再讨论扩容的方法将会有哪些,Layer2已经从一种可能性坍缩成了现实,将公链解耦的模块化就是答案。我们可以把上述三项功能中,其中至少一项单独外包出去的公链称为模块化公链,比如以太坊,它把执行层外包给了Layer2。也比如Polkadot和Near,它们有分片验证的外包设计。而Avalanche则像一个伪模块化公链,它看到了模块化的好处,于是做了一个单片链的组合,也让公链的基本功能在自家门内做了解耦,缺憾是目前还没有做好共享安全性。Cardano则处在一个临时状态,尽管没把已经解耦的功能外包出来,但从路径图上看也只是时间问题了。这些都是公链在模块化上所做的尝试,而模块化的最终愿景可能是Celestia与Evmos合作的那样——一个Rollup套娃,具体在开头所提文章中有展开阐述。所以,长远来看,模块化是公链扩容的必经之路,即便是“反对模块化”的Near其实反对的也只是“别人来做我的模块”,因为它要“我自己做我的模块”。
目前不仅执行层在模块化之后的成就有目共睹(Arbitrum和Optimism的体验明显好过Solana或是Fantom这类的Layer1公链,因为前者只需要一个算力足够强的节点来做Sequencer就够了,而后者哪怕是牺牲了去中心化来提升节点性能,也需要至少21个节点来做Sequencer),数据可用性也因此需要和执行层解耦。只有这样,当Layer2出问题时,用户才能借助数据可用性来提出“挑战”(针对OP)或是强行把自己的资产从Layer2上拉回Layer1(针对ZK)。这样的一个数据可用层,放在Layer2上(或是Layer2提供的链下第三方验证机构),你会不放心。放在Layer1上,你会心疼钱。分片并且放在一个单独的链上,随用随取,可能是目前最好的答案。这就是模块化开始快速发展的背景,长期趋势仍在酝酿,短期痛点已然出现。
模块化背后的——递归思维
考虑到这个话题对大多数人是无意义的,就像我们吃鸡蛋,却不必知道没心情下蛋的母鸡该怎么哄。所以我希望能和大家讲讲模块化背后的抽象思维,也许再听完后,你会发现这种思维其实无处不在,并且在理解后,能帮我们解决不那么抽象的问题,就像乐事薯片的“双曲抛物面”如此坚固,背后的道理却和蛋壳结构相同。
“模块化”的概念在web2.0已经被实践了很多年了,甚至可以说,从打有计算机开始,我们就在想办法把一类问题,做成一个模块。坦白讲计算机的本质是机械运动,就像算盘,我要去拨动算珠,算盘才能执行运算,我每拨动一下,算盘运算一次,所以这个时候真正在执行计算的是我,不是算盘。我今天遇到了一个算数问题,我拨了100次才把这个问题解决,但我没有把这个问题的答案记下来。如果第二天,我遇到了同样问题,我还是需要拨100下算盘。相信各位读者都有投资的经验,不难看出,我这两天一共拨了200次算盘,解决了两次问题,这是我用时间换来的基础收益。可如果我在第一次计算这个问题的时候把答案记下来了,那无论我遇到这个问题几次,我都只需要拨最开始那100次算珠。资源的复用,才能带来超额收益。在这个例子里,被复用的是“时间”。“把答案记下来”就是我得到的最基础的模块。在此之后,我还可以把更多计算公式也做成一个个模块,这样当计算机收到我的提问后,会找到对应的模块执行,最终把执行的结果反馈给我。此时在执行计算的是计算机,不是我。这个过程,就叫递归,所有的Rollup本质也是一种递归,它们通过不断的调用自身,来满足数据可用层的验证要求,这种资源的复用,是我们在大多数时候觉得计算机比人类效率更高的主要原因。
人类对这个世界的认识是由近及远、从少到多,一点点扩展来的,这就是人类固有的认识和思维方式,根植于我们的基因中。这样的认识和思维方式让我们很容易理解具体的事务,但是限制了我们的想象力和大局观。当需要思维触达那些远离我们生活经验的地方时,我们就会出现理解障碍。
和人不同,计算机在一开始就被设计用来处理规模大得多的问题,因此计算机有条件采用与常人完全不同的方式来解决问题。如果一个人能够站在计算机的角度想问题,就可以被算作拥有“计算思维”,这就如同我们说某个人具有科学思维或者工程思维一样。如果一个人在做事情的时候,采用的是计算机解决问题的方法,这个人就具有计算机的方法论。在计算机的思维中,最重要的是一种自顶向下,先全局后局部的逆向思维,它被称为递归(Recursive)。与之相对的,是人类采用的自底向上,从小到大的正向思维,它被称为递推(Iterative)。
在扩容的问题上,假如我们用现在的常规思维去想,交易变多了,那我需要给矿工更多的费用,而且我收到的交易费一定要高于我给矿工的费用,否则就会亏损,但我现在没这么多钱,所以我只能提高交易费,可这样一来交易量会缩小,于是我只好增加吞吐量,同时让节点数量减少,在安全性上做妥协。这种情况下,如果不减少节点数量,又不提高交易费,就只好发行更多的代币,用来支付矿工,这样做的结果就是这条公链的通胀越来越严重。比如Solana,至今为止,它一共执行了562亿次交易,按照其官网公布的,每笔交易手续费为0.00025美金,其收取的手续费总额为1400万美金左右。如果我们去Stakingrewards上看一下,可以查到它目前的Staked Value在455亿美金左右,按照较低一档的APY 5.88%计算,Solana最近三十天内要分给质押者约2.2亿美金。也就是说自其主网上线至今收到的所有交易费,仅相当于最近一个月支出的6.2%。以至于Solana需要15.4万TPS的吞吐量才有可能做到收支平衡,尽管我们知道它赌的就是摩尔定律能把带宽和算力成本拉下来,但这种规模的亏损,怕是禁不起一场熊市。这就是递推的思维,我遇山开山,遇水架桥,直到走进一个“死胡同”里。
以太坊没有采用这种通胀模型,其结果就是交易费用爆炸,但它在一天里收取的交易费用,甚至比Solana和Polygon一年的交易收入加起来都多。如果我们逆向去想这件事,矿工收取用户手续费,仅仅是因为矿工执行了交易么?交易人人都能执行,之所让矿工帮忙上链,无非是因为用户希望自己的交易能得到去中心化的安全保障。那让一条链把安全和交易全做了,岂不是自找不痛快?Solana收取交易的费用,付给矿工的是安全的钱,那它肯定亏本啊;用户交给Eth交易的任务,Eth收的却是安全的钱,那用户显然也不痛快。所以为什么要把安全和交易混为一谈呢?假如把数据可用性和分片从公链上分担出来,那节点越多,数据吞吐量就越大,而且节点门槛可以做到和手机一样,凭着这种可以无限增大的性能和与Layer1上矿工收入完全无关成本,我可以让这条链上的Rollup少说增加一个数量级。众多的Rollup,收取的也仅仅是交易的费用,提供的也是交易的服务。Rollup的数量上来了,能交给Layer1和数据可用层的费用就也增加了,前者的矿工这下任务轻了,把数据压缩上链就行了,后者也有钱买更多节点了,于是这下又增加了Rollup的空间。重复执行这项“递归”,公链将得益于全局思考的模块设计,走上一个正循环。
模块化的深化,Web3加强组合性
我甚至认为模块化在占领区块链底层后依然不会停下脚步。Web3.0才刚刚开始形成概念,我们就已经看到有个GameFi项目Metasport,用ETH做资产层,Starkware做P2E激励层,用Internet Computer做游戏玩法和逻辑层,IPFS做存储冗余层。模块化不应该被如此简单地定义在底层技术上。虚拟世界与现实之间的主要不同,在于虚拟世界更加稳定,不会因为一场突如其来的疫情,就让各国之间的供应链断裂,生产者被迫囤积大量库存,或干脆自己做自己的供应商。虚拟世界最大的风险不过是熊牛转换,在现实世界面前不值一提,所以我们也希望看到越来越多的应用开发者,在自己保留部分基础能力的同时,将实际任务外包给其它生态成员。毕竟虚拟世界的干扰因素少,所以我们有能力实现理论上的效率最大化。唯一需要考虑的就是安全问题,这个问题的难度等价于现在的跨链问题,但说到底也没什么大不了的,既然是技术问题,就总有解决的时候。
我想说的效率,其实还有另外一层。就是在区块链世界逐渐被大众所熟悉的今天,会有更多的优秀人才和资本被吸引进来。在web3.0概念中,供应商们很难像web2.0那样把用户留存在自己的生态里。如果是这样,这些“增量”会选择以一种什么样的方式进入到区块链世界中?我能想到的方式有两种,一是做卖铲子的人,他们将是模块的供应方,在现有的基础设施中找到可以被改进的点,唯有这样才能不依赖“流量”,同时利用模块化打造出自己的长板,与所在生态拼接成一个“木桶”。还有一种方式是将自己在链下的流量导流到链上,流量的入口仍然在链下,他们将作为模块化的需求方,需要的是开箱即用的体验,以及快速的应用搭建速度。
而模块化的区块链世界无疑能进一步拉低创新的门槛,我们甚至可以期待一个效率远超web2.0的区块链世界。只有当低水平的重复工作被模块化工具所终结,真正的创新才能开始,对区块链来说是这样,对我们每个人来说也一样。远的不提,大家有没有发现几乎所有DEX的前端页面全都长得像一个样子,几乎每个Solidity初学者做的第一个完整项目都是把Uniswap的代码复制一遍。对于开发者而言,这些常被拿来“学习”的内容,本身就是一个个封装好的“模块”,很多人就是在“学习”的过程中,站在前人的肩膀上,发现他们之前没有解决好的漏洞,做出一点点改进,然后成为其他人可以站上的肩膀。
现在开始,世界各地,从瑞士到马耳他到塞舌尔到新加坡到旧金山,会有更多一无所有的年轻开发者每天晚上扪心自问:
和尚摸得,为什么我摸不得?别人可以简简单单的在前人的代码上改进出新的项目,为什么我不可以?既然模块化已经提供了足够的基础组件,我为什么要花时间自己再重新写一遍?当更多开发者发出这样的问题后,区块链上的创新将会指数增长。
总结
模块化是扩容的答案:现有的公链要么已经开始模块化的尝试,要么仍处在币价涨幅难以支付矿工费用的亏损中。安全保护和计算执行是两种服务,理应分开收费。而这些仍在挣扎的公链,越早一天接入Layer2,其原始价值能被保留的越多,否则只能在无尽的通胀中被稀释殆尽。当然,将自己直接转化为某条公链的Layer2也是个可取的思路,我们不需要太多的公链用独立的安全层承载属于自己的共识,过度分散的共识对效率没有帮助,而自由的市场,终究会毁灭“更高效率”面前的所有阻碍。
商业竞争促成模块化:只有资源的复用能带来超额收益,诚然公链可以开发自己的模块化来解决自己的扩容问题,但在同等劳动付出下,完全独立的模块化项目会服务更多的用户,商业法则会淘汰那些得不到超额收益的竞争者。而模块化无论对需求方还是供给方而言,都是效率最高的方式。
安全问题很严峻,但不要被吓倒:web2.0解决安全性的方式能给我们带来一定启示,组件化在一开始带来的问题,比它解决的问题还要多。很多人一看到某些项目因为采用了多个供应商提供的模块\组件,结果被黑客找到机会,给用户带来了损失,就认为这个方向本身不对。实际上这可能仅仅是因为时间太短,我们还看不出效果。在区块链世界中,模块化的概念仍在早期,实践的步伐要慢,但既然已经迈出了第一步,在想要改变这个方向之前,要更慢。同理对于那些坚持单片设计的公链,大家也要多一些耐心。
任何方向的改变在一开始都会有很大的下行的不确定性。比如我们常常讲免税可以刺激经济发展,从长远来讲能够获得更高的税收,但是幅度太大的免税会使得政府一下子入不敷出,然后不得不推高债务,成为经济发展的负担。牢记万事皆有滞后性,夏至来临的时候,往往还不到一年中最热的时候,把一克冰融化成水的能量,却能把这一克水从1度加热到80度。Web2.0的组件化花了很多年才初见成效。安全问题虽然是web3.0模块化的桎梏,但我相信它终有一天会被打破。