比特幣白皮書導讀

BTC.com 博物館編輯部16 分鐘閱讀

一封沒多少人回覆的郵件

2008 年 10 月 31 日,星期五,18:10(UTC)。

那是金融危機最兇險的一個秋天。雷曼兄弟倒下才一個多月,各國政府正忙著拿出鉅額資金救助銀行。就在這個時候,託管在 metzdowd.com 上的密碼學郵寄清單收到了一封郵件,標題是「Bitcoin P2P e-cash paper」,署名中本聰。

郵件的第一句話是:「我一直在研究一種全新的電子現金系統,完全點對點,無需可信第三方。」郵件裡附上了一篇九頁論文的連結。

回覆不多,其中不少是質疑,也有人認真追問技術細節。在那之前,這個圈子已經見過太多「數位現金」的構想,大多停留在紙面上。當時恐怕很少有人想到,這封郵件開啟的是一段持續至今的歷史。

十八年後,我們把這篇論文重新讀了一遍。最打動我們的,是它的推理方式:每一節都只解決一個問題,而每一個答案又會自然地引出下一個問題。十二節讀下來,就像跟著作者把一道難題從頭解到尾。

這篇導讀寫給沒有技術背景的讀者。我們會先解釋幾個繞不開的詞,再一節一節往下讀。每一節都會講清楚三件事:這一節在解決什麼問題,它是怎麼解決的,以及它又留下了什麼新問題。白皮書原文及中英文版本陳列在「創世之源」展廳的白皮書牆上,讀完這篇再去看原文,會輕鬆很多。

讀之前,先認識六個詞

白皮書篇幅很短,但用了不少術語。先把下面六個詞弄明白,後面就容易多了。

雜湊:可以把它理解成一份資料的「指紋」。任何一段內容,不管是一個字還是一本書,經過雜湊計算,都會得到一串固定長度的字元。內容哪怕只改動一個標點,指紋就會變得面目全非;而只拿到指紋,又沒辦法倒推出原來的內容。比特幣到處都在用雜湊,用來檢查內容有沒有被改過。

私鑰與公鑰:一對配套的數位鑰匙。私鑰自己秘密保管,公鑰可以公開給所有人。可以想像成一個帶鎖的信箱:公鑰是信箱的地址,誰都可以知道;私鑰是開箱的鑰匙,只有你有。

數位簽章:用私鑰給一段內容「簽名」,任何人都可以用對應的公鑰驗證這個簽名是不是你簽的,但沒有人能在不知道私鑰的情況下偽造它。它像手寫簽名,只是沒法臨摹。

區塊與區塊鏈:比特幣的帳本是一頁一頁記下來的,每一頁叫一個「區塊」,裡面裝著一批交易。每一頁都會寫上前一頁的指紋,於是所有的頁按順序串在一起,就成了「區塊鏈」。

節點:參與比特幣網路、儲存並檢查帳本的電腦。任何人都可以執行一個節點。

工作量證明:一道只能靠反覆猜來解的數學題。猜中需要花費大量計算,但別人檢查答案對不對,只要一瞬間。比特幣用它來決定誰有資格往帳本上添新的一頁。

有了這六個詞,我們就可以開始讀了。

第 1 節 · 引言:問題從成本開始

這一節在說什麼:今天的網路支付,幾乎都要靠銀行或支付公司這樣的「可信第三方」來居中處理。中本聰指出,這種依賴是有代價的。

舉個例子。你在網路上買了一件東西,付款後還可以申請退款,這對買家是保護,對商家卻是風險:有人可能收了貨又謊稱沒收到,要求退款。商家為了防範,只好向顧客要更多資訊,還得承擔一部分被騙的損失。這些成本最後都會攤進商品價格裡,而且小額付款也因此變得不划算。

現金就沒有這個問題:一手交錢,一手交貨,付了就是付了。可是在網路上,過去沒有辦法做到這一點。

留下的問題:能不能在網路上實現像現金一樣「付了就是付了」的支付,同時不需要任何第三方?如果沒有第三方,一枚電子貨幣屬於誰,又由誰來確認?

值得留意的是,整篇引言的語氣非常平靜。它讀起來像一位工程師在列出一個待解的技術問題,從成本出發,一步步推導。

第 2 節 · 交易:一枚幣,就是一串簽名

這一節在解決什麼:沒有銀行記帳,怎麼證明「這枚幣是我的」?

中本聰的答案出人意料地簡單:一枚電子貨幣,就是一串數位簽章。

可以把它想像成一張不斷轉手的轉讓單。最開始,單子上寫著「這枚幣屬於 A」。A 要把幣給 B 時,就在單子末尾寫上「轉給 B」,並簽上自己的名字。B 再轉給 C,也照樣在末尾簽名。每個人都能從頭到尾檢查這張單子,確認每一次轉手都有上一任主人的簽名。

