导航
导航

让我们构建一个最小化的区块链[1]: 黎明

让我们构建一个最小化的区块链 1:黎明

这将是一个与 CKB 脚本编程简介 不同的系列,所以如果你更喜欢在 CKB 上进行脚本编程,你可以跳过这个系列。但如果你对区块链很感兴趣,这可能是一个非常有趣的系列 :)。

所以,让我们一切从头开始:让我们来看看当前的区块链,它们都相当复杂。比特币相当复杂,以太坊更是如此。虽然 CKB 要比以太坊简单(可论证的),但是它仍比比特币复杂的多(但至少在一个好的方向上)。从一个不同的背景来看,我不禁要问:这种程度的复杂性是必要的么?区块链就这么与众不同吗,还是我们陷入了偶发复杂性的泥潭?无论如何,我想要找到答案。

虽然简单性是一个相当有争议的问题,但现在区块链空间的很多部分都很可能需要改进。一个典型的问题,单层。现在的区块链很少可以允许你更换其中一个部分来实现一个新的功能。比如,虽然替代网络可能是可行的,但它们仍然只是少数,有些也已经被放弃。其他大部分区块链甚至都没有第二种同步协议。虽然有人可能会说,同步协议或多或少与一个区块链的安全性有关(我对此保持怀疑),让我们来看看另一个部分:为什么我需要在我的节点上运行一个完整的交易数据池?就我个人而言既不是交易所也不是挖矿节点,难道我不能在我的节点上只运行一些必要的组件?当我真的需要发送交易的时候,再连接到外部的服务。即使我拥有了一个完整的交易数据池,它也只是将交易传播到别的节点,在交易被打包前,需要先将其传到一个挖矿池,所以为什么还要在我们自己的机器上浪费资源呢?

进一步看,还有一些其他问题没有得到很好的解决:区块链会被更新,无论你称其为软分叉还是硬分叉。不可避免的是,你的软件会根据你正在处理的不同(高度的)区块而呈现出不同的执行结果。慢慢的,相同的代码库会随着时间的推移而分散,其中的逻辑也会有所不同。维护这样一个代码库以及你脑子里所有的知识,将是一件痛苦的事情。现代软件工程能帮忙解决这个问题么?

这就引出了这个系列:如果我们从一个不同的角度重新开始,不断细化我们的范围,一个最小可行的区块链将会是什么样子呢?

我对这个问题做了一些思考,为了回答上面的问题,让我们退后一步,想想这个更简单的问题:区块链的关键部分是什么?

我个人认为,答案只是区块验证逻辑。从字面上看,其他一切都是可选的,你绝对不需要一个交易数据池;如果有一种方式可以获取区块,那么同步协议也可以省略。Miner、RPC 等等也都是别人的问题。实际上,从根本上来说,区块链只需要区块验证逻辑就可以运行了。

从这里开始,我们可以创建一个区块链的核心,就是验证区块。它所要做的就是接受区块,然后通知新区块更新或者分叉转换。现在,我们创建的其他周边的工具都将作为插件,比如同步客户端,交易数据池,挖矿等等。没有必要为每个工具都制定一个单一的解决方案,只要有合适其设计可以用的东西就好了,这一点可能在这个丰富的生态系统中非常有用。比如,矿池可能希望优先同步区块,而交易所可能希望优化交易带宽。

但这只解决了其中一部分问题,如何构建可维护的区块链呢?根本的冲突在于,我们希望我们的软件如何进化,不同的逻辑用于处理不同时间的区块。如果我们仔细观察,在现在的区块链中,有一种结构被设计用来应对时间的演变:虚拟机需要满足未来的应用程序所需的新的行为,但是现在,虚拟机大部分都被局限在处理交易上。如果我们扩展虚拟机让它来处理整个区块呢?这会带来什么新的变化么?

在你提问之前,是的,我的部分灵感来源于 substratesolri,但是作为 CKB-VM 的缔造者。我觉得 substrate 和它选择的 WASM 都让人觉得没有必要那么复杂。尽管 solri 相比于 substrate 有了长足的进步,但它仍然是一项正在进行中的实验,我觉得我们可以专注在一个相比于 solri 运行地更灵活的角度上。因此,我提出了关于这个尚未命名的最小化的区块链的初始范围:

  • 区块本身只是一系列的字节,区块链本身对区块一无所知,甚至不需要知道区块哈希。
  • 在 CKB-VM 中运行的程序需要负责验证和接受新的区块。
  • 需要为 CKB-VM 中运行的程序提供 key-value 接口,用于提供数据。
  • 核心只需要为新的区块更新或者分叉切换提供一个 pub/sub 接口。

这个方案的美妙之处在于,对于任何软/硬分叉,只需要简单地切换用于验证区块链的程序。你的新程序可能只需要包含处理新代码的逻辑。这样就没有必要在代码库中永久地保留旧代码。就像你第一次读 SICP 一样:金字塔雄伟壮观,但几千年来都是静止的,而你想要的是有机体,它在某种程度上是混乱的,而且在未来数十亿年里是可以进化的。

我想要实现的扩展目标,是像 Arrow 一样的接口,在这个上面鼓励使用零拷贝流协议。向其他客户端提供区块数据时,不会再对发送端造成大量的资源消耗。希望这样可以有助于提升网络性能,毕竟在现在的区块链中,区块同步通常是比较慢的部分。

需要注意的是,我从来没有提过这是一个 PoW 还是 PoS 的区块链,因为这个问题真的没有意义:首先,虽然标题中写的是构建一个最小化的区块链,但这显然不是关于创建一条区块链,而是关于创建一系列的工具,使用这套工具,可以更简单、更灵活、更易维护地构建区块链。其次,由于在虚拟机中运行的程序能够处理区块链验证,因此你不需要局限在这一点上。它可以很容易地支持无需许可的 PoW 区块链的替代实现,比如比特币、以太坊或者 CKB;它也可以适用于与 Nervos CKB 一起运行的基于 PoS 的 Layer2 区块链。实际上需要靠程序来说明当前的区块链究竟是什么。

这篇介绍性的文章到此为止,我真的不知道这个想法会何去何从,我可能是错的,这也可能会完全失败,但是有一件事情我可以肯定,这肯定会是一次有趣的旅程,我只希望不需要像旅行者号那么久。