比特幣白皮書 Bitcoin: A Peer-to-Peer Electronic Cash System

摘要

純粹的點對點電子現金將允許在線支付直接從一方發送到另一方,而無需通過金融機構。數字簽名提供了部分解決方案,但是如果仍然需要可信的第三方來防止重複開銷,那麼主要的好處就喪失了。我們提出了一個使用點對點網絡解決雙花問題的方案。
網絡時間戳通過將事務散列到基於散列的工作證明的持續鏈中,形成不重新進行工作證明就不能更改的記錄。最長的鏈不僅可以作爲所見證的事件序列的證據,而且可以證明它來自最大的CPU功率池。只要大部分CPU能量是由不合作攻擊網絡的節點控制的,它們就會產生最長的鏈並超過攻擊者。網絡本身需要最小的結構。消息以最佳方式廣播,節點可以隨意離開和重新加入網絡,接受最長的工作證明鏈作爲它們離開時發生的事情的證據。

一。介紹

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

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

二。交易

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

問題是,這個鏈條的接收者並不能確定,之前的擁有者沒有雙花(double-spend)這個硬幣。通常的解決辦法是引入一箇中央信任機構,或者鑄造廠,它來驗證每一個交易都沒有雙花問題。每次交易過後,每個硬幣都必須被回收到鑄造廠重新鑄造,只有從鑄造廠發出的硬幣才被認爲是沒有雙花的。這種解決方案的問題在於,整個貨幣系統的命運完全決定於鑄造廠擁有者的手中,因爲所有的交易都需要經過他們,就像銀行一樣。

我們需要找到一個辦法,讓硬幣的接收者完全可以信任:他收到的這個硬幣,之前的擁有者們一定沒有拿這個硬幣進行過其他的交易。對我們來說,最早發生的交易才能算數,因此那些晚一些的交易是不被承認的。接收者要確認是否有其他的他不知情的交易存在,唯一的辦法就是他需要知道這個硬幣的所有交易。在鑄造廠模型中,鑄造廠掌握所有交易信息,他們決定了哪一個交易是先發生的。要想不依賴中心機構達到此目的,所有交易必須是公開聲明的,並且需要一個系統,讓所有的參與者對唯一的一條交易鏈認同。硬幣的接收者需要知道,他所接收到的這個鏈條中每一個交易,都是大家所認可的最早發生的交易。

3. 時間戳服務器

我們的方案從一個時間戳服務器開始。時間戳服務器的工作是計算一個被打上時間戳區塊的hash值,並將該值廣泛傳播,例如發表到報紙上,或者Usenet帖子中。時間戳證明了這個數字區塊在當時肯定是存在的,因爲計算了其hash值。所有的時間戳將其之前的時間戳都包含在hash值中,按照這個規則,形成一個鏈條,鏈條每新增一個時間戳,都是之前時間戳的加強版,如圖3-1。

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

在實現基於點對點的分佈式時間戳服務器的時候,我們不能使用報紙或者Usenet帖子,而使用一種工作證明系統,類似 Adam Back's Hashcash [6]。這個工作證明的工作方式是掃描一個值,其hash值(例如SHA-256)是由若干個0 bit開頭的。這個證明的工作量和開頭0 bit的要求數量成指數關係,而驗證它只需要做一次hash計算。

在時間戳網絡中,我們通過不停地增加區塊中一個數值來進行POW,直到滿足了要求的0 bit的數量爲止。一旦這個要求被滿足,那麼這個區塊即不能被篡改,除非重新進行一遍工作證明。由於鏈條中後續的區塊都是根據當前區塊計算而來,因此要改動當前區塊,一定得重新計算後續所有的區塊。

 

這種工作證明同時也使貨幣鏈條代表了多數人的決定。如果多數投票是建立在一個IP一張票的方案上,那麼IP資源的持有者就會擁有決定權。工作證明本質上是一個CPU一張選票的。最長的鏈條代表了大多數人的意見,因爲最長的鏈條意味着最多的工作證明投入。如果大多數CPU都是忠實的節點,那麼忠實的鏈條就會增長最快,打敗其他競爭的鏈條。要想更改鏈條中過去的一個區塊,攻擊者需要重新對該區塊以及其後面所有區塊做工作證明,這樣才能趕上忠實鏈條。後面我們將會展示,一個落後的攻擊者趕上忠實鏈條的可能性,會隨着鏈條長度的增長,成指數遞減。

爲了補償計算機硬件計算速度的增加,以及人們對運行服務器節點興趣熱度的變化,工作證明的難度會進行調節,以保證每小時產生的區塊數量和預期值近似。如果區塊數量過多,那麼就增加POW的難度。

5. 服務器網絡

運行服務器網絡按照下面幾個步驟進行:

