← 全部概念地圖
標準

概念地圖・Merkle 驗證樹

分類:系統

這一頁不只是把一個概念解釋一遍——一張自己畫的結構圖,加上拿台灣情境從頭走一次的實例演練、這個框架什麼時候會騙你,以及它接回 P.A.I.N. 之後長什麼樣。一頁必須交付的三層 →

Merkle 驗證樹:驗一筆,不必看全部

客戶只問了一句:我怎麼知道你們沒有把別人的洞補在我這一欄。要證明給他看,最直覺的做法是把整本帳攤開——可是那本帳上還有另外四千個人的餘額。Merkle 驗證樹處理的正是這個死結:每一筆資料先算成一個值,兩兩合成往上收,最後收成一個對外公告的「根」。之後要證明某一筆沒被動過,只要交出路徑上的幾個中間值,其餘資料一筆都不必露臉。它畫出來是一棵由下往上收斂的樹,讀起來則是一份清單——為了驗這一筆,最少要拿到哪幾個東西。

Merkle 驗證樹:八筆資料四層收斂成一個根,驗一筆只要三個值 一棵由下往上收斂的四層二元樹。最底層是八個資料塊 L1 到 L8,每相鄰兩塊往上合成一個中間值,四個中間值再合成兩個,最後收成頂端唯一的根,也就是對外公告的那個值。要證明第五塊 L5 沒被動過,只要三個值:兄弟 L6、右邊那一組的合併值 H78、左半邊整組的合併值 H1234。圖上以金色描邊標出這三個被交到手上的值,以朱紅箭頭標出 L5 往上算到根的那條路徑。 八筆資料,一個根:驗其中一筆,手上只要三個值 根 內部節點 內部節點 葉 根:對外公告 H1234 H5678 H12 H34 H56 H78 L1 L2 L3 L4 L5 L6 L7 L8 金框=交到你手上的三個值:L6、H78、H1234 朱紅=你自己往上算的那條路徑:L5 → H56 → H5678 → 根 H12 = L1 與 L2 合成出來的值,其餘類推。資料量翻一倍,要帶的值只多一個。
八個資料塊收斂成一個根;驗其中一塊,手上拿到三個值就夠。

這棵樹的四個位置,分工是什麼

圖上有四層,可是位置只有四種——中間那兩層做的是同一件事。先把四種各自的職務講清楚,後面所有爭議都落在最後兩種身上。

位置它裝的是什麼你該追問的一句
葉一筆原始資料算出來的值。八筆資料就是八片葉。這一筆的內容有沒有被完整涵蓋,還是只算了摘要欄位
內部節點底下兩個值合起來再算一次的中間值,例如 H12 由 L1 與 L2 合成。合成的順序與規則有沒有寫死,雙方拿到的是不是同一套
根整棵樹收斂出的那一個值,也是唯一對外公告的東西。它公告在哪裡、公告之後還能不能改
驗證路徑上的兄弟節點驗某一筆時被交到你手上的那幾個值,本例是 L6、H78、H1234。這幾個值由誰挑,你有沒有辦法自己算出同一個根

第四種最容易被誤讀成「第五層」。它其實還是前面那兩種的成員——L6 本身就是葉、H78 本身就是內部節點,只是在「驗 L5」這一次任務裡被點名而已。換一筆要驗,被點名的就換一組。所以這棵樹真正的產品藏在一個能力裡:給定任何一筆,我能立刻列出要交出哪幾個值。八筆資料要三個值,一千零二十四筆要十個,一百萬筆要二十個——資料量翻一倍,清單只長一格。

要不要建這棵樹,先看三件事

一、資料是不是天生一筆一筆、而且彼此獨立。Merkle 樹的前提是「可以切成不重疊的塊」。帳戶餘額、交易明細、檔案分片,天生就長這樣。反過來,一份會互相引用、改一段就牽動全篇的合約草稿,切開之後每一塊都不能單獨成立,驗過某一塊也證明不了什麼。切不乾淨,樹就白建。自問:拿掉其他所有筆,剩下這一筆自己看得懂嗎?

