中本聰
satoshin@gmx.com
www.bitcoin.org

摘要:純點對點版本的電子現金將允許在線支付直接從一方發送到另一方,而無需通過金融機構。數字簽名提供了部分解決方案,但如果仍然需要可信的第三方來防止雙重支付,則主要好處就會喪失。我們提出了一種使用點對點網絡解決雙重支付問題的方法。網絡通過將交易散列到基於散列的工作量證明的持續鏈中來爲交易添加時間戳,形成一個記錄,如果不重新進行工作量證明,就無法更改。最長的鏈不僅可以證明所見證的事件順序,還可以證明它來自最大的 CPU 能力池。只要大多數 CPU 能力由不合作攻擊網絡的節點控制,它們就會生成最長的鏈並超越攻擊者。網絡本身需要最少的結構。消息以盡力而爲的方式廣播,節點可以隨意離開和重新加入網絡,接受最長的工作量證明鏈作爲它們離開時發生的事情的證明。
1. 簡介
互聯網上的商業幾乎完全依賴金融機構作爲受信任的第三方來處理電子支付。雖然該系統對大多數交易來說運行良好,但它仍然受到基於信任的模型固有弱點的影響。完全不可逆轉的交易實際上是不可能的,因爲金融機構無法避免調解糾紛。調解成本增加了交易成本,限制了最小實際交易規模並切斷了小額臨時交易的可能性,而且,失去對不可逆轉服務進行不可逆轉支付的能力,會帶來更廣泛的成本。隨着逆轉的可能性,對信任的需求也隨之擴大。商家必須警惕他們的客戶,向他們索要比他們原本需要的更多信息。一定比例的欺詐是不可避免的。這些成本和支付不確定性可以通過使用實物貨幣來避免,但沒有一種機制可以在沒有受信任方的情況下通過通信渠道進行支付。
我們需要的是一種基於加密證明而非信任的電子支付系統,允許任何兩個願意的當事方直接進行交易,而無需可信的第三方。計算上無法逆轉的交易將保護賣家免受欺詐,而常規託管機制可以輕鬆實施以保護買家。在本文中,我們提出了一種解決雙重支付問題的方法,即使用對等分佈式時間戳服務器生成按時間順序排列的交易的計算證明。只要誠實節點集體控制的 CPU 能力比任何合作的攻擊者節點組都多,系統就是安全的。
2. 交易
我們將電子貨幣定義爲一系列數字簽名。每個所有者通過對前一筆交易的哈希值和下一個所有者的公鑰進行數字簽名,並將這些簽名添加到貨幣的末尾,將貨幣轉讓給下一個所有者。收款人可以驗證簽名以驗證所有權鏈。

當然,問題在於收款人無法驗證其中一位所有者沒有對貨幣進行雙重支付。一種常見的解決方案是引入一個受信任的中央機構或鑄幣廠,檢查每筆交易是否存在雙重支付。每次交易後,貨幣必須返回鑄幣廠以發行新貨幣,並且只有直接從鑄幣廠發行的貨幣才值得信任不會被雙重支付。這種解決方案的問題在於整個貨幣體系的命運取決於運營鑄幣廠的公司,每筆交易都必須經過鑄幣廠,就像銀行一樣。我們需要一種方法讓收款人知道之前的所有者沒有簽署任何早期的交易。就我們的目的而言,最早的交易纔是最重要的,所以我們不關心後來的雙重支付嘗試。確認沒有交易的唯一方法是瞭解所有交易。在基於鑄幣廠的模型中,鑄幣廠瞭解所有交易並決定哪些交易先到達。爲了在沒有可信方的情況下實現這一點,交易必須公開宣佈 [1],我們需要一個系統讓參與者就收到交易的順序達成一致。收款人需要證明,在每次交易時,大多數節點都同意這是第一次收到的。
3.時間戳服務器
我們提出的解決方案始於一個時間戳服務器。時間戳服務器的工作原理是,對需要加時間戳的項目塊進行哈希處理,並廣泛發佈該哈希,例如在報紙或 Usenet 帖子中 [2-5]。時間戳證明數據在當時必須存在,這顯然是爲了進入哈希。每個時間戳在其哈希中包含前一個時間戳,形成一個鏈,每個附加時間戳都會強化其之前的時間戳。