技術上,這裡的「簽名」用的就是前面說的數位簽章:當前的主人用自己的私鑰,對上一筆交易和下一位主人的公鑰的雜湊值簽名。

這也回答了一個很多人都問過的問題:比特幣到底存在哪裡?它就記錄在區塊鏈上,體現為這串可以一筆筆追溯的簽名。所謂「擁有比特幣」,其實是掌握著那把能簽出下一筆轉帳的私鑰。

留下的問題:簽名能證明轉手,卻攔不住一個人耍賴。A 完全可以先簽一張「轉給 B」,再簽一張「轉給 C」,把同一枚幣賣兩次。B 和 C 各自檢查,簽名都是真的。這就是「雙重支付」問題,也就是常說的「雙花」。白皮書接下來的大部分篇幅,都在對付它。

第 3 節 · 時間戳記伺服器:給交易排隊

這一節在解決什麼:要識破 A 的把戲,只需要知道哪一筆交易在先。先發生的那筆算數,後發生的作廢。問題是,沒有一個中心機構,誰來判斷先後?

中本聰先借用了一個已有的思路:時間戳記伺服器。可以想像有一個公證處,定期把最新收到的一批交易打包,蓋上一個帶時間的印章,並把這個印章公之於眾。關鍵在於,每一個新印章都會把上一個印章的指紋包含進去,就像每一頁帳本的開頭都抄著上一頁的指紋。

這樣一來,所有的印章就一環扣一環地連成了一條鏈。如果有人想偷偷改動中間某一頁,那一頁的指紋就會變,後面所有頁上抄寫的指紋都對不上,篡改馬上就會暴露。

不過,「容易被發現」還不等於「難以做到」。如果有人有能力把後面所有頁都重新抄一遍,篡改依然可能成功。真正讓篡改在現實中變得極其困難的,是下一節的工作量證明。

留下的問題:現實中的公證處是一個中心機構,而比特幣不想要任何中心。那麼在一個人人平等的網路裡,誰有資格來蓋這個章?

第 4 節 · 工作量證明:讓投票有成本

這一節在解決什麼:沒有公證處,就得讓全網一起決定由誰來蓋下一個章。最自然的想法是投票,少數服從多數。

但在網路上,投票有個致命漏洞:註冊一個身分幾乎不花錢。原文寫道,如果按「一個 IP 位址一票」來決定,任何能掌握大量 IP 位址的人都能操縱結果。這就像一場網路投票,有人註冊了一萬個分身帳號,就能拿到一萬票。

所以,投票權必須和某種沒法憑空製造的東西掛鉤。中本聰選擇了計算能力,也就是「算力」。

具體的做法是這樣的:想要給下一頁帳本蓋章的人,必須先解出一道數學題。這道題沒有任何技巧可言,只能一遍遍地猜,就像不停地擲骰子,直到擲出一個足夠小的數字。誰先猜中,誰就獲得蓋章的資格,並把答案公布出來;其他人只要驗算一下,就能立刻確認答案是對的。

由於猜題需要實打實的電費和裝置,一個人有多少算力,就相當於有多少「票」。分身帳號註冊再多也沒用,因為分身不會幫你算題。

在此基礎上,比特幣定下一條規則:大家始終認可「最長」的那條鏈,準確地說,是背後累積工作量最多的那條鏈。這就是「多數人的決定」。另外,為了應對硬體越來越快、參與者時多時少,題目的難度還會根據出塊的速度自動調整,讓平均出塊時間保持穩定,大約十分鐘一個區塊。

現在回頭看第 3 節留下的那個擔心:如果有人想篡改某一頁,他不僅要重抄後面所有頁,還得把後面每一頁的題重新解一遍,並且要比全網所有誠實參與者加起來還快。這幾乎不可能做到。

第一處常見誤讀:原文寫道:「工作量證明本質上是一 CPU 一票。」這句話常被理解為「人人平等參與」。但放回上下文裡看,它要說的是:投票權必須付出真實的成本,而不是取決於你有多少個身分。

今天的挖礦早已由專用晶片和大型礦場主導,與原文描繪的圖景相去甚遠,「信任機器」展廳的礦機進化牆完整記錄了這個變化。原文論證的是投票權必須與算力掛鉤,至於算力最終會如何分布,它並沒有作出預測。

第 5 節 · 網路:不到一頁紙

這一節在解決什麼:前面的零件都有了,整個網路是怎麼一起轉起來的?

