1. 程式人生 > >中本聰比特幣論文

中本聰比特幣論文

翻譯一遍,加深理解,也可以移步到 我的個人部落格 瀏覽翻譯

中本聰(Satoshi Nakamoto),又譯中本哲史,於2008年釋出了比特幣的創世論文《Bitcoin: A Peer-to-Peer Electronic Cash System》。在論文中描述了一種基於加密技術的電子貨幣系統。


Bitcoin: A Peer-to-Peer Electronic Cash System

Abstract: 純點對點版本的電子現金系統將允許直接從一方線上付款到另一方,而不經過一個金融機構。數字簽名提供了部分的解決方案,但如果仍然需要一個可信第三方來防止雙花,就將喪失意義。我們基於點對點網路提出了雙花問題的解決方案。點對點網路新增時間戳的方式為將交易的雜湊值新增到一條不斷增長的鏈中——該鏈採用基於雜湊的工作量證明方式進行增長,修改記錄必須重新進行工作量證明。最長的鏈不僅作為觀察到的事件序列的證明,也作為自身來自最大算力池的證明。只要點對點網路的大部分算力被合作節點掌握,他們就能夠超過攻擊者,生成最長的鏈。該網路本身需要最小的結構,其中的訊息以盡力而為的方式廣播,節點可以隨意離開或重新加入網路,並接受最長的工作量證明鏈,以此確證他們不在網路期間發生的事。

1. Introduction

網際網路上的商業幾乎完全依賴於金融機構作為可信第三方來處理電子支付。雖然在大多數交易下系統都執行良好,但這種基於信任的模式仍有其固有弱點。完全不可逆的交易是不可能的,因為金融機構不能避免調解糾紛。調解的成本增加了交易成本,限制了最小的實際交易規模,切斷了小額臨時交易的可能性,並且因為為不可逆服務提供不可逆支付能力的喪失而產生更廣泛的成本。由於交易可被逆轉,對信任的要求增加。商家必須警惕他們的顧客,儘可能多地獲取他們本不需要的資訊。一定比例的欺詐被認為是不可避免的。這些成本和支付不確定性可以通過親自使用實物貨幣來避免,但沒有任何機制可以使通過沒有信任方的通訊渠道進行支付成為可能。

所需要的是基於密碼證明而不是信任的電子支付系統,允許任何兩個自願的雙方直接交易,而不需要一個可信第三方。在計算上不可逆轉的交易將保護賣家免受欺詐,常規託管機制也可以很容易地實施,以保護買家。本文提出了一種雙花問題的解決方案,即採用點對點分散式時間戳伺服器來生成交易的時間順序的計算證明。只要誠實節點所控制的總算力比攻擊節點控制的更多,該系統就是安全的。

2. Transactions

我們將電子幣定義為數字簽名鏈。幣的轉移是通過所有者對前一筆交易和下一個所有者的公匙進行簽名,並將這兩個簽名放到幣的末端來實現。收款人可以通過驗證簽名來驗證鏈所有權。

當然,問題是收款人無法驗證其中一個所有者沒有進行雙花。一個常見的解決辦法是引入一個可信中央權威機構(造幣廠),檢查交易是否被雙花。每次交易後,必須將幣退還給造幣廠以發行新的幣,只有從造幣廠發行的幣可以確信沒有雙花。這個解決方案的問題是,整個貨幣體系的命運取決於運營造幣廠的公司,每一筆交易都要經過它們,就像銀行一樣。

我們需要一種方法讓收款人知道前所有者沒有將幣用於早些的交易。就這個目的而言,最早的交易是最關鍵的,所以我們不關心稍後是否進行了雙花。確認交易是否存在的唯一方法是瞭解所有交易。在造幣廠模型中,造幣廠瞭解所有的交易,並決定哪一筆交易是第一個。為了在沒有信任方的情況下達到這個目的,交易必須被公開宣佈[1],我們需要一個系統讓參與者基於他們接收到的事實就序列的單一歷史達成共識。收款人需要證據,表明在每次交易時,大多數節點都同意這是第一次收到。

關鍵資訊:幣所有者對該筆交易簽名、對下一個所有者的公匙簽名

3. Timestamp Server

我們建議的解決方案是從一個時間戳伺服器開始。時間戳伺服器通過對多個專案組成的區塊進行雜湊來得到時間戳,並廣泛釋出該雜湊值,如在報紙或Usenet帖子[2-5]中。時間戳用於證明資料在得到雜湊值的那個時間點存在。每個時間戳的雜湊值中都包含之前的時間戳,形成一個鏈,每個新加的時間戳都對它之前的時間戳進行了增強。

