一树一乾坤

佛曰:一花一世界,一树一菩提。

这个故事是这样讲的:佛在灵山,众人问法。佛不说话,只随手拿起一朵金婆罗花,示之。众弟子不解,唯迦叶尊者破颜微笑。只有他悟出道来了。宇宙间的奥秘,不过在那寻常的一花一叶之中。

屈原在《离骚》中曾感叹:路漫漫其修远兮,吾将上下而求索。他不知道的,是上可至何方,下可到何处。通过天文望远镜仰望星空,人们发现地球不过是浩瀚星海中的沧海一粟,通过电子显微镜观察切片,人们发现接近原子尺寸的小小病毒居然也能在人间掀起轩然大波。

至大无大,极小不小。两个截然相反的极端,却能自然地衔接在一起。正所谓万物有道,大道至简矣。

中本聪在比特币中使用的 Merkle 树 (也有中文翻译为默克尔树,本文为了诗意直接用英文,下同),便是这至简之极却又可包罗万象的神来之笔。

二叉 Merkle 树

比特币使用的 Merkle 树是一种特殊二叉树,由一个根节点(root)、一组中间节点和一组叶子节点(leaf)组成。叶子节点(leaf)包含着具体的交易信息,中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成,所以 Merkle 树也称哈希树。

merkle-tree

与普通的二叉树相比,Merkle 树有着以下的特点:

  • 完全二叉树。即深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。
  • 快速比较性。当两个 Merkle 树根相同时,则意味着所代表的数据必然相同,因为中间节点都是由叶子结点通过哈希算法计算出来的。
  • 变化传递性。如果叶子节点发生了任何变动,其哈希值也会随之变化,这也会造成其上一层节点的数值也随之改变,并一直传递到树根。

通过使用 Merkle 树,可以大幅度提高区块验证的运行效率和可扩展性,使得区块头只需包含根哈希值而不必封装所有的交易数据,这使得哈希运算可以高效地运行在智能手机甚至物联网设备上;其次是 Merkle 树可支持 “简化支付验证协议”(SPV),即在不运行完整区块链网络节点的情况下,也能够对交易数据进行检验。

一笔糊涂账

作为一个合格的 BSV 支持者,上面的内容其实应该早已了如指掌。不过如果你有看过 CSW 博士在清华的视频 温故知新一下的话,还是可以获得不少新启发:如果比特币不是一开始就设计为可以处理大规模的交易的话,使用 Merkle 树这种数据结构是一个非常糟糕的决定。

哈希算法的本质是生成一个信息摘要,它将一个文件转换成一个固定长度的摘要索引,通过比较这个索引是否一致即可确定源文件并没有被篡改。对于现在每个区块小于 2M 的 BTC 来说,如果只是为了确保打包的交易不被篡改,对每一笔交易都进行哈希构建一个 Merkle Root 是非常浪费资源的事情,因为每个区块仅包含不到 3000 (小于 2^12=4096) 笔交易而已。因此,矿工直接将一个区块可容纳的所有交易线性排列后视为一个整体,直接对其进行哈希计算生成摘要的做法会更加高效。

只有在区块中交易数量足够大的时候,使用 Merkle 树的优势才能慢慢显现,因为 Merkle 树的拓展性是这样的:当增加 Merkle 树深度多增加一层的时候,它便可归纳比之前多一倍的交易。在一个 BTC 的区块中,其计算出来的 Merkle 树通常不过十多层。在深度 32(两个 1MB 的区块深度之和)就可以承载 40 亿笔交易。不是几万笔,而是几十亿笔!当深度是 48 时,这个数字可高达几百万亿(一百万亿 = 10^14)笔交易。

还记得国际象棋的发明者吗?他让国王在棋盘的第一格放一粒米,随后的每一格上放的数量是前一格的两倍。但最后国王把他杀死了,因为到了第 64 个方块的时候,连整个太阳系中都没有那么多的原子可以数得过来。

比特币一开始就是为大规模交易所设计的,只可惜这笔糊涂账当年没人理清,比特币还在襁褓之中便被加上 1M 的枷锁,直到最近的创世纪升级后才得以解脱。

“现有的 Visa 信用卡网络每天在全球范围内处理约 1500 万笔互联网交易。比特币仅用现有的硬件就已经可以达到更大规模,而且成本只是信用卡交易的一小部分。比特币从未真正达到规模上限。” - 中本聪

再回首看中本聪这句话时,不禁感叹比特币曾出师未捷身先死,长使英雄泪满襟。

喜欢本文的话,欢迎关注本公众号,或者打赏比特币至 [email protected] 或者 1GT6fnb7zbtzjy9pC3iyEwdpg11ax9nRst 请我喝杯咖啡:)

评论