進入帳本之前的候車室
想像一間忙碌的郵局。你把信投進投遞口,它並不會一離手就飛向目的地,而是先匯入一疊等著被分揀、蓋戳、裝上下一班貨車的信件裡。一筆區塊鏈交易也是這樣。在你簽名並廣播的那一刻,這筆付款就已經貨真價實、隨時可走——但它還沒有真正進入帳本。
這疊等待中的信件,就是記憶池——英文 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 | | ... | +=====================================+
區塊標頭只裝著寥寥幾個關鍵欄位。它包含前一個區塊標頭的雜湊——正是這條向後的連結,把一堆區塊變成了一條*鏈*。它包含一個概括區塊主體中所有交易的指紋(即默克爾根,來自一棵默克爾樹),所以只要更動其中任何一筆交易,這個數字就會改變,封印隨之破裂。它還包含一些與規則相關的數值——一個時間戳,以及在基於證明的鏈上,諸如難度目標和一個隨機數之類的東西。由於區塊標頭承諾了整個主體,對這一小段摘要做雜湊,就足以為裡面的一切作保。
可究竟由誰來建構它?
我們悄悄略過了最重要的問題。挑選交易、排好順序、拼出一個區塊標頭,這些都不難——任何節點都做得到。那麼,究竟由誰有資格把下一個區塊接到大家都認可的那條鏈上?如果這是一場誰都能來的混戰,兩個人就可能發布互相矛盾的區塊,網路隨之分裂。
要公平地回答這個問題——沒有老闆、在一群互不信任的陌生人之間——這正是共識機制的全部職責。它就是那條規則:決定誰贏得封存下一個區塊的權利,以及為什麼其他所有人都同意跟隨。這恰好是我們接下來要去的地方:工作量證明那場代價高昂的抽獎,以及它更輕盈的表親——權益證明。