關鍵資訊:當前的時間戳中包含前一個時間戳的摘要

4. Proof-of-Work

要在點對點基礎上實現分散式時間戳伺服器,我們需要使用類似於Adam Back的Hashcash[6]的工作量證明機制,而不是報紙或Usenet帖子。工作量證明涉及在雜湊後檢索一個值,例如SHA-256,得到的雜湊值以一定數量的零位元位開始。所需的平均工作量與要求的零位元位的數量呈指數關係,並且答案通過一次雜湊就可以驗證。

對於我們的時間戳網路,工作量證明機制這樣實現:在區塊中遞增一個nonce值,針對每次的nonce,計算整個區塊的雜湊值,直到找到一個雜湊值,該值滿足所要求的零位元位數量。一旦CPU已經花費了努力使其滿足工作量證明,不重做該工作的情況下無法改變塊。後來的塊被放入鏈後,改變該塊所需的工作量將包括重做之後所有塊的工作。

工作量證明機制也解決了在多數決策制定中確定哪個為代表的問題。如果大多數的定義是基於一個IP地址一票的話,能夠分配許多IP的人將可以破壞該系統。工作量證明本質上是一個CPU一票。大多數的決定由最長的鏈代表,因為其包含了最多的工作量證明工作。如果大部分的CPU能力都是由誠實的節點來控制,誠實的鏈條就會增長最快,超過任何競爭鏈。要修改過去的塊,攻擊者將不得不重做之後所有區塊的工程證明,然後趕上並超越誠實節點的工作。稍後我們會展示一個較慢攻擊者追趕的概率隨著隨後的塊被新增,指數性地減小。

為了補償硬體速度的增加和隨著時間的推移對執行節點的興趣變動,工作量證明的難度取決於一個變化的平均數——每小時生成區塊數量。如果區塊產生得太快,難度就會增加。

關鍵資訊:通過遞增nonce,獲得符合要求的hash值;根據全網算力變化調整難度

5. Network

執行網路的步驟如下:

  1. 新交易廣播給所有節點。
  2. 每個節點收集新的交易到一個塊。
  3. 每個節點的工作是找到一個困難的塊工作量證明。
  4. 當節點發現工作量證明時,它將該塊廣播給所有節點。
  5. 只有在塊中所有交易都有效且尚未支過的情況下,節點才接受該塊。
  6. 節點通過在鏈上建立下一個塊來表示他們接受了該塊,並使用接受塊的雜湊作為新建立塊的前導雜湊。

節點總是認為最長的鏈是正確的,並將繼續擴充套件它。如果兩個節點同時廣播了下一個塊的不同版本,則會有一些節點先接收到這一個或那一個。在那種情況下,他們在收到的第一個塊上面工作,但儲存其他分支,以防其他分支變得更長。當下一個工作量證明被找到,一個分支變得更長時,均勢將被打破; 在另一個分支上工作的節點會切換到這個較長的分支。

新交易的廣播不一定要到達所有的節點。只要他們到達很多節點,不久就會進入一個塊。塊廣播也容忍訊息丟失。如果一個節點沒有收到一個塊,它會在收到下一個塊時意識到錯過了一個塊,並請求它。

關鍵資訊:儲存其他分支,在最長分支上工作

6. Incentive

按照慣例,塊中的第一筆交易是一個特殊的交易,其中生成的幣歸屬於塊的產生者。這激勵了節點支援這個網路,並提供了一種發行幣、投入流通的方式,因為沒有中央機構來發行它們。穩定增加一定數量的新幣類比於黃金挖礦工消耗資源挖到黃金然後投入流通領域。在我們的機制中,這是CPU時間和電力消耗。

交易費也可以作為激勵。如果交易的輸出值小於其投入價值,差額就是交易費用——作為包含該交易的區塊的追加激勵。一旦預定數量的幣已經進入流通,激勵可以完全轉移到交易費用,完全不會有通貨膨脹。

激勵可能有助於鼓勵節點保持誠實。如果一個貪婪的攻擊者能夠比所有誠實的節點組裝更多的CPU算力,他將不得不面臨選擇:使用算力竊回他的付款來實現欺詐,或者用它來生成新的幣。他應該發現按照規則出牌更有利可圖——這種規則保障他獲得的新幣比其他人聯合起來所獲得的都要多,而不是破壞規則,損害自己的財富的有效性。

關鍵資訊:塊生成激勵;交易費激勵

7. Reclaiming Disk Space

