不出块的节点在干什么?
3. 容量瓶颈: 一个不出块全节点在做什么
单链的「Chain of Blocks」的系统中,大致有三种角色的节点: 出块的全节点,不出块的全节点和轻量节点。全节点无论出块与否,都会验证并接力广播新的区块和未确认交易,这里的广播工作占据了主要的通讯量以及磁盘 I/O 的负荷,对于 TPS 只有十几的以太坊 (geth) 来说,这个通讯量约为 1.5Mbps。
为了可以实时完成对新区块和未确认交易的验证,所有用户的账簿以及所有智能合约状态都需要驻留在内存中,这个占据了主要的内存开销,当前规模的以太坊会占用将近4GB的内存。每一个全节点都会需要承担这样的一个负荷,如果要出块(PoW 的挖矿节点或者 PoS 的验证节点)还需要做额外的事情。这些负荷的代价,换来的是安全的彻底去中心化,任何一个全节点不需要预先信任任何其他节点,任何全节点也没有能力去欺骗其他全节点。
普通全节点的价值体现在两个方面:接力广播合法的数据和维护全网账簿的最新状态以供用户或者轻量节点查询。例如手机钱包这样的轻量节点不验证也不接力广播区块数据或者未确认交易,它依赖并信任预先设定好的一个或者多个全节点,通过这些全节点来获取特定用户的状态,例如账户余额,以及发起转账交易。轻量节点自身完全没有验证信息真伪的能力,更像是区块链世界里的一个终端而已。
对于单链的「Chain of Blocks」的系统,如果系统的吞吐量(TPS)提升 100 倍,需要 150Mbps 的通讯量;或者用户规模都扩大 100 倍,需要 400GB 的内存,那么基本上大部分互联网上的普通服务器都无法顺利部署一个全节点了。全节点的参与门槛,是影响区块链系统去中心化程度重要因素。如果全节点只能由专业矿场操作,普通人无法独立部署一个全节点的话,那么整个系统就会退化成一个多地部署的中心化云服务了,而变得容易被攻击,也容易被封禁。所以,这两个瓶颈不仅仅对于出块节点需要解决,对于普通全节点也需要解决。
4. 出路
前面已经说到性能瓶颈和容量瓶颈,在现在单链的「Chain of Blocks」的系统中,很难有大的提升,尤其是容量瓶颈。这就是所谓的区块链不可能三角的由来。纵观计算机技术发展史,大容量高吞吐的设计范式,屡获大规模成功的只有一个,横向扩展(Scale-Out)。
举个例子,GPU 用了几千个性能普通的 Core 一起并行工作,实现超越 CPU 计算性能几个数量级的性能提升,而 GPU 所依赖的半导体技术并没有和 CPU 芯片有什么本质的不同。再如,现今的在线云服务系统,是用几千甚至上万台性能普通的服务器一起并行工作,来支持大容量高吞吐的在线服务。
我在这里不妨大胆设想:也许一个大容量高吞吐的区块链系统会是类似的方案,即,让成千上万个同质的单链实例一起并行工作,切分全网的工作量,以实现整体上的大容量和高吞吐。
这样的一个系统,可以在大幅提高 TPS 的同时,支持 10 亿以上级别的用户量,并且保持每一个参与到这个网络的中的全节点仅有一个合理的负荷,让大部分互联网上的普通服务器都可以轻松部署一个全节点,共同参与网络的维护和治理。
不过,在这样一个彻底去中心化的设定下,如何一起并行工作,如何切分工作量,又如何保证每个单链实例的安全,都是极具挑战的问题。这样的系统似乎并不容易实现,但也绝非不可能实现。我先抛出这个想法,也欢迎所有有兴趣的同仁共同思考,或批判,或贡献聪明的设想。就这个想法,我也会继续梳理,并继续通过文字分享我的一些思考。欢迎大家通过我的公众号「王嘉平」和知乎专栏「去中心化数字世界随想」就这个话题展开更多讨论。
井通区块链底层在设计的时候也做了节点分类处理,最里面一层是共识节点。外面一层链接公开节点,最外面一层链接服务节点。每一层提供不同类型的服务。只有最里面一层是出块的,外面的节点处理查询流量等其他应用。
据统计,区块链的三分之二的流量不是交易流量也就是说用不到共识节点。对应的都是查询流量。对应的瓶颈就不是性能,而是容量。对应的底层操作就不是write而是read。
对于横向扩展采取子母链的架构设计,母链好比树干,子链好比树枝,树枝还可以有树杈,树杈还可以有小树杈。这样就构成了一个分形结构,完成了横向拓展。母链的处理能力不够,可以由各个子链来分别处理。各个子链通过母链进行互通。