(1) 新的交易被廣播到所有的節點;
(2) 每一個節點都將新的交易加入一個區塊中;
(3) 每一個節點都努力尋找該區塊的工作證明;
(4) 當一個節點找到工作證明後,它將該區塊廣播到所有其他節點;
(5) 其他節點對接收到的區塊進行驗證,確定其中的所有交易都是合法的,並且沒有被花費;驗證通過後,接受該區塊;
(6) 接受該區塊之後,節點們將這個區塊加入到鏈條的尾部,將該區塊的hash值作爲作爲Prev Hash(如圖4-1)。

節點們都認爲最長的鏈條纔是正確的鏈條,因此它們都會在該鏈條上面工作。如果兩個節點同時傳播一個交易的兩個不同版本區塊時,這兩種區塊都可能被一部分節點作爲最先到達的區塊而被接受。此時,節點們會在先到達的鏈條上工作,而將後到達的鏈條保存起來以免後者後來成爲最長鏈條。這種局面會在下一個工作證明找到時被打破,因爲那時有一個鏈條將會勝出;那些工作在另一個鏈條的節點就會轉移到最長鏈條工作。

新的消息並不一定要被廣播到所有的節點。只要它達到足夠數量的節點,那麼該消息很快就會形成區塊。區塊的廣播也允許部分丟失;如果一個節點沒有收到一個區塊的廣播消息,當下一個區塊到來時該節點便會知道他之前有過缺失,從而請求補償。

6.激勵

按照約定,一個鏈條的第一筆交易是一類特別的交易,其創造了一個新的硬幣,該硬幣被鏈條第一個區塊的創建者擁有。這個約定,對節點在服務器網絡中工作產生了激勵,同時也解決了新硬幣發佈方法,因爲並沒有一箇中心機構來發布更多的硬幣。硬幣數量的穩定增長,意味着掘金者向系統中添加更多的掘進資源。具體來說,是指CPU時間及其消耗的電力。

另一方面,交易手續費也可以產生激勵效果。如果一個交易的輸出值小於其輸入值,那這個差值就是交易手續費,也就是包含該交易區塊的激勵值。當某一天,硬幣總量不再發生變化時,那麼系統的激勵手段將會完全變成交易手續費,並避免通貨膨脹的影響。

激勵手段也可以估計節點們保持忠實。當一個貪婪的攻擊者有能力掌握大多數的CPU資源時,他需要決定是用這些CPU資源來防止他人騙取他的交易,還是用其產生挖掘更多的硬幣。攻擊者會發現,按照合法規則來出牌他可以有更多的盈利;這些規則決定,與其推翻當前系統,還不如挖掘更多新的硬幣來的划算。

7. 回收硬盤空間

當一個鏈條中的區塊數量足夠多時,之前的交易可以被捨棄掉,以節約硬盤資源。爲了在不打破區塊hash值得前提下完成該功能,我們將所有交易都hash到一個 Merkle Tree [7][2][5] 中,只有樹的根節點纔會被放入當前區塊的hash。老的區塊作爲子節點被填入這棵樹中;樹的內部節點不需要存儲。

 

一個沒有交易的區塊頭大小爲80 bytes。假設每10分鐘產生一個區塊,那麼一年可以產生 80bytes624*365=4.2MB 大小的數據。2008年,個人計算機內存大小主流爲2GB,根據摩爾定律每年按照1.2GB速度增長,可以看到,即使將區塊頭直接放在內存中,也不會是個問題。

8.簡化的支付驗證

並不需要運行一個完整節點來驗證一次交易。一個用戶只需要持有一份最長鏈條區塊頭的備份即可;有了這個備份,他可以詢問其他節點,直到他被其他節點確信是最長鏈條;同時也可以用這個備份獲取Merkle Tree上該交易對應區塊的鏈接。用戶無法自己確認這個交易,但是通過鏈條上的一環,用戶可以看到網絡節點接受了這個交易。

 

只要整個網絡是由忠實節點做主導,這種驗證就是可靠的;但是當一個攻擊者擁有過量資源時,其會變得很危險。因爲網絡中的節點可以驗證支付,那麼攻擊者就可以隨意捏造一個交易,並使用其大量節點資源對該交易進行驗證。一種應對方案是讓用戶接受來自節點的報警信息,當節點發現了非法區塊時,其向用戶報警並促使用戶下載完整的區塊以及被報警的交易,已確定不一致性。建議那些經常被支付的公司建立一些自己的節點,以保證更多的安全性和更快速的驗證。

9. 整合和分割

雖然可以對每個硬幣分別處理,但是爲每一分錢都創建一個新的交易是不明智的做法。爲了使交易金額可大可小,交易包含了多個輸入和輸出。通常,輸入要麼是一個金額較大的交易值,要麼是若干個金額較小的交易值;輸出最多有兩個:一個是接收金額,另一個是找零,找零將會退回到付款者。

 

需要指出的是,這種扇出並不是什麼問題:一個交易依賴其他多個交易,而它們又依賴更多交易。完全沒有必要將一個交易的所有歷史都抽取出來。