當新交易被放入鏈中,且在該鏈後擴充套件了足夠多的區塊之後,可以確認該交易不會被撤銷,則可以丟球該交易之前的交易記錄,以節省磁碟空間。為了在不破壞塊的雜湊的情況下實現這一點,交易在Merkle樹[7][2][5]中被雜湊,並且只有Merkle樹根包含在塊雜湊中。老區塊可以通過這樣的修剪來壓縮大小。除Merkle樹根外,不需要儲存其他內部雜湊。

沒有交易記錄的區塊頭大概是80個位元組。假設每10分鐘產生一個區塊,每年就是 80位元組* 6 * 24 * 365 = 4.2MB。在2008年以前,計算機系統一般都有2GB記憶體,且摩爾定律預測記憶體以每年1.2GB的速度增長,所以即使必須將所有區塊頭都裝入記憶體中,也不是問題。

8. Simplified Payment Verification

可以在不執行完整網路節點的情況下驗證付款。使用者只需要保留最長鏈的區塊頭副本,他可以不斷髮起查詢,直到確認擁有最長的鏈,這條鏈上的某個區塊可以連線到使用者交易所在的Merkle分支。使用者原本不能自行確認這筆交易的有效性,但通過將這筆交易連結到鏈中,他可以看到一個節點已經接受它,並且在它之後又連結了新的區塊,這表明交易已被全網確認。

因此,只要誠實的節點控制網路,驗證就是可靠的,但如果網路被攻擊者控制的話,驗證就比較脆弱。因為網路節點可以自己驗證交易,只要攻擊者可以持續控制網路,簡化方法就會被黑客捏造的交易愚弄。一個防止這種情況的策略是在網路節點檢測到無效區塊時發出警報,提示使用者下載無效塊或交易的完整資訊,以確認不一致性。收款業務頻繁的企業可能仍然希望執行自己的節點以獲得更加獨立的安全性和更快的驗證。

9. Combining and Splitting Value

雖然單獨處理幣是可能的,但每一分幣要單獨交易還是不容易的。為了讓價值能被分割和合並,交易包含多個輸入和輸出。通常會有一個來自較大的前導交易的單一輸入或多個來自較小前導交易的彙總輸入,輸出最多兩個:一個用於付款,另一個用於將找零(如果有)返還給發起人。

需要指出,每筆交易依賴於之前多筆交易,這多筆交易又依賴前面更多的交易,這並不是問題。在這種機制中,沒有必要展開檢驗之前的所有交易歷史。

10. Privacy

傳統的銀行業務模式通過限制當事人和可信第三方對資訊的獲取來實現一定程度的隱私保護。在本機制下,因為要公佈所有交易,所以這種方法就不行了,但隱私仍然可以被保護,在另一個方向上阻斷資訊流,即保持公鑰匿名。公眾可以看到有人傳送了一個金額給其他人,但沒有可以將交易連線到任何人的資訊。這類似於證券交易所的資訊披露機制,交易時間、個人交易規模都記錄在案且公開,但沒有告知誰是當事人。

作為額外的防範措施,每筆交易都應該使用一對新的金鑰,以保障它們不會指向共同的所有者。在多點輸入的交易中,一些聯絡仍然不可避免,必然顯示他們的輸入為同一個所有者。風險是如果一個金鑰的所有者被揭示,那麼可以揭示出其他交易也屬於該所有者。

11. Calculations

考慮以下場景,攻擊者試圖以比誠實鏈更快的速度生成另一條鏈。即使這樣做完成,也不會使系統對任意改變開放,例如無中生有創造價值或者得到從不屬於攻擊者的金錢。節點不會接受無效的交易作為付款,誠實的節點永遠不會接受一個包含無效交易的塊。攻擊者只能嘗試改變他自己的一筆交易來收回他最近花了的錢。

誠實鏈和攻擊者鏈之間的競爭可以被定性為二叉樹隨機遊走。成功事件是誠實的鏈條延伸了一個區塊,領先+1,而失敗事件是攻擊者的鏈延伸一個區塊,差距-1。

攻擊者從給定的落後中趕上的概率類似於賭徒破產問題。假設一個無限信用的賭徒從赤字開始進行潛在無限次的嘗試,以填補虧損。我們可以計算他填補上虧損的概率,即攻擊者追趕上誠實的鏈條的概率,如下[8]

p = 誠實節點找到下一個塊的概率

q = 攻擊者找到下一個塊的概率

qz = 攻擊者將從後面z個塊追上的概率

假設 p > q,成功概率隨著攻擊者需要追趕的塊的數量的增加而呈指數下降。因為勝算不在攻擊者這邊,如果他沒有足夠的幸運快速成功的話,他的機會只會變得越來越小。

