15週年經典重讀:比特幣白皮書中文版全文

作者:中本聰;中文翻譯:李笑來

按:2008年10月31日,中本聰(Satoshi Nakamoto)在P2P foundation網站發布比特幣白皮書《比特幣:一種點對點的電子現金系統》。在白皮書發布15週年之際,為了重讀這篇永遠改變了金融世界的經典,金色財經再次刊發中文版比特幣白皮書。

摘要:一個純粹的點對點版本的電子現金系統,將允許線上付款直接從一方發送到另一方,而無需通過金融機構。雖然數位簽章提供了部分解決方案,但,若是仍需要被信任的第三方來防止雙重支出的話,那麼電子支付的主要優勢就被抵銷了。我們提出一個方案,使用點對點網路去解決雙重支出問題。點對點網路將為每筆交易標記時間戳,方法是:把交易的雜湊資料錄入一個不斷延展的、以散列為基礎的工作證明鏈上,形成一個如非完全重做就不可能改變的記錄。最長鏈,一方面用來證明已被見證的事件及其順序,同時,也用來證明它來自於最大的CPU 算力池。只要絕大多數CPU 算力被良性節點控制—— 即,它們不與那些嘗試攻擊網路的節點合作—— 那麼,良性節點將會產生最長鏈,並且在速度上超過攻擊者。這個網路本身需要最小化的結構。訊息將以最大努力為基本去傳播,節點來去自由;但,加入之時總是需要接受最長的工作證明鏈作為它們未參與期間所發生之一切的證明。

1. 簡介(Introduction)

網路商業幾乎完全依賴金融機構作為可信任第三方去處理電子支付。雖然針對大多數交易來說,這個系統還不錯,但,它仍然被基於信任的模型所固有的缺陷所拖累。完全不可逆轉的交易實際上並不可能,因為金融機構不能避免仲裁爭議。仲裁成本增加了交易成本,進而限制了最小可能交易的規模,且乾脆阻止了許多小額支付交易。除此之外,還有更大的成本:系統無法為那些不可逆的服務提供不可逆的支付。逆轉的可能性,造成了對於信任的需求無所不在。商家必須提防著他們的顧客,麻煩顧客提供若非如此(如若信任)就並不必要的更多資訊。一定比例的欺詐,被認為是不可避免的。這些成本和支付不確定性,雖然在人與人之間直接使用實體貨幣支付的時候是可以避免的;但,沒有任何一個機制能在雙方在其中一方不被信任的情況下透過溝通管道進行支付。

我們真正需要的是一種基於加密證明而非基於信任的電子支付系統,允許任意雙方在不需要信任第三方的情況下直接交易。算力保障的不可逆轉交易能幫助賣家不被欺詐,而保護買家的日常擔保機制也很容易實現。在本論文中,我們將提出一個針對雙重支出的解決方案,使用點對點的、分散式的時間戳伺服器去產生基於算力的證明,按照時間順序記錄每條交易。此系統是安全的,只要誠實節點大致上相對於相互合作的攻擊者掌握更多的CPU 算力。

2. 交易(Transactions)

我們將一枚電子硬幣定義為一個數位簽名鏈。一位所有者將一枚硬幣交給另一個人的時候,要透過在這個數位簽名鏈的末尾附加上以下數字簽名:上一筆交易的哈希(hash,音譯,亦翻譯為「散列值」),以及新所有者的公鑰。收款人可以透過驗證簽名去驗證數位簽章鏈的所屬權。

這個路徑的問題在於收款人無法驗證曾經的所有者之中沒有人雙重支付過。常見的解決方案是引入一個可信的中心化權威方,或稱為“鑄幣廠”,讓它去檢查每一筆交易是否存在雙重支付。每次交易發生後,硬幣必須返回鑄幣廠,鑄幣廠再發行一枚新的硬幣。進而,只有鑄幣廠直接發行的硬幣才是可信的、未被雙重支付過的。這個解決方案的問題在於,整個貨幣系統的命運被拴在經營鑄幣廠的那個公司(就好像銀行那樣)身上,每一筆交易都必須通過它。