中本聰只用了六個步驟:

  1. 有人發起一筆新交易,廣播給全網所有節點。
  2. 每個節點把收到的新交易收集起來,打包成一個候選區塊。
  3. 每個節點開始為自己的區塊解那道工作量證明的題。
  4. 誰先解出來,就把這個區塊廣播給所有節點。
  5. 其他節點檢查這個區塊:裡面每一筆交易都有效、而且沒有被花過,才接受它。
  6. 節點表示接受的方式,就是以這個區塊為基礎,開始解下一個區塊的題。

如果兩個節點幾乎同時解出了題,網路裡會暫時出現兩條一樣長的鏈。這時節點會先在自己先收到的那條上繼續工作,等下一個區塊出現,哪條鏈更長就以哪條為準,另一條自然被放棄。節點永遠把最長的鏈視為正確的那條,並持續延長它。

一個執行至今的全球系統,它的網路規則在原文裡只佔了不到一頁紙。

留下的問題:解題要花電費、買裝置,憑什麼會有人願意來做這件事?

第 6 節 · 激勵:讓誠實成為最划算的選擇

這一節在解決什麼:給參與者一個理由。

答案是獎勵。每個區塊的第一筆交易,會憑空產生一定數量的新幣,發給解出這道題的人。這既是對他付出的電費和裝置的補償,也是新的比特幣進入流通的唯一方式。正因為它像開採金礦一樣,靠付出資源換來新幣,這項工作後來被稱為「挖礦」,參與的人被稱為「礦工」。等新幣發行完畢,交易手續費會接替這份獎勵。

這一節真正精彩的是後半段。中本聰設想了一個算力超過全網所有誠實節點的攻擊者,然後冷靜地推演了他的選擇:他可以用這些算力去作弊,把自己花出去的錢偷偷改回來;也可以老老實實挖礦,賺取新幣。中本聰的結論是,守規矩反而更賺錢,因為按規則挖到的新幣,比作弊能得到的更多。何況一旦發動攻擊,大家對比特幣失去信心,他自己手裡那些幣的價值也會跟著受損。

換句話說,比特幣的安全並不指望每個人都是好人,它把規則設計成:守規矩,就是最划算的選擇。前幾節回答的是「技術上能不能做到」,這一節回答的是「有沒有人願意去做」。在一個開放的網路裡,後者往往更難。

新幣發行完畢後,手續費能否長期支撐足夠的算力,是後來才浮現的問題,至今仍在討論,沒有定論。

第 7 節 · 回收磁碟空間:帳本越來越厚怎麼辦

這一節在解決什麼:每一筆交易都永久記在帳上,帳本只會越來越厚,普通電腦遲早存不下。

中本聰的辦法用到了一種叫「默克爾樹」的結構。可以這樣理解:把一個區塊裡的所有交易兩兩配對,各自算出一個指紋;再把這些指紋兩兩配對,算出新的指紋;如此一層層往上合併,最後只剩下一個總指紋,叫作「默克爾根」。區塊的指紋裡,只需要包含這個總指紋。

這樣做的好處是:一枚幣最新的那筆交易被足夠多的區塊壓在下面之後,之前那些已經花掉的舊交易就可以刪掉,只保留樹上必要的幾個指紋,整條鏈的校驗關係依然完好。中本聰還算了一筆帳:只保留每個區塊的「頁首」,一年下來也只需要幾兆位元組的空間。

第 8 節 · 簡化支付驗證:不用下載整本帳

這一節在解決什麼:即使壓縮了,普通使用者也未必願意儲存和檢查整本帳。那能不能只確認「我收到的這筆錢已經被記上帳」?

可以。使用者只需要儲存每個區塊的頁首,需要時向網路索要一小段證明,證明自己那筆交易確實在某個區塊的默克爾樹裡。這有點像查包裹:你不需要掌握物流公司的整個系統,只要有貨運單號,就能確認自己的包裹已經寄出。今天許多輕錢包的設計,都能追溯到這裡。

原文同樣寫明了代價:這種方式依賴網路中誠實節點佔多數,安全性不如自己執行一個完整節點。所以原文建議,頻繁收款的商家最好還是自己執行完整節點。

第 9 節 · 合併與拆分:比特幣的「找零」

這一節在解決什麼:如果每一枚幣都要單獨轉帳,那付一筆錢可能要拆成幾百筆交易,太麻煩了。

中本聰的設計是:一筆交易可以有多個「輸入」和多個「輸出」。可以想像你錢包裡有一張 50 元和一張 20 元,要付 60 元,就把兩張一起遞出去(兩個輸入),對方收 60 元,再找你 10 元(兩個輸出,其中一個是找零給你自己)。

這也解釋了比特幣錢包的一個特點:你的餘額並不是一個數字,而是由好幾筆大小不一、還沒花掉的「零錢」組成的。