我們現在考慮一個新交易的接收者需要等待多長時間,才能充分確定發起人不能更改交易。我們假設發起人是攻擊者,他想讓接受者在一段時間內相信他已經付款,然後卻把幣交還給自己。屆時,接收人將收到提醒,但為時已晚。

接收方生成一個新的金鑰對,並在簽約前不久才將公鑰傳送給傳送方簽約。這可以防止付款人預先準備好一個區塊鏈然後持續地對此區塊進行運算,直到他的區塊鏈恰好超過誠實鏈條,方才立即執行支付。此時,只要交易一發出,攻擊者就開始祕密地準備一條包含了該交易替代版本的平行鏈條。

接收方等到交易被新增到一個塊,並且Z個塊連線到它後面。他不知道攻擊者取得進展的確切數量,但是假設誠實的區塊生成一個新塊的時間為平均預期時間,攻擊者的潛在進展就是一個泊松分佈,其期望為:

為了得到攻擊者現在還能追上的概率,我們把他可能已經取得的進展數量的泊松密度乘以他從這一點上可能趕上的概率:

重新排列,以避免對無限數列求和。

轉化為C程式碼…

#include <math.h>
double AttackerSuccessProbability(double q, int z) {
    double p = 1.0 - q;
    double lambda = z * (q / p);
    double sum = 1.0;
    int i, k;
    for (k=0;k<=z;k++) {
        double poisson = exp(-lambda);
        for (i=1;i<=k;i++)
            poisson *= lambda / i;
        sum -= poisson * (1 - pow(q/p,z-k));
    }
    return sum;
}

執行,得到一些結果,我們可以看到概率隨著z呈指數下降。

q=0.1
z=0     P=1.0000000
z=1     P=0.2045873
z=2     P=0.0509779
z=3     P=0.0131722
z=4     P=0.0034552
z=5     P=0.0009137
z=6     P=0.0002428
z=7     P=0.0000647
z=8     P=0.0000173
z=9     P=0.0000046
z=10    P=0.0000012

q=0.3
z=0     P=1.0000000
z=5     P=0.1773523
z=10    P=0.0416605
z=15    P=0.0101008
z=20    P=0.0024804
z=25    P=0.0006132
z=30    P=0.0001522
z=35    P=0.0000379
z=40    P=0.0000095
z=45    P=0.0000024
z=50    P=0.0000006

為使P小於0.1%…

P < 0.001
q=0.10  z=5
q=0.15  z=8
q=0.20  z=11
q=0.25  z=15
q=0.30  z=24
q=0.35  z=41
q=0.40  z=89
q=0.45  z=340

12. Conclusion

我們提出了一個不依靠信任的電子交易系統。我們從數字簽名構成的通用幣框架開始,數字簽名提供了對所有權強有力的控制,但由於沒有辦法防止雙花,仍然是不完整的。為了解決這個問題,我們提出了一個使用工作量證明記錄交易的公共歷史的對等網路,在誠實節點控制多數算力的情況下,攻擊者要改變交易會迅速變得不切實際。該網路的強健之處在於它非結構化的簡潔性。所有節點只需要少量溝通就可同時工作。他們不需要被識別,因為資訊沒有路由到任何特定的地方,只需要以盡力而為的方式交付。節點可以隨意離開或重新加入網路,並接受最長的工作量證明鏈,以此確證他們不在網路期間發生的事。他們用算力進行投票,擴充套件接受的鏈,拒絕工作在包含無效區塊的鏈上。任何需要的規則和激勵都可以通過這個共識機制來實施。

References

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

[2] H. Massias, X.S. Avila, and J.-J. Quisquater, “Design of a secure timestamping service with minimal
trust requirements,” In 20th Symposium 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, vol 3, no
2, pages 99-111, 1991.

[4] D. Bayer, S. Haber, W.S. Stornetta, “Improving the efficiency and reliability of digital time-stamping,”
In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.

[5] S. Haber, W.S. Stornetta, “Secure names for bit-strings,” In Proceedings of the 4th ACM Conference
on Computer and Communications Security, pages 28-35, April 1997.
[6] A. Back, “Hashcash - a denial of service counter-measure,”
http://www.hashcash.org/papers/hashcash.pdf, 2002.

[7] R.C. Merkle, “Protocols for public key cryptosystems,” In Proc. 1980 Symposium on Security and
Privacy, IEEE Computer Society, pages 122-133, April 1980.

[8] W. Feller, “An introduction to probability theory and its applications,” 1957.
9