我們需要一種方式,可以讓收款人確認先前的所有者並沒有在任何先前的交易上簽名。就我們的目的而言,只有最早的交易是算數的,所以,我們並不關心其後的雙重支付企圖。確認一筆交易不存在的唯一方法是獲悉所有的交易。在鑄幣廠模型之中,鑄幣廠已然知悉所有的交易,並且能夠確認這些交易的順序。為了能在沒有「被信任的一方」參與的情況下完成以上任務,交易記錄必須被公開宣布1,進而我們需要一個系統能讓參與者們認同它們所接收到的同一個唯一的交易歷史。收款人需要證明在每筆交易發生之時,大多數節點能夠認同它是第一個被接收的。

3. 時間戳伺服器(Timestamp Server)

本解決方案起步於一種時間戳伺服器。時間戳伺服器是這樣運作的:為一組(block)記錄(items)的哈希打上時間戳,而後把哈希廣播出去,就好像一份報紙所做的那樣,或者像是在新聞組(Usenet )裡的一個貼文那樣2 3 4 5。顯然,時間戳能夠證明那資料在那個時間點之前已然存在,否則那雜湊也就無法產生。每個時間戳在其雜湊中包含著先前的時間戳,因此構成了一個鏈;每一個新的時間戳被加到先前的時間戳之後。

IkJWI40CL5rPFbmKNx829DpApCPH8JY1zjTQ9neY.jpeg

4. 工作證明(Proof-of-Work)

為了實現一個基於點對點的分散式時間戳伺服器,我們需要使用類似亞當·伯克的哈希現金6那樣的一個工作證明系統,而不是報紙或新聞組帖子那樣的東西。所謂的工作證明,就是去尋找一個數值;這個數值要滿足以下條件:為它提取散列數值之後—— 例如使用SHA-256 計算散列數值—— 這個散列數值必須以一定數量的0 開頭。每增加一個0 的要求,將使得工作量指數級增加,並且,這個工作量的驗證卻只需透過計算一個雜湊。

在我們的時間戳記網路中,我們是這樣實現工作證明的:不斷在區塊之中增加一個隨機數(Nonce),直到一個滿足條件的數值被找到;這個條件就是,這個區塊的哈希以指定數量的0 開頭。一旦CPU 的耗費算力所獲得的結果滿足工作證明,那麼這個區塊將不再能被更改,除非重新完成之前的所有工作量。隨著新的區塊不斷被添加進來,改變當前區塊即意味著說要重新完成所有其後區塊的工作。

L5fHgxjJJ6fSYcFToKfNERzgNlhNgUwdgMiNG2N5.jpeg

工作證明同時解決如何決定誰能代表大多數做決定的問題。如果所謂的「大多數」是基於「一個IP位址一票」的方式決定的話,那麼任何一個可以搞定很多IP 位址的人就可以被認為是「大多數」。工作證明本質上來看,是「一個CPU一票」。所謂的「大多數決定」是由最長鏈所代表的,因為被投入最多工作的鍊就是它。如果大多數CPU 算力被誠實的節點所控制,那麼誠實鏈成長最為迅速,其速度會遠超其他競爭鏈。為了更改一個已經產生的區塊,攻擊者將不得不重新完成那個區塊以及所有其後區塊的工作證明,而後還要追上並超過誠實節點的工作。後文展示為什麼一個被拖延了的攻擊者能夠追上的可能性將隨著區塊的不斷增加而指數級降低。

為了因應硬體算力綜合的不斷增加,以及隨著時間推進可能產生的節點參與數量變化,工作證明難度由此決定:基於平均每小時產生的區塊數量的一個移動平均值。如果區塊生成得太快,那麼難度將會增加。

5. 網路(Network)

運行網路的步驟如下:

  1. 所有新的交易向所有節點廣播;

  2. 每個節點將新交易打包到一個區塊;

  3. 每個節點開始為此區塊找一個具備難度的工作證明;

  4. 當某個區塊找到其工作證明,它就要將此區塊廣播給所有節點;

  5. 眾多其他節點當且只當以下條件滿足才會接受這個區塊:其中所有的交易都是有效的,且未被雙重支付;

  6. 眾多節點向網路表示自己接受這個區塊的方法是,在創建下一個區塊的時候,把被接受區塊的哈希當作新區塊之前的哈希。

