給數位資料蓋一枚火漆印
很久以前,信封還沒有膠水,重要的信件會用一團熱蠟封口,再用印戒壓上印記。這團蠟做了一件很巧妙的事:要是有人撬開信件再重新封上,封蠟就會裂開,你一眼就能看出它被人動過。封蠟並不能把信鎖住——它做的是讓竄改變得顯眼。
密碼學雜湊就是這枚火漆印的數位版本。你把任意資料餵進去——一句話、一張照片、一整頁紀錄——一套固定的配方就會吐出一串短短的、被打亂的字元:這份資料的指紋。同樣的輸入永遠給出同樣的指紋。但只要改動哪怕一個逗號,指紋就會變得截然不同——不是差一點點,而是面目全非。
用前一個區塊為每個區塊蓋章
現在想像一本紀錄用的筆記本,一次寫一頁。每一頁就是一個區塊。讓整本筆記本變得誠實的訣竅在這裡:在每一新頁的最上方,動筆寫其他內容之前,你先把上一頁的指紋抄下來。每頁頂端這段小小的摘要,就叫做它的區塊標頭。
於是每個區塊都帶著它前一個區塊的指紋。這些區塊不再是一疊散亂的紙頁——它們成了一條鏈,每一環都向後伸手,緊緊扣住身後的那一環。這正是 blockchain(區塊鏈)這個詞的字面由來。
Block 1 Block 2 Block 3
+-----------+ +-----------+ +-----------+
| prev: ... | | prev: H1 | | prev: H2 |
| data | | data | | data |
| hash: H1 |----->| hash: H2 |----->| hash: H3 |
+-----------+ +-----------+ +-----------+
| | |
fingerprint fingerprint fingerprint
of block 1 of block 2 of block 3為什麼你沒法悄悄改寫過去
封印的價值就體現在這裡。假設有個騙子想回頭去改區塊 1 裡埋著的一條紀錄——改個數字、抹掉一筆付款。他一動手編輯區塊 1,它的資料就變了,於是它的指紋也跟著變了。可是區塊 2 在自己的標頭裡抄下的,是區塊 1 的舊指紋。現在兩者對不上了。封印裂開了。
為了掩蓋這道裂縫,騙子就得拿新指紋去更新區塊 2。可這又改變了區塊 2 自己的指紋——而那個指紋區塊 3 早就記下了。再往後還有區塊 4。要改寫一張舊頁,你就必須偷偷把它之後的每一張頁全部重做一遍,一路追到當下,還得比其他所有人不停添加新頁的速度更快。在一個繁忙的網路上,這幾乎不可能。
證明你確實在某個區塊裡的那張收據
單個區塊可以容納成千上萬條紀錄。這些紀錄不是被整堆算成一個指紋,而是兩兩配對算指紋,再把配對算到一起,如此層層向上堆成一座小金字塔,直到塔尖只剩一個指紋。這座由雜湊堆成的金字塔,就是默克爾樹,而塔尖那唯一的指紋,正是區塊標頭所攜帶的東西。
ROOT (one fingerprint in the header)
/ \
H12 H34
/ \ / \
H1 H2 H3 H4
| | | |
r1 r2 r3 r4 (your record is r3)美妙的回報在於:要證明你的紀錄 `r3` 確實在這個區塊裡,你並不需要全部上千條紀錄。你只需要一張短短的收據——沿著金字塔向上那條路上的幾個指紋——任何人都能據此一路重算到塔尖,核對它是否與區塊標頭吻合。寥寥幾個指紋,就替整個區塊作了證。
你現在掌握了什麼
- 雜湊是一枚一改就露餡的指紋:相同資料進去,得出相同指紋;改動任何東西,指紋就徹底變樣。
- 每個區塊的標頭都帶著前一個區塊的指紋,把區塊們串成一條鏈。
- 改動一個舊區塊會弄裂它之後的每一道封印,所以越早的歷史實際上越被凍結。
- 默克爾樹把整個區塊濃縮成一個根指紋,於是一張小小的收據就能證明你的紀錄在裡面。
你現在已經握住了區塊鏈運轉的機械內核。接下來我們要認識那些金鑰——它們讓你能把紀錄簽為真正屬於你的——這樣鏈條不只是誠實地記住過去,還知道誰有資格寫下一頁。