4. 工作量證明
爲了在對等基礎上實現分佈式時間戳服務器,我們需要使用類似於 Adam Back 的 Hashcash [6] 的工作量證明系統,而不是報紙或 Usenet 帖子。工作量證明涉及掃描一個值,該值在散列時(例如使用 SHA-256)以多個零位開頭。所需的平均工作量與所需零位數呈指數關係,可以通過執行單個散列來驗證。
對於我們的時間戳網絡,我們通過增加塊中的隨機數來實現工作量證明,直到找到一個值,使塊的哈希值爲所需的零位。一旦花費了 CPU 的努力使其滿足工作量證明,就無法更改該塊,除非重新完成工作。由於後續塊鏈接在它之後,更改塊的工作將包括重新執行它之後的所有塊。

工作量證明還解決了確定多數決策代表權的問題。如果多數是基於一個 IP 地址一票,那麼任何能夠分配多個 IP 的人都可能推翻這一原則。工作量證明本質上是一 CPU 一票。多數決策由最長的鏈表示,該鏈投入了最多的工作量證明工作。如果大多數 CPU 能力由誠實節點控制,則誠實鏈將增長最快並超過任何競爭鏈。要修改過去的區塊,攻擊者必須重新進行該區塊及其之後的所有區塊的工作量證明,然後趕上並超越誠實節點的工作量。我們稍後將展示,隨着後續區塊的添加,較慢攻擊者趕上來的概率呈指數下降。
爲了補償硬件速度的提高和對運行節點的興趣隨時間的變化,工作量證明難度由移動平均值決定,該移動平均值針對的是每小時平均區塊數。如果區塊生成速度過快,難度就會增加。
5. 網絡
運行網絡的步驟如下:
1)新的交易被廣播到所有節點。
2)每個節點將新的交易收集到一個區塊中。
3)每個節點都致力於爲其區塊尋找一個困難的工作量證明。
4)當一個節點找到工作量證明時,它會將該區塊廣播給所有節點。
5)僅當塊中的所有交易均有效且尚未使用時,節點纔會接受該塊。
6)節點通過創建鏈中的下一個塊來表達對該塊的接受,並使用已接受塊的哈希值作爲前一個哈希值。
節點始終認爲最長的鏈是正確的,並將繼續努力延長它。如果兩個節點同時廣播下一個區塊的不同版本,則某些節點可能會先收到其中一個或另一個。在這種情況下,它們將處理收到的第一個分支,但會保存另一個分支以防它變得更長。當找到下一個工作量證明並且一個分支變得更長時,平局將被打破;正在處理另一個分支的節點將切換到更長的分支。
新的交易廣播不一定需要到達所有節點。只要它們到達許多節點,它們很快就會進入一個區塊。區塊廣播也能容忍丟失的消息。如果一個節點沒有收到一個區塊,它會在收到下一個區塊並意識到自己錯過了一個區塊時請求該區塊。
6. 激勵
按照慣例,區塊中的第一個交易是啓動由區塊創建者擁有的新幣的特殊交易。這增加了節點支持網絡的激勵,並提供了一種最初將幣分發到流通中的方法,因爲沒有中央機構來發行它們。穩定增加一定數量的新幣類似於金礦礦工花費資源將黃金添加到流通中。在我們的例子中,消耗的是 CPU 時間和電力。
激勵機制也可以通過交易費來提供資金。如果交易的輸出值小於其輸入值,則差額就是交易費,該費用將添加到包含該交易的區塊的激勵值中。一旦預定數量的貨幣進入流通,激勵機制就可以完全轉換爲交易費,並且完全不受通貨膨脹的影響。
這種激勵措施可能有助於鼓勵節點保持誠實。如果一個貪婪的攻擊者能夠聚集比所有誠實節點更多的 CPU 算力,那麼他就必須在使用它來欺詐他人(竊取他的付款)和使用它來生成新幣之間做出選擇。他應該發現遵守規則比破壞系統和他自己財富的有效性更有利可圖,這些規則對他有利,因爲他可以獲得比其他所有人加起來更多的新幣。
7. 回收磁盤空間
一旦硬幣中的最新交易被埋入足夠多的區塊中,就可以丟棄之前已使用的交易以節省磁盤空間。爲了在不破壞區塊哈希的情況下實現這一點,交易被散列在 Merkle 樹 [7][2][5] 中,只有根包含在區塊哈希中。然後可以通過砍掉樹的分支來壓縮舊區塊。內部哈希不需要存儲。