第 10 節 · 隱私:假名,不是匿名

這一節在解決什麼:帳本對所有人公開,那每個人的交易豈不是一覽無餘?

傳統銀行保護隱私的方法,是不讓外人看到帳本。比特幣做不到這一點,因為帳本必須公開才能讓大家核對。中本聰換了一個思路:帳本公開,但帳本上不寫名字,只寫公鑰。外人看得到有一筆錢從一個地址轉到另一個地址,卻不知道這兩個地址背後是誰。這就像股票交易所公布每一筆成交,卻不公布買賣雙方的身分。

原文還建議,每筆交易都使用一對新的金鑰,作為額外的防線,避免多筆交易被關聯到同一個主人身上。

第二處常見誤讀:很多人以為比特幣是匿名的。但原文自己就提醒過,一筆交易如果有多個輸入,就會暴露出這些輸入屬於同一個人;地址也可能被關聯、被分析,最終和現實中的身分對上號。原文用的詞是「匿名」,但它描述的機制,更接近今天所說的「假名」:你的名字不在鏈上,你做過的每一筆交易卻都在。

第 11 節 · 計算:安全可以被算出來

這一節在解決什麼:說了這麼多,這套系統到底有多安全?中本聰沒有停留在定性描述,而是把它算了出來。

他把攻擊想像成一場追趕賽。假設你收到一筆付款,這筆交易已經被寫進區塊,後面又接上了幾個區塊。攻擊者想推翻它,就得從那筆交易之前開始,偷偷另起一條鏈,並且追上、超過誠實節點不斷延長的那條鏈。

只要攻擊者的算力少於誠實節點,他落後得越多,追上的機會就越渺茫,而且是成倍地下降。原文給出了具體數字:假如攻擊者掌握全網 10% 的算力,在落後 6 個區塊的情況下,他追上的機率只有大約萬分之二點四。

第三處常見誤讀:原文給出的是機率,並不是絕對的保證。區塊越多,交易被推翻的可能就越接近於零,但嚴格來說永遠不會等於零。這與傳統金融裡「結算終局性」的概念並不相同。後來人們常說的「等六個確認」,依據的正是這類機率計算:交易後面接上六個區塊,大約一個小時,被推翻的可能性已經小到可以忽略。

在「信任機器」展廳的記帳大冒險裡,你可以親手調整攻擊者的算力占比,看看落後 1 個和 6 個區塊時,這個機率怎麼變化。

第 12 節 · 結論:一個寫在明處的前提

結論很短。中本聰回顧了全文的思路:先用數位簽章表示一枚幣的歸屬,再用工作量證明和最長鏈解決雙重支付,最後得出結論:只要誠實節點控制了多數算力,這個系統就是安全的。

這個結論帶著前提,而原文把它寫得清清楚楚。此後十八年裡,圍繞比特幣的許多討論,歸根結底都在討論這個前提在現實中能在多大程度上成立。

把十二節串起來

如果用一段話回顧整篇白皮書,大概是這樣的:

想在網路上像現金一樣付款,又不要銀行(第 1 節)。於是把一枚幣定義為一串簽名(第 2 節),但這擋不住一幣兩花,所以需要給交易排出公認的先後(第 3 節)。排序的資格靠解題爭取,誰的算力多誰的話就有分量,大家只認累積工作量最多的那條鏈(第 4 節)。全網按六個步驟一起記帳(第 5 節),靠新幣和手續費吸引人參與,並讓守規矩成為最划算的選擇(第 6 節)。再用三個工程設計解決儲存、輕量驗證和找零的問題(第 7 至 9 節),用不寫名字的公開帳本兼顧隱私(第 10 節),最後用數學算出攻擊成功的機率(第 11 節),並寫明這一切成立的前提(第 12 節)。

合上這九頁

重讀這篇論文,最讓我們感慨的是它的剋制。它沒有宏大的宣言,也不許諾未來。它只是提出一個問題,給出一種解法,再老老實實寫明這個解法在什麼條件下成立。

十八年前,那封回覆寥寥的郵件,指向的就是這樣一份文件。

如果你還沒讀過原文,不妨去白皮書牆前,花半個小時,從第一頁讀到第九頁。有了這篇導讀做底,你會發現它比想像中好懂。

本文對各節內容的概述由編輯部根據原文整理,並非逐句翻譯,一切以原文為準。如發現與原文有出入,請寫信到 editorialoffice@btc.com 告訴我們。

延伸閱讀

資料來源:

免責聲明: 本文為文獻導讀,不構成投資建議。

返回部落格

館內導覽BTC.com 博物館
有什麼關於比特幣想問的?
回答來自本館展陳與公開資料