10. 隱私

傳統的銀行模型通過對交易雙方信息的保護,達到了一定程度的隱私效果。但是在本系統中,所有的交易都需要被公開,因此這種傳統方法不再奏效。但是,我們通過在另一個地方切斷信息流的方法來達到目的——保持公鑰的匿名。公衆可以看到某個人將一定數量的硬幣發送給了另一個人,但是他們完全不知道這兩個人究竟是誰。這有點像股票交易,交易時間和金額、以及“tape”都是公開的,但是交易雙方身份無法知道。

 

爲構造額外的一座防火牆,每次交易都應該生成新的密鑰對,以防止多筆交易都聯繫到相同的個體。但是,由於多重輸入交易的存在,這種聯繫是不可避免的。因爲多重輸入意味着,這些所有輸入都是來自同一個用戶。而當這些輸入某一個key對應的用戶被曝光之後,其牽連的其他很多交易,也會被曝光出來。

11. 計算

我們假設該場景,一個攻擊者試圖產生比當前忠實鏈條更長的鏈條。即使這個目的達成,也並不意味着系統可以被隨意篡改,比如隨便製造數值或者隨意從其他賬戶中提取硬幣。節點不會接受一個非法交易當做付款;忠實節點永遠不會接受任何包含非法交易的區塊。一個攻擊者能做的,只是改動他自己最近的一次交易,拿回他所花掉的硬幣。

忠實鏈條和攻擊者鏈條這件的比賽可以被看做是 Binomial Random Walk。成功的事件是忠實鏈條完成一次工作證明,將其鏈條長度加1,相對攻擊者鏈條的領先長度也+1;失敗的事件是攻擊者鏈條加1,其相對忠實鏈條的長度差-1.

在一個確定的長度差下,計算攻擊者追趕上忠實鏈條的概率,和Gambler's Ruin(賭徒破產問題)問題相似。假設一個賭徒揹負一定數量的赤字,其貸款金額無限,並且嘗試次數無限。我們來計算其達到收支平衡的概率,也就是攻擊者鏈條趕上忠實鏈條的概率:

p=忠實鏈條發現下一個區塊的概率
q=攻擊者鏈條發現下一個區塊的概率
qz=攻擊者趕上z個區塊的概率

 

我們假設p>q,那麼攻擊者趕上的概率會隨着區塊的增加呈指數下降。因爲概率本來就低,因此攻擊者的機會隨着他落後的越來越多而變得更加渺茫。
接下來,我們來計算一個交易的接收者需要等多長時間,才能保證付款者已經無法對此次交易進行篡改了。假設付款者是一個攻擊者,他希望接收者相信他已經付款一段時間了,然後修改交易將硬幣返回到自己手中。接收者會收到警告,但是付款者希望此時已經太晚。
接收者產生一對新的密鑰對,並在簽名交易之前一會將公鑰交給付款者,這可以防止付款者提前準備好一個區塊鏈條。當交易被髮出時,付款者開始生產一個和忠實鏈條平行的非法鏈條,其包含他篡改後的交易區塊。
接收者保持等待,直到此次交易被添加到鏈條中,並且z個新的後續區塊也被添加進來。他不知道攻擊者此時已經完成到什麼程度,但是假設忠實區塊按照平均速度被添加,那麼攻擊者的可能進度會是一個Poisson分佈,並且期望值爲:

 

爲了計算攻擊者當前趕上的概率,我們將其可能達到的每一種程度的Poisson密度和從該程度開始能夠在當前趕超的概率相乘:

 

重寫式子以避免出現無限級數:

 

用C代碼實現:

 

 

運行一些測試用例,我們會發現,最終的概率會隨着z值的增長呈指數下降:

 

爲使概率在0.1%以下,下面是z的取值:

 

11-7

12.結論

我們介紹了一種不基於信任的電子交易系統。我們從一個使用電子簽名的硬幣框架開始,該框架讓硬幣擁有者具有絕對的控制權,但是該框架不能夠解決硬幣的雙花問題。爲解決雙花問題,我們介紹一種點對點的網絡,該網絡使用工作證明來記錄一系列公開的交易信息;只要網絡中忠實節點的CPU運算能力大於攻擊者節點的運算能力,那麼這些交易就無法被攻擊者所更改。這個網絡結構簡單,有很強的魯棒性。所有節點可以同時工作,而不需要過多的協調。節點們不需要被標記出來,因爲網絡中的消息並不會定點發送,它們只會儘量散步到多的節點即可。節點可以隨時離開和加入網絡,通過工作證明,它們可以輕易知道在它們離開時發生了哪些交易。通過接受合法的區塊,以及拒絕不合法的區塊,每個節點完成了根據CPU資源的投票。任何必要的規則或者激勵都可以在這個共識規則中執行。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章