節點始終認為最長鍊是正確的那個,並且會不斷向其添加新資料。若是有兩個節點同時向網路廣播了兩個不同版本的“下一個區塊”,有些節點會先接收到其中一個,而另外一些節點會先接收到另外一個。在這種情況下,節點將在它們先接收到的區塊上繼續工作,但也會把另一個分支保存下來,以防後者成為最長鏈。當下一個工作證明被找到,而其中的一個分支成為更長的鏈之後,這個暫時的分歧會被打消,在另外一個分支上工作的節點們會切換到更長的鏈上。

新的交易不見得一定要廣播到達所有的節點。只要到達足夠多的節點,那麼沒多久這些交易就會被打包進一個區塊。區塊廣播也容許一些訊息被丟棄。如果節點並未接收到某個區塊,那麼這個節點會在它接收到下一個區塊的時候意識到自己錯失了先前的區塊,因此會發出補充那個遺失區塊的請求。

6. 獎勵(Incentive)

按照約定,每個區塊的第一筆交易是一個特殊的交易,它會產生一枚新的硬幣,所屬權是這個區塊的生成者。這麼做,使得節點支持網絡有所獎勵,也提供了一種將硬幣發行到流通之中的方式—— 在這個系統中,反正也沒有一個中心化的權威方去發行那些硬幣。如此這般穩定地增加一定數量的新硬幣進入流通,就好像是黃金開採者不斷耗用他們的資源往流通之中增加黃金一樣。在我們的系統中,被消耗的資源是CPU 工作時間和它們所使用的電力。

獎勵還可以來自交易費用。如果一筆交易的輸出值小於它的輸入值,那麼其中的差額就是交易費;而該交易費就是用來獎勵節點把該交易打包進此區塊的。一旦既定數量的硬幣已經進入流通,那麼獎勵將全面交由交易手續費來完成,絕對不會有通貨膨脹。

獎勵機制也可能鼓勵節點保持誠實。如果一個貪婪的攻擊者能夠網羅比所有誠實節點都更多的CPU 算力,他必須做出一個選擇:是用這些算力通過把自己花出去的錢偷回來去欺騙別人呢?還是用這些算力生成新的硬幣?他應該能夠發現按照規則行事是更划算的,當前規則使得他能夠獲得比所有其他人加起來都更多的硬幣,這顯然比暗中摧毀系統並使自己的財富化為虛無更划算。

7. 回收硬碟空間(Reclaiming Disk Space)

如果一枚硬幣最近發生的交易發生在足夠多的區塊之前,那麼,這筆交易之前該硬幣的花銷交易記錄可以被丟棄—— 目的是為了節省磁碟空間。為了在不破壞該區塊的雜湊的前提下實現此功能,交易記錄的雜湊將被納入一個Merkle 樹之中,而只有樹根被納入該區塊的雜湊之中。透過砍掉樹枝方法,舊區塊即可被壓縮。內部的哈希並不需要被保存。

GOSWSMEutHTHRctOsFIZ6l0XiCZpQDCytysccOvF.jpeg

一個沒有任何交易記錄的區塊頭大約是80 個位元組。假設每十分鐘產生一個區塊,80 位元組乘以6 乘以24 乘以365,等於每年4.2M。截止2008 年,大多數在售的電腦配備2GB 內存,而按照摩爾定律的預測,每年會增加1.2 GB,即便是區塊頭必須儲存在內存之中也不會是什麼問題。

8. 簡化版支付確認

即便不用運行一個完整網路節點也有可能確認支付。用戶只需要有一份擁有工作證明的最長鏈的區塊頭拷貝—— 他可以通過查詢在線節點確認自己擁有的確實來自最長鏈—— 而後獲取Merkle 樹的樹枝節點,進而連接到這個區塊被打上時間戳時的交易。用戶並不能自己檢查交易,但,透過連接到鏈上的某個地方,他可以看到某個網路節點已經接受了這個交易,而此後加進來的區塊進一步確認了網路已經接受了此筆交易。

ZUtmrmdPnropshOMBHizRFDwDh0pncg5VGNnzWcI.jpeg