沒有交易的區塊頭大約有 80 字節。如果我們假設每 10 分鐘生成一個區塊,那麼每年 80 字節 6 24 * 365 = 4.2MB。截至 2008 年,計算機系統通常配備 2GB RAM,而摩爾定律預測當前每年的 RAM 增長量爲 1.2GB,因此即使必須將區塊頭保存在內存中,存儲也不應該成爲問題。
8. 簡化付款驗證
無需運行完整的網絡節點即可驗證付款。用戶只需保留最長工作量證明鏈的區塊頭副本(他可以通過查詢網絡節點獲得該副本,直到他確信自己擁有最長的鏈),並獲得將交易與其時間戳所在的區塊鏈接起來的 Merkle 分支。他無法親自檢查交易,但通過將交易鏈接到鏈中的某個位置,他可以看到網絡節點已接受該交易,之後添加的區塊進一步確認網絡已接受該交易。

因此,只要誠實的節點控制着網絡,驗證就是可靠的,但如果網絡被攻擊者控制,驗證就會更容易受到攻擊。雖然網絡節點可以自己驗證交易,但只要攻擊者能夠繼續控制網絡,簡化方法就可能被攻擊者僞造的交易所欺騙。防止這種情況的一種策略是,當網絡節點檢測到無效塊時,接受來自網絡節點的警報,提示用戶的軟件下載完整的塊並提醒交易以確認不一致。經常收到付款的企業可能仍希望運行自己的節點,以獲得更獨立的安全性和更快的驗證。
9. 合併和分割價值
儘管可以單獨處理硬幣,但爲轉賬中的每一分錢進行單獨的交易會很麻煩。爲了允許價值分割和組合,交易包含多個輸入和輸出。通常,要麼有來自較大先前交易的單個輸入,要麼有多個組合較小金額的輸入,最多有兩個輸出:一個用於付款,另一個將零錢(如果有)退還給發送者。

需要注意的是,扇出(即一筆交易依賴於幾筆交易,而這些交易又依賴於更多交易)在這裏不是問題。永遠不需要提取交易歷史的完整獨立副本。
10. 隱私
傳統銀行模式通過限制信息訪問權,只允許相關方和受信任的第三方訪問,從而實現一定程度的隱私。由於必須公開宣佈所有交易,因此無法採用這種方法,但仍然可以通過在其他地方切斷信息流來維護隱私:保持公鑰匿名。公衆可以看到某人向其他人發送了一筆金額,但看不到將交易與任何人聯繫起來的信息。這類似於證券交易所發佈的信息水平,其中公開了單個交易的時間和規模,即“交易記錄”,但不告訴交易方是誰。

作爲額外的防火牆,每筆交易都應使用一對新密鑰,以防止它們被鏈接到同一個所有者。對於多輸入交易,某些鏈接仍然是不可避免的,這必然會暴露出它們的輸入屬於同一個所有者。風險在於,如果密鑰的所有者被暴露,鏈接可能會暴露屬於同一所有者的其他交易。
11. 計算
我們考慮攻擊者試圖比誠實鏈更快地生成替代鏈的情況。即使這樣做了,也不會使系統受到任意更改,例如憑空創造價值或拿走不屬於攻擊者的錢。節點不會接受無效交易作爲付款,誠實節點永遠不會接受包含它們的塊。攻擊者只能嘗試更改自己的一筆交易以收回他最近花掉的錢。誠實鏈和攻擊者鏈之間的競爭可以描述爲二項式隨機遊走。成功事件是誠實鏈延長一個區塊,使其領先優勢增加 +1,失敗事件是攻擊者的鏈延長一個區塊,使差距減少 -1。
攻擊者彌補給定赤字的概率類似於賭徒破產問題。假設一個擁有無限信用的賭徒從赤字開始,並可能進行無數次嘗試以試圖達到盈虧平衡。我們可以計算他達到盈虧平衡的概率,或者攻擊者趕上誠實鏈的概率,如下所示 [8]:
p = 誠實節點找到下一個區塊的概率
q = 攻擊者找到下一個區塊的概率
qz = 攻擊者從 z 個區塊後面追上來的概率
qz= { 1 如果 p≤q
(q/ p)^z 如果 p>q}
假設 p > q,隨着攻擊者需要追趕的區塊數量的增加,概率會呈指數下降。如果攻擊者的勝算很小,如果他沒有在早期幸運地向前衝刺,那麼隨着他落後得越來越遠,他獲勝的機會就會變得微乎其微。
現在,我們來考慮一下新交易的接收者需要等待多長時間才能充分確定發送者無法更改交易。我們假設發送者是一個攻擊者,他想讓接收者相信他已經付款給他一段時間,然後在一段時間後將其轉換爲還給自己。當這種情況發生時,接收者會收到警報,但發送者希望爲時已晚。
接收者生成一個新的密鑰對,並在簽名前不久將公鑰交給發送者。這可以防止發送者提前準備區塊鏈,通過不斷對其進行處理,直到他足夠幸運地走得足夠遠,然後在那一刻執行交易。一旦交易被髮送,不誠實的發送者就會開始祕密地處理包含其交易替代版本的並行鏈。
接收者等待交易被添加到一個區塊中,並且在其後鏈接了 z 個區塊。他不知道攻擊者的確切進度,但假設誠實區塊花費了每個區塊的平均預期時間,則攻擊者的潛在進度將呈泊松分佈,其預期值爲:

轉換爲 C 代碼...

運行一些結果,我們可以看到概率隨着 z 呈指數下降。
q=0.1
z=0 P=1.0000000
1 點
共2個P=0.0509779
共 0頁0條記錄
共 0頁0條記錄
共5頁:
共 0頁0條記錄
共 7 條記錄
共8頁:
共9頁:
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
共 5 條記錄
共 10 頁
共 15 頁
共 20 頁
共 0頁0條記錄
共 30 頁
共 35 頁
共 40頁
共 45 頁
共 50 頁
求解 P 小於 0.1%...
磷<0.001
q=0.10z=5
q=0.15z=8
q=0.20 z=11
q=0.25z=15
q=0.30 z=24
q=0.35z=41
q=0.40 z=89
q=0.45 z=340
12. 結論
我們提出了一種不依賴信任的電子交易系統。我們從通常的數字簽名貨幣框架開始,這種框架可以對所有權進行強有力的控制,但如果沒有防止雙重支付的方法,這種框架就是不完整的。爲了解決這個問題,我們提出了一個點對點網絡,使用工作量證明來記錄交易的公開歷史,如果誠實節點控制了大多數 CPU 能力,攻擊者很快就會無法改變這些歷史。該網絡以其非結構化的簡單性而強大。節點幾乎不需要協調就可以同時工作。它們不需要被識別,因爲消息不會被路由到任何特定位置,只需要盡最大努力傳遞。節點可以隨意離開和重新加入網絡,接受工作量證明鏈作爲它們離開時發生的事情的證明。它們用自己的 CPU 能力投票,通過努力擴展有效區塊來表達對有效區塊的接受,通過拒絕處理無效區塊來拒絕無效區塊。任何需要的規則和激勵措施都可以通過這種共識機制來執行。
參考
[1] W. Dai,《b-money》,http://www.weidai.com/bmoney.txt,1998年。
[2] H. Massias、X.S. Avila 和 J.-J. Quisquater,“設計一種安全時間戳服務,儘量減少
信任要求”,1999 年 5 月,在比荷盧經濟聯盟舉辦的第 20 屆信息理論研討會上。
[3] S. Haber、W.S. Stornetta,《如何給數字文檔加蓋時間戳》,《密碼學雜誌》,第 3 卷,第 1 期,第 1979-1985 頁。
2,第99-111頁,1991年。
[4] D. Bayer、S. Haber、W.S. Stornetta,“提高數字時間戳的效率和可靠性”,
在序列 II:通信、安全和計算機科學方法中,第 329-334 頁,1993 年。
[5] S. Haber、W.S. Stornetta,《位串的安全名稱》,第四屆 ACM 會議論文集
《計算機和通信安全》,第 28-35 頁,1997 年 4 月。
[6] A. Back,“Hashcash——一種拒絕服務對策”,
http://www.hashcash.org/papers/hashcash.pdf,2002年。
[7] R.C. Merkle,“公鑰密碼系統協議”,1980 年安全與保密研討會論文集
隱私,IEEE 計算機協會,第 122-133 頁,1980 年 4 月。
[8] W.Feller,《概率論和應用導論》,1957 年。