Bitcoin: A Peer-to-Peer Electronic Cash System-翻譯

Bitcoin:一個P2P電子收銀系統

 

一個純粹的電子收銀系統是可以不通過銀行機構來進行端到端直接交易的。數字簽名可以解決大部分問題,但是假如第三方機構無法避免雙重支付(譯者注:買方在支付之後還沒等賣方確認,拿這筆錢再支付別的交易)的話,這其實是沒有優勢的。我們設計了一種可以解決雙重支付問題的P2P網絡,這個網絡通過具備工作量證明(POW)哈希的執行鏈條來給交易打標籤,這個記錄除非重新投入巨大的工作量(POW),否則是無法被改變的。最長鏈條不僅作爲交易先後順序的見證,而且是CPU計算量的一個證明。只要保證主要的CPU計算不是攻擊者發起的,那麼他們可以產生最長的鏈條並使攻擊者無法逾越。該網絡本身實現一個最小結構,消息可以被有效廣播,計算節點可以隨進隨出,也可以獲取到這些節點不在的時候產生的最長工作量鏈。

 

1、Introduction 概述

電子商務目前強烈依賴銀行機構來進行電子支付。這個系統對大多數交易是沒問題的,但是在信任問題上仍然欠缺。因爲銀行機構無法避免一些爭執,支付回退是在所難免的。解決爭執增加了交易的成本,因此需要限制實際的交易規模並且阻止小額交易的產生。不可逆交易和不可逆服務是以失去這些能力爲代價的。如果要實現回退,我們需要信用的傳遞。商戶不再需要堤防他們的客戶,也不需要騷擾客戶來獲取他們想要的信息。當然這無法避免有騙子存在可能性。人與人之間的現金交易可以避免這個問題,但是網絡交易卻沒有一個信用機制來保證。

我們需要一個具備加密能力的電子支付系統來實現這個信任機制,允許任意兩個交易參與者不通過第三方信用機構直接進行交易。通過回滾一些不合法交易來保護賣方,通過常規的第三方託管來保護買方。本文實現了一種基於分佈式P2P時間戳服務器的工作量證明來保證交易先後順序的方案,用來解決重複交易的問題。只要誠實的節點比攻擊節點具有更多的CPU工作量,那麼這個系統就是安全的。

2、Transcations 交易

我們定義了一種像數字簽名鏈條的電子貨幣,每一個交易者通過貨幣底部的數字簽名將貨幣轉移給下一個,這個簽名包含了前一個交易的哈希以及下一個用戶的公鑰。收款方可以通過驗籤來確認當前鏈的所有者。

問題顯然是收款方無法驗證有沒有存在貨幣被重複使用的情況。普遍的做法是引入一個授權中心或者鑄幣局,爲每一筆交易檢查雙重支付的問題。每一筆交易之後,貨幣必須回收到鑄幣機構產生一個新的貨幣,只有來自鑄幣機構的貨幣才被信任,以此來避免重複支付。這個方案的最大問題是,整個貨幣系統依賴鑄幣機構,每一筆交易都通過他,反而更像銀行。

我們需要提供一種辦法,讓收款方知道前一個支付者沒有對更之前的交易加過簽名。因此,我們認爲越早的交易越重要,而後來的重複交易被忽略。確認交易是否缺失的唯一辦法是知道所有交易。在基於鑄幣機構的模型中,鑄幣機構知道所有的交易,並能決定哪個是最先發起的。爲了不通過信任機構來完成這個過程,交易必須是所有人可知的,並且需要提供一個參與者收到並且認可的單一有序的歷史記錄。收款人需要證明每一筆交易的時間點,被大部分節點認可爲最新收到的。

3、Timestamp Server 時間戳服務器

方案先從時間戳服務器開始,時間戳服務器爲一些被打時間戳的單元塊做哈希,並將這個哈希像報紙一樣傳播出去。時間戳證明了數據在當前時間點出現過,每一個時間戳中也包含了前一個來自鏈條節點時間戳的哈希,如此往復。