只要誠實節點仍在掌控網絡,如此這般,驗證即為可靠的。然而,如果網路被攻擊者控制的時候,驗證就沒那麼可靠了。雖然網路節點可以自行驗證交易記錄,但是,只要攻擊者能夠繼續控製網路的話,那麼簡化版驗證方式可能會被攻擊者偽造的交易記錄所欺騙。因應策略之一是,客戶端軟體要接受來自網路節點的警告。當網路節點發現無效區塊的時候,也就是發出警報,在用戶的軟體上彈出通知,告知用戶下載完整區塊,警告用戶確認交易一致性。那些有高頻收付發生的商家應該仍然希望運行屬於自己的完整節點,以確保更獨立的安全性和更快的交易確認。

9. 價值的組合與分割

儘管逐一處理硬幣是可能的,但為每分錢設置一個單獨的記錄是很笨拙的。為了允許價值的分割與合併,交易記錄包含多個輸入和輸出。一般情況下,要么是一個單獨的來自於一個相對大的之前的交易的輸入,要么是很多輸入來自於更小金額的組合;與此同時,最多有兩個輸出:一個是支付(指向收款方),如果必要的話,另外一個是找零(指向髮款方)。

rRreBWdF8I1swfs5QtBILVrI0guXumj1ulPkbKyu.jpeg

值得注意的是,“扇出”在這裡並不是問題—— 所謂“扇出”,就是指一筆交易依賴於數筆交易,而這些交易又依賴於更多筆交易。從來就沒有必要去提取任何一筆交易的完整獨立的歷史拷貝。

10. 隱私(Privacy)

傳統的銀行模型透過限制他人獲取交易者和可信任第三方的資訊而達成一定程度的隱私保護。出於對將所有交易記錄公開的需求否決了這種方法。但是,維持隱私可透過於另一處的切斷資訊流來實現—公鑰匿名。公眾可以看到某某向某某轉帳了一定的金額,但是,沒有任何資訊指向某個確定的人。這種程度的資訊發布有點像股市交易,只有時間和各個交易的金額被公佈,但是,沒有人知道交易雙方是誰。

FACNxW4jyufvrE53ONTept7HLlHzayQU9CwIg4eX.jpeg

還有另外一層防火牆。交易者應該針對每一筆交易啟用一對新的公私鑰,以便他人無法將這些交易追溯到同一個所有者。有些多輸入的交易依然難免被追溯,因為那些輸入必然會被識別出來自於同一個所有者。危險在於,如果一個公鑰的所有者被曝光之後,與之相關的所有其他交易都會被曝光。

11. 計算(Calculations)

假設一個場景,某個攻擊者正在試圖產生一個比誠實鏈更快的替代鏈。就算他成功了,也不能對系統做任意的修改,即,他不可能憑空製造出價值,也無法取得從未屬於他的錢。網路節點不會把一筆無效交易當作支付,而誠實節點也永遠不會接受一個包含這種支付的區塊。攻擊者最多只能修改屬於他自己的交易,進而試圖取回他已經花出去的錢。

誠實鍊和攻擊者之間的競爭可以用二項式隨機漫步來描述。成功事件是誠實鏈剛剛被添加了一個新的區塊,使得它的優勢增加了 1;而失敗事件是攻擊者的鏈剛剛被增加了一個新的區塊,使得誠實鏈的優勢減少了 1。

攻擊者能夠從落後局面追平的機率類似於賭徒破產問題。假設,一個拿著無限籌碼的賭徒,從虧空開始,允許他賭無限次,目標是填補上已有的虧空。我們能算出他最終能填補虧空的機率,也就是攻擊者能夠趕上誠實鏈的機率,如下:

dxwr3HPLYbHZisFnpwH6hIvaudm3FchUzRFXaD7m.jpeg

既然我們已經假定p>,q 既然攻擊者需要追趕的區塊數量越來越多,那麼其成功機率就會指數級下降。於贏面不利時,如果攻擊者沒有在起初就能幸運地向前猛跨一步,那麼他的勝率將在他進一步落後的同時消弭殆盡。

現在考慮一下一筆新交易的收款人需要等多久才能充分確定發款人不能更改這筆交易。我們假定發款人是個攻擊者,妄圖讓收款人在一段時間里相信他已經支付對付款項,隨後將這筆錢再轉回給自己。發生這種情況時,收款人當然會收到警告,但發款人希望那時木已成舟。

收款人產生了一對新的公私鑰,而後在簽署前不久將公鑰告知發款人。這樣可以防止一種情況:發款人提前透過連續運算去準備一條鏈上的區塊,並且只要有足夠的運氣就會足夠領先,直到那時再執行交易。一旦款項已被發出,那個不誠實的發款人開始秘密地在另一條平行鏈上開工,試圖在其中加入一個反向版本的交易。

收款人等到此筆交易被打包進區塊,並已經有z個區塊隨後被加入。他並不知道攻擊者的工作進展究竟如何,但是可以假定誠實區塊在每個區塊生成過程中耗費的平均時間;攻擊者的潛在進展符合泊松分佈,其期望值為:

Go4WNHNh1YtPsMqjI2XbNCMTnITJUIl9w8LqM6yj.jpeg

為了算出攻擊者依然可以趕上的機率,我們要把攻擊者需要追趕的區塊數目的帕松分佈機率密度,乘以在落後該區塊數目下能夠追上來的機率:

5O3ugdwP0uoNL0qOnvLbnUvNTXGMBmxJj4yS00y3.jpeg

轉換為C 語言程式…

XjwW5ZbFNIZCfiPFAnbg7b4iW4qp9A8g1LFKe2f2.jpeg

得到部分結果,我們可以看到機率隨著z的增加指數級下降:

452fZL5ude7CUuUz85STQEcvquwOCHxhZ3pEhKRc.jpeg

若是P 小於0.1%…

zfsBufXK54KjstagaZXrPOUREzaoQU7VPy9eYjjX.jpeg

12. 結論

我們提出了一個不必依賴信任的電子交易系統;起點是一個普通的使用數位簽章的硬幣框架開始,雖然它提供了健壯的所有權控制,卻無法避免雙重支付。為了解決這個問題,我們提出一個使用工作證明機制的點對點網路去記錄一個公開的交易記錄歷史,只要誠實節點能夠控制大多數CPU 算力,那麼攻擊者就僅從算力方面就不可能成功篡改系統。這個網路的健壯在於它的無結構的簡單。節點們可以在很少協同的情況下瞬間同時工作。它們甚至不需要被辨認,因為訊息的路徑並非取決於特定的終點;訊息只需要以最大努力為基本去傳播。節點來去自由,重新加入時,只需要接受工作證明鏈,作為它們離線之時所發生之一切的證明。它們透過它們的CPU 算力投票,透過不斷為鏈添加新的有效區塊、拒絕無效區塊,去表示它們對有效交易的接受與否。任何必要的規則和獎勵都可以透過這個共識機制來強制實施。

參考文獻(References)

  1. b-money Dai Wei (1998-11-01) http://www.weidai.com/bmoney.txt

  2. Design of a secure timestamping service with minimal trust requirements Henri Massias, Xavier Serret-Avila, Jean-Jacques Quisquater 20th Symposium on Information Theory in the Benelux (1999-05) http://citeseerx.ist.psu。 ?doi=10.1.1.13.6228

  3. How to time-stamp a digital document Stuart Haber, W.Scott Stornetta Journal of Cryptology (1991) https://doi.org/cwwxd4 DOI: 10.1007/bf00196791

  4. Improving the Efficiency and Reliability of Digital Time-Stamping Dave Bayer, Stuart Haber, W. Scott Stornetta Sequences II (1993) https://doi.org/bn4rpx DOI: 10.1007/978-1-4613-9323-8_24

  5. Secure names for bit-strings Stuart Haber, W. Scott Stornetta Proceedings of the 4th ACM conference on Computer and communications security – CCS ’97(1997) https://doi.org/dtnrf6 DOI: 10.1145/266420.

  6. Hashcash – A Denial of Service Counter-Measure Adam Back (2002-08-01) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.15.8

  7. Protocols for Public Key Cryptosystems Ralph C. Merkle 1980 IEEE Symposium on Security and Privacy (1980-04) https://doi.org/bmvbd6 DOI: 10.1109/sp.1980.10006

  8. An Introduction to Probability Theory and its Applications William Feller John Wiley & Sons (1957) https://archive.org/details/AnIntroductionToProbabilityTheoryAndItsApplicationsVolume1

Total
0
Shares
Related Posts