进入账本之前的候车室
想象一间忙碌的邮局。你把信投进投递口,它并不会一离手就飞向目的地,而是先汇入一摞等着被分拣、盖戳、装上下一班货车的信件里。一笔区块链交易也是这样。在你签名并广播的那一刻,这笔付款就已经货真价实、随时可走——但它还没有真正进入账本。
这摞等待中的信件,就是内存池——英文 mempool 即 memory pool(内存池)的简称。它是那些有效但尚未确认的交易的暂存区。关键在于:并不存在某个中心化的内存池——每个全节点都在自己的内存里保有一份,并把新交易像传话一样转发给相邻节点,于是一笔刚广播出去的付款会在几秒内传遍全网。
挑选与排序:为什么手续费能买到优先权
一个区块能装的东西有限。区块空间是稀缺的——能塞进的交易数量有上限,而且每隔一段时间才会产出一个新区块(在比特币上大约每 10 分钟一个,在以太坊上每 12 秒一个)。当想进来的人多过能容纳的位置时,总得有个东西来决定先后顺序。
这个东西就是手续费。每笔交易都可以附上一笔手续费——付给区块构建者的一小笔报酬。构建者可以随意挑选它中意的等候交易,而由于它的收益会随收取的手续费水涨船高,它自然会先伸手去取出价更高的那些。所以手续费本质上是在为一个稀缺座位出价:出得多,往往更快被确认;出得少,就可能在内存池里熬过好几个区块,直到流量平息。
封存区块:一份头部,加一张清单
构建者挑好交易、排好顺序后,就把它们打包成一个区块。一个区块分两部分:一长串交易清单(区块主体),以及顶部那一小段大小固定的摘要,叫做区块头。可以把区块头想成一章的封面页——很小,却描述并锁定了里面的一切。
+=====================================+ | BLOCK HEADER | | prev block hash : a7f3... (link) | | merkle root : 9c1d... (body) | | timestamp : 12:04:31 | | rule value : difficulty/nonce | +=====================================+ | BODY (tx list) | | #1 Alice -> Bob fee 0.005 | | #2 Carol -> Dan fee 0.004 | | #3 Eve -> Frank fee 0.002 | | ... | +=====================================+
区块头只装着寥寥几个关键字段。它包含前一个区块头的哈希——正是这条向后的链接,把一堆区块变成了一条*链*。它包含一个概括区块主体中所有交易的指纹(即默克尔根,来自一棵默克尔树),所以只要改动其中任何一笔交易,这个数字就会改变,封印随之破裂。它还包含一些与规则相关的数值——一个时间戳,以及在基于证明的链上,诸如难度目标和一个随机数之类的东西。由于区块头承诺了整个主体,对这一小段摘要做哈希,就足以为里面的一切作保。
可究竟由谁来构建它?
我们悄悄略过了最重要的问题。挑选交易、排好顺序、拼出一个区块头,这些都不难——任何节点都做得到。那么,究竟由谁有资格把下一个区块接到大家都认可的那条链上?如果这是一场谁都能来的混战,两个人就可能发布互相矛盾的区块,网络随之分裂。
要公平地回答这个问题——没有老板、在一群互不信任的陌生人之间——这正是共识机制的全部职责。它就是那条规则:决定谁赢得封存下一个区块的权利,以及为什么其他所有人都同意跟随。这恰好是我们接下来要去的地方:工作量证明那场代价高昂的抽奖,以及它更轻盈的表亲——权益证明。