二、對方有沒有理由公告根值,而且公告之後不能反悔。整套機制的重量全壓在根上。根若是私下給、給完還能換一個,那就等於沒有基準線。所以這一題該問的是動機——公告會替他帶來什麼、不公告他會失去什麼。願意把根貼上公開頁面、貼上帶時間戳的第三方,那才叫承諾。自問:他把根改掉一次,誰會發現、誰會生氣?

三、你這一端留不留得住昨天的根。這條最常被跳過。驗證的動作是「拿路徑上的值往上算,看算不算得出公告的根」;如果你手上沒有昨天那個根,今天對方給你什麼你就只能照單全收——比對的對象不存在,驗證就退化成儀式。留存這件事在客戶端,不在對方那邊。自問:昨天那個值現在存在哪裡,我三分鐘內找得到嗎?

四千個帳戶,驗其中一個

實例演練
  • 先數清楚規模:假設一家做代客操作與資產保管的業者,帳上 4,096 個客戶帳戶,每天收盤後結算一次。數量是 2 的 12 次方,剛好收斂成十二層,形狀不必湊
  • 每天收出一個根:把 4,096 筆餘額各算成一個值,兩兩往上合成,最後得到一個根,貼上公開頁面。一年 244 個營業日,就是一年 244 個根值。對外要維護的東西只有一串,不是一疊報表
  • 客戶要驗,就發一份憑證:4,096 對半砍 12 次就剩一筆,所以路徑上有 12 個雜湊值。客戶拿自己的餘額往上算 12 次,比對當天公告的根。手機上跑完不到一秒,不必安裝任何東西
  • 另外 4,095 個人怎麼辦:攤開整本帳,等於 4,096 筆餘額全部曝光;發憑證只給 12 個值,其他人的餘額一筆都看不到。保密與可驗證第一次不打架
  • 可是根是誰算的:這份憑證只能證明「發給你的路徑跟公告的根一致」。根本身由保管方自己算、自己公告——自己出考卷自己改。整套機制最軟的一節,剛好在客戶最看不到的地方

這個場景真正值得記住的接縫,在最後一條。客戶驗完會鬆一口氣,可是他驗過的只有「一致」這件事。要把那口氣坐實,得再補兩個動作:一是根值送到外部第三方那裡留底,時間戳不由保管方掌握;二是客戶自己保留昨天的根,隔天拿新的比對,看歷史有沒有被靜靜重寫。少了外部留底,公告就只是自說自話;少了客戶留存,比對就沒有對象。這兩件事都不寫在資料結構裡,它們是合約條款與客戶習慣——技術把「需要相信的東西」壓到很小一塊,但那一小塊還是得有人扛。以上為說明結構用的示意情境,僅供理解框架之用。

這棵樹什麼時候會騙你

  1. 它證明的是一致,不是誠實。驗證通過只說明「你手上那份憑證跟公告的根對得起來」。根本身有沒有涵蓋所有帳戶、有沒有偷偷少放幾筆、餘額背後有沒有真的資產,這棵樹一個字都沒說。實務上最常見的破法是「只把要給你看的那些放進樹裡」——客戶每一個都驗過,加總起來還是湊不出他該有的規模。要補這一刀,得另外要求一份「筆數與總額」的宣告,並且讓宣告本身也進樹。
  2. 「雜湊不可能撞在一起」是錯的講法。正確的說法是:以現在的運算力,找不出兩份不同的資料算出同一個值。這是一句關於成本的陳述——成本會隨著算力往下掉。所以雜湊演算法會過期,過期的那一天要能換——換演算法就等於整棵樹重建、歷史根值全部要重新錨定。合約裡沒有寫「演算法怎麼汰換」,這個風險就沒有人在管。
  3. 樹的形狀也可以被動手腳。同一筆資料放兩個位置、葉的數量不是 2 的次方時尾巴怎麼補、內部節點與葉用不用不同的前綴標記——這些細節沒有寫死,就有辦法拿一個內部節點冒充成一片葉,做出兩份不同資料算出同一個根的效果。驗證程式碼看起來全綠,因為它只是照著算。這一條要靠規格書擋,擋不住的地方,驗再多次都一樣。