4、Proof-of-Work(POW) 工作量證明

爲了基於P2P實現一個分佈式的時間戳服務器,我們需要一個跟Adam Back's Hashcash類似的工作量證明系統。工作量證明需要對數據進行哈希掃描,比如採用SHA-256,哈希值以0開頭。工作量取決於0的個數,並可以通過單次哈希來進行驗證。

對於我們的時間戳網絡,我們通過在塊裏面增加一個遞增的nonce,不斷進行哈希,直到發現一個哈希值0的個數跟要求的相同。一旦cpu計算滿足了工作量的證明,那麼這個塊就不能沒改變了,除非重做。後來的塊在此塊之後建鏈,要想更改當前塊,必須將後面的所有塊都重新計算。


工作量證明也解決了少數服從多數的判定問題。如果投票基於單ip單票制,很容易被人申請很多ip破解。工作量證明本質上依靠單CPU單票制。多數人投票的最長鏈,投入了最大的工作量。如果大多數CPU工作量被誠實的節點控制,誠實的鏈條會增長很快,從而超過其他的鏈。爲了修改過去的塊,攻擊者必須重做當前塊以及之後的所有塊,並趕上並超過誠實節點的工作。後面我們會展示一種當子塊添加時,慢的攻擊者趕超的可能性以指數級方式減少。

隨着時間的推移,爲了彌補硬件的發展和執行節點的增加帶來的計算速度,工作量證明難度取決於每個小時產生的區塊的平均個數。如果產生太快,則增加其難度。

5、NetWork 網絡

按照如下的步驟運行:

1) 新的交易被廣播到所有節點。

2) 每個節點收集新的交易到塊中。

3) 每個節點爲當前塊發現一個工作量證明。

4) 當一個節點發現一個工作量證明,則將這個工作量證明廣播到所有節點。

5) 如果一個塊包含的所有交易都是正常的,並且還沒有出現過,則其他節點接受這個塊。

6) 所有節點通過在下一個塊中使用當前塊的哈希值來表示對當前塊的認可。

節點通常將最長的鏈作爲正確的一個,並在此基礎上進行擴展。如果兩個節點同時廣播了不通版本的下一個塊,有些節點先收到其中的一個或另一個,在這種情況下,節點按最先收到的一個進行工作,同時保存另外一個以備其可能變成更長鏈。在更下一個節點通過工作量證明產生後,分叉就會被修正,在錯誤分支上的節點會選擇更長的一個。

新的交易無需廣播給所有節點,只要他們到達了足夠多的節點,他們不久之後就會被加入到塊中。塊的廣播也是容忍消息丟失的。如果一個節點沒有收到塊,他會在接收到下一個的時候發現丟失的那個,併發起請求。

6、Incentive 激勵機制

按照慣例,塊中的第一筆交易是一個特別的交易,塊的創建者開始擁有新的貨幣。這增加了節點們對網絡支撐的動力,同時由於沒有一箇中心授權機構來生成貨幣,這也提供了一種方式生成貨幣參與到循環中去。這種穩定並持續不斷產生新的貨幣的方式很像曠工花費資源挖掘黃金的過程。在我們的例子中,CPU時間和電費作爲一種花費。

激勵也可以以手續費的方式實現,如果交易的輸出值少於輸入值,差值作爲交易的費用來激勵記錄當前塊的節點。一旦既定數量的貨幣參與到循環中區,激勵完全變成交易奮勇,並且沒有通貨膨脹。

激勵機制也鼓勵了節點保持誠實,如果一個貪婪的攻擊者擁有比所有誠實者更多的CPU,他必須在從被騙者那裏偷回他的付款和產生新的貨幣之間做權衡。他會發現按照規則行事更有利可圖,這些規則提供給他比通過其他方式,比如破壞系統和財富合法性等獲得更多的貨幣。