少信一點這件事,用痛點的眼光讀

痛點視角

信任是可以秤重的。

它沒有讓你更相信對方,它讓你需要相信的東西變少——這兩句聽起來很近,做起來差很遠。前者要你加碼投入感情,後者要你把清單刪短。放到《痛點》那把尺上,真正的痛藏在「我沒有辦法不懷疑他」這句話裡:沒有工具、沒有憑證、沒有可以自己比對的東西,懷疑就只能停在情緒層,卡在那裡誰都動不了。這張圖畫得出「哪幾個值足以把一筆資料釘死」,畫不出「對方為什麼願意讓你釘死它」。願不願意公開根值、願不願意讓客戶留昨天的根,那是商業決定,資料結構替他決定不了。所以槓桿其實在更前面一步——把你現在「只能點頭」的環節數出來,挑其中一個,去問對方能不能交一小段你可以自己算的證據給你。先挑那一件下手就好。

關於 Merkle 驗證樹,常被問到的幾件事

Merkle 驗證樹是不是區塊鏈才會用的東西?

它比區塊鏈老得多,1979 年就有了。現在確實在加密貨幣交易所的儲備證明、版本控制系統、檔案同步與備份校驗裡都看得到,那些都只是它出沒的場合。任何「一大堆獨立資料,要讓別人驗其中一筆」的場合都用得上:保管業者對客戶、平台對賣家、稽核單位對受查方。把它當成區塊鏈的零件,反而會錯過它在一般對帳流程裡最實用的那一面——用很小的揭露量,換一次可以自己動手的查核。

資料量變大,客戶要帶的東西會不會跟著暴增?

不會,而且慢得驚人。要帶幾個值,等於資料量對半砍幾次才剩一筆:8 筆砍 3 次、1,024 筆砍 10 次、100 萬筆砍 20 次。數學上就是以 2 為底取對數。換成白話——資料量翻一倍,要多帶的值只多一個。從一千筆長到一百萬筆,客戶手上的憑證從十個值變成二十個值,體感上沒有差別。這正是它敢被用在四千個帳戶、也敢被用在四百萬個帳戶的原因。

客戶自己驗,需要懂密碼學嗎?

不需要。他要做的事只有一件:拿自己的餘額算出一個值,再照憑證上給的順序,一層一層跟旁邊那個值合起來算,最後看結果等不等於公告的根。整個過程是機械式的,寫成網頁工具或一支小程式都行,跑完不到一秒。真正需要人判斷的是別的:這個根公告在哪、上一次公告是什麼時候、我有沒有把昨天那個根存下來。技術門檻很低,習慣門檻反而高。

只有我一個人驗,有意義嗎?

單獨一個人驗,只證明得了自己那一筆沒被改。可是這套機制的威力來自統計——保管方不知道今天誰會驗,所以他必須假設每一個人都會。要動手腳就得改根,改了根,所有留存過舊根的人下次比對都會發現。換句話說,驗的人數不必多,只要「隨時可能有人在驗」這件事是可信的就夠。你多驗一次,等於替所有沒驗的人也把門守住一點。

一條路徑就能證明一件事,這個想法可以往回推到供應鏈:供應鏈階層能見度那張圖處理的是「往上還有誰」,節點越往上越多;這一張處理的是「往上收斂成誰」,節點越往上越少,方向剛好相反。想看另一種「只查一小部分」的思路,可以對照允收抽樣與 OC 曲線——抽樣是用少數推測整體的好壞,Merkle 路徑則是把單獨一筆釘死,兩者的把握程度天差地遠。

發現引用或事實有誤?請寫信回報,我會依更正政策修正。