7、Reclaiming Disk Space 回收磁盤空間

一旦最新的交易中,一個貨幣被散列在足夠多的塊中,在他之前花費的交易可以丟棄以節省磁盤空間。爲了不破壞塊的哈希值,交易被哈希到Merkle Tree上,只有根節點包含在塊哈希中。之前的塊可以通過樹枝的簡化來進行壓縮。內部的哈希值不需要被保存。


不包含交易的塊頭部大概80字節,我們假設每十分鐘產生一個,一年則爲80 bytes * 6 * 24 * 365 = 4.2MB,按照2008年一般計算機系統有2G內存的情況,以及摩爾定律按照1.2G/年的增長速度,即使塊的頭部必須保存在內存中,存儲都不是問題。

8、Simplified Payment Verification 簡化支付確認過程

不需要所有節點工作也可以確認支付。用戶只需要保存最長工作量鏈上塊的頭部副本,這個確定的副本可以通過節點拿到,並且可以獲得將該交易關聯到塊上的Merkle分支。他不能自己檢查自己的交易,而是通過連接到鏈上的某個位置,他可以看到網絡節點已經接受這筆交易,並且在塊添加之後,再次確認網絡已經接受這筆交易。


如此,只要誠實的節點控制網絡,支付確認就是可信的,如果被攻擊者控制網絡,那就變得脆弱了。由於網絡節點可以自己確認交易,如果攻擊者能夠持續的控制網絡,他可以簡單地捏造交易來進行欺騙。一個防禦辦法是,當網絡節點發現不合法的塊,便接受來自網絡節點的告警,並讓用戶的軟件下載全部的塊並提醒交易的不一致。經常收到付款的機構可能更希望使用它們自己的節點來提升安全性和加快確認過程。

9、Combining and Splitting Value 合併和拆分數據

儘管可以單獨處理貨幣,在交易中分別轉移每一分錢顯得有些笨拙。爲了能夠進行合併和拆分,交易是複合輸入和輸出的。一般情況下,會出現一個來自之前的大額交易的單個輸入或者多個小金額合併成的輸入,並且有兩個輸出:一個是支付,一個是找零,零錢回退給發送者。


扇出在此處不是問題,他依靠一系列的交易,這些交易可能依賴更多的交易。不需要提取一個完整的關於交易歷史的副本。

10、 Privacy 隱私

傳統的銀行模型通過限制相關方和授信第三方的訪問來達到一定水平的隱私。公開的交易是無法採用這種方式的,但是隱私仍然可以通過匿名公鑰的方式將隱私信息存放在另外的地方。公衆可以看到有人發送了一定金額給另外的人,但是沒有將該交易關聯到具體的人身上。這類似於股票交易的信息等級發佈,個人交易的時間和交易量被公開,卻不告知參與者到底是誰。

另外一道防火牆,爲防止交易被關聯到交易者身上,每一筆交易採用新的公私鑰對加密,有些關聯仍然是不可避免的,比如多輸入的交易,需要識別出哪些是來自同一個交易者。最大的風險在於,一旦獲得了一個交易者的密鑰,通過鏈接可以查看當前交易者的其他交易。

11、Calculations 計算

我們假設攻擊者試圖以比誠實節點更快的速度產生分支鏈。即使這個目的達到了,也不會致使系統混亂,比如憑空創建數值或者盜取不輸入攻擊者的錢財。節點不會持續接受一個非法的交易,並且誠實的節點不會接受這個包含非法交易的塊。攻擊者只可以改變他自己的交易,以拿回自己剛剛支付的金錢。

誠實鏈與攻擊鏈的賽跑可以形象爲二叉樹隨機漫步(Binomial Random Walk),成功的事件是誠實節點擴展當前塊,+1;失敗的事件是攻擊節點擴展當前塊,-1。

攻擊者彌補虧空的可能性類似於賭徒破產理論(Gambler's Ruin)。假設一個可以無限貸款的賭徒開始就存在虧空,並且可以發起無數次賭博來達到收支平衡,我們可以計算出他達到收支平衡的概率,或者說是攻擊節點追上誠實節點的概率如下:

p:誠實節點發現下一個節點的概率

q:攻擊者節點發現下一個節點的概率

qz:攻擊者總是趕上第Z塊的概率

假設p>q,隨着塊數的增加,攻擊者追上的可能性在指數降低。如果他沒有很幸運的趕早,他趕超的機會將越來越渺茫。

現在我們考慮下接受一筆新的交易後需要等待多長時間,才能確定發送者不能再改變交易。我們假設發送者是一個攻擊者,想讓接受者相信他已經支付了,在一段時間後又將交易反向支付給自己。此時接受者希望得到警告而發送者希望他爲時已晚。

接受者產生了新的公私鑰對,並將公鑰在簽名之前發給發送者。這防止了發送者提前準備區塊並跑在前面的可能。一旦交易被髮送,攻擊者就開始祕密的在包含他的交易的分叉鏈上開始工作。

交易被增加到區塊上,並且此區塊鏈之後已有Z塊區塊的時候,接受者不知道發送者的確切進度,假設誠實的區塊每塊花費平均的期望時間,按照泊松分佈(Poisson distribution)發送者可能的進度期望值爲:


爲了獲得攻擊者現在追趕上來的可能性,我們把每一次攻擊者能夠追趕上來的可能性乘以泊松密度函數(Poisson density):


調整公式避免累加分佈的無窮大尾部。。。


轉換成代碼:

通過傳入不同的參數z和q運行,我們可以看到可能性下降的指數:


12、        Conclusion 總結

我們已經設計了一個不依賴信用的電子交易系統。我們以普通的電子簽名貨幣開始,這種貨幣具有很強的所有權控制,但是沒法解決雙重支付的問題。爲了解決這個問題,我們設計了一個P2P網絡,通過工作量證明來記錄交易歷史,並且能通過誠實節點控制大部分CPU計算的方式使攻擊者很快變爲無效計算。網絡的非結構化簡單,節點之間需要很少的協調工作。因爲消息不會被路由到任何特定的地方,只需要投遞到最好的計算力節點,因此不需要被確認。節點可以按照意願隨意的離開和加入到網絡中去,獲得他們不在的時候產生的工作量證明鏈。他們按照CPU工作量進行選舉,通過擴展來表明接受區塊,通過拒絕擴展來表明不合適的區塊。一些必備的規則和激勵可以加固這種一致性機制。

 

References

[1] W. Dai, "b-money,"http://www.weidai.com/bmoney.txt, 1998.

[2] H. Massias, X.S. Avila, andJ.-J. Quisquater, "Design of a secure timestamping service with minimal

trust requirements," In 20thSymposium on Information Theory in the Benelux, May 1999.

[3] S. Haber, W.S. Stornetta,"How to time-stamp a digital document," In Journal of Cryptology, vol3, no

2, pages 99-111, 1991.

[4] D. Bayer, S. Haber, W.S.Stornetta, "Improving the efficiency and reliability of digitaltime-stamping,"

In Sequences II: Methods inCommunication, Security and Computer Science, pages 329-334, 1993.

[5] S. Haber, W.S. Stornetta,"Secure names for bit-strings," In Proceedings of the 4th ACMConference

on Computer and CommunicationsSecurity, pages 28-35, April 1997.

[6] A. Back, "Hashcash - adenial of service counter-measure,"

http://www.hashcash.org/papers/hashcash.pdf,2002.

[7] R.C. Merkle, "Protocols forpublic key cryptosystems," In Proc. 1980 Symposium on Security and

Privacy, IEEE Computer Society,pages 122-133, April 1980.

[8] W. Feller, "An introduction toprobability theory and its applications," 1957.

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