比特幣:一種基於麻將機的貨幣系統

摘要. 一種完全的點對點電子貨幣應當允許在線支付從一方直接發送到另一方 而不需要通過一個金融機構。數字簽名提供了部分解決方案,但如果仍需一個 可信任第三方來防止雙重支付,那就失去了電子貨幣的主要優點。我們提出一 種使用點對點網絡解決雙重支付問題的方案。該網絡通過將交易哈希進一條持 續增長的基於哈希的工作量證明鏈來給交易打上時間戳,形成一條除非重做工 作量證明否則不能更改的記錄。最長的鏈不僅是被見證事件序列的證據,而且 也是它本身是由最大 CPU算力池產生的證據。只要多數的 CPU算力被不打 算聯合攻擊網絡的節點控制,這些節點就將生成最長的鏈而超過攻擊者。這種 網絡本身只需極簡的架構。信息將被盡力廣播,節點可以隨時離開和重新加入 網絡,只需接受最長的工作量證明鏈作爲它們離開時發生事件的證據。

1. 簡介

互聯網貿易已經變得幾乎完全依賴金融機構作爲可信任第三方來處理電子支付。儘管對於 大部分交易這種系統運行得足夠好,但仍需忍受基於信任模型這個固有缺點。由於金融機 構不可避免的需要仲裁糾紛,完全的不可撤銷交易實際是做不到的。仲裁成本增加了交易 成本,限制了最小實際交易額度從而杜絕了日常小額交易的可能性,而且由於不支持不可 撤銷支付,對不可撤銷服務進行支付將需要更大的成本。由於存在交易被撤銷的可能性, 對於信任的需求將更廣泛。商家必須警惕他們的客戶,麻煩他們提供更多他本不必要的信 息。一定比例的欺詐被認爲是不可避免的。雖可通過當面使用實物貨幣來避免這些成本及 支付的不確定性,但不存在不引入一個可信任方而能在通信通道上進行支付的機制。
我們需要的是一個基於密碼學原理而不是信任的電子支付系統,該系統允許任何有交 易意願的雙方能直接交易而不需要一個可信任第三方。交易在計算上的不可撤銷將保護賣 家不被欺詐,用來保護買家的程序化合約機制也應該較容易實現。在這篇論文中,我們提 出一種使用點對點分佈式時間戳服務器爲基於時間的交易序列生成計算上的證據來解決雙 重支付問題的方案。只要誠實節點集體控制的 CPU 算力大於每一個合作攻擊節點羣的 CPU 算力,這個系統就是安全的。

2. 交易

我們定義一枚電子貨幣就是一條數字簽名鏈。每個擁有者都通過將上一次交易和下一個擁 有者的公鑰的哈希值的數字簽名添加到此貨幣末尾的方式將這枚貨幣轉移給下一個擁有者。 收款人可以通過驗證數字簽名來證實其爲該鏈的所有者。
在這裏插入圖片描述
這裏的問題是收款人不能證實擁有者之一沒有對此貨幣進行雙重支付。通常的做法是 引入一個可信任的中央機構或鑄幣廠來檢查每筆交易是否存在雙重支付。每筆交易之後, 都需要將這枚貨幣退回鑄幣廠以換取發行一枚新的貨幣,只有由鑄幣廠直接發行的貨幣才 能被確認沒有被雙重支付。這個方案的問題在於整個貨幣系統的命運都依賴於運營鑄幣廠 的公司,每筆交易都需要經過它們,就像銀行一樣。
我們需要一種能讓收款人知道上一個貨幣擁有者沒有對任何更早的交易簽名的方法。 對我們來說,最早的那次交易是唯一有效的,所以我們不需要關心本次交易後面的雙重支 付嘗試。唯一能確保一筆交易不存在的方法是知曉所有之前的交易。在鑄幣廠模型中,鑄 幣廠知曉所有交易並能確定哪筆交易最先到達。在不引入一個可信任方的前提下要達到這 個目的,所有交易就必須公開發布 [1],而且需要一個能讓所有參與者對交易收到順序的 單一歷史達成共識的系統。收款人在每筆交易時,都需要多數節點認同此交易是最先收到 的證據。

3. 時間戳服務器

我們提出的方案從時間戳服務器開始。時間戳服務器計算包含多個需要被打時間戳的數據 項的區塊的哈希值並廣泛地發佈這個哈希值,就像在報紙或新聞組帖子裏 [2-5]。時間戳 能證明要得到這個哈希值,顯然這些數據當時一定是存在的。每個時間戳的哈希值都納入 了上一個時間戳,形成一條鏈,後面的時間戳進一步增強前一個時間戳
在這裏插入圖片描述

4. 工作量證明

爲了實現一個基於點對點的時間戳服務器,我們需要使用一個類似 Adam Back 提出的哈 希貨幣[6] 的工作量證明系統,而不是報紙或新聞組帖子那樣。工作量證明採取搜索一個 數,使得被哈希時,如使用 SHA-256,得到的哈希值以數個0比特開始。平均所需工作 量將隨所需 0 比特呈指數級增長而驗證卻只需執行一次哈希。
對於我們的時間戳網絡。我們通過在區塊中加入一個隨機數,直到使得區塊的哈希值 滿足所需0 比特的數被找到的方式實現工作量證明。一旦消耗了CPU算力使區塊滿足了 工作量證明,那麼除非重做這個工作否則就無法更改區塊。由於後面的區塊是鏈接在這個 區塊後面的,改變這個區塊將需要重做所有後面的區塊。
在這裏插入圖片描述
工作量證明同時解決了在多數決定中確定投票方式的問題。如果多數是按 IP 地址投票 來決定,那麼它將可能被能分配大量 IP 地址的人破壞。工作量證明本質上是按CPU 投票。 最長的鏈代表了多數決定,因爲有最大的計算工作量證明的精力投入到這條鏈上。如果多 數的CPU算力被誠實節點控制,誠實的鏈就會增長得最快並超過其他的競爭鏈。要修改 過去的某區塊,攻擊者必須重做這個區塊以及其後的所有區塊的工作量證明從而趕上並超 過誠實節點的工作。我們後面會證明隨着後續的區塊被添加一個更慢的攻擊者趕上誠實節 點的概率將呈指數級遞減。
爲了抵消硬件運算速度的增加及平衡不同時期運行節點的利益,工作量證明的難度將 由移動平均數法來確定每小時生成區塊的平均數。如果區塊生成得過快,那麼生成的難度 就會增加

5. 網絡

運行網絡的步驟如下:

  1. 新交易向所有節點廣播。
  2. 每個節點將新交易收集到一個區塊。
  3. 每個節點爲它的區塊尋找工作量證明。
  4. 當一個節點找到了工作量證明,就向所有節點廣播這個區塊。
  5. 節點只有在區塊內所有交易都是有效的且之前沒有被支付的情況下接收這個區塊。
  6. 節點通過使用這個區塊的哈希值作爲上一個哈希值在鏈中創建下一個區塊的方式 表示對這個區塊的接受。
    節點總是認爲最長的鏈爲正確的並持續致力於延長它。如果兩個節點同時廣播了不同 的下一個區塊,有些節點可能先收到其中一個而其他節點先收到另一個。這種情況,節點 基於他們收到的第一個區塊工作,但是也保存另一個分支以防它變爲更長的鏈。當下一個 工作量證明被找到後僵局就會被打破從而其中一個分支變得更長;在另一個分支上工作的 節點將切換到更長的鏈上來。
    新交易的廣播不必到達所有的節點。只要到達一些節點,不久就會進入到一個區塊。 區塊廣播也是能容忍消息丟失的。如果一個節點沒有收到某個區塊,它將在收到下一個區 塊時發現它丟失了一個區塊然後去請求這個區塊。

6. 激勵

我們約定,區塊中的第一筆交易是區塊創建者開啓一枚屬於他的新貨幣的特殊的交易。這 就增加了對支持網絡的節點的激勵,並提供了一種分發貨幣到流通領域的方法,因爲這裏 沒有中央機構來發行貨幣。新貨幣按固定量穩定地增加就像金礦礦工消耗資源並增加黃金 到流通領域一樣。對我們而言,消耗的是 CPU 時間和電力
激勵也可以由交易費充當。如果交易的輸出值小於其輸入值,差價就作爲交易費被加 到包含此交易的區塊的激勵中。一旦預定量的貨幣進入了流通領域,激勵將變爲只含有交 易費,這樣可以完全避免通貨膨脹。
激勵會有助於鼓勵節點保持誠實。如果一個貪心的攻擊者有能力聚集比所有誠實節點 更多的CPU算力,他將面臨是以騙回已付款的方式欺詐別人還是使用這些算力生成新貨 幣的抉擇。他將發現遵守規則比破壞系統和他自己財產的有效性更有利,因爲這些規則準 許他獲得比所有其他人都多的新貨幣。

7. 回收磁盤空間

一旦某個貨幣的最新交易已經被足夠多的區塊覆蓋,這之前的支付交易就可以被丟棄以節 省磁盤空間。爲便於此而又不破壞區塊的哈希值,交易將被哈希進默克爾樹[7][2][5],只 有根節點被納入到區塊的哈希值。老的區塊可通過剪除樹枝的方式被壓縮。樹枝內部的哈 希不需要被保存。
在這裏插入圖片描述
每個不包含交易的區塊頭大約是 80 bytes。如果每10分鐘生成一個區塊,每年生成 80 bytes * 6 * 24 * 365 = 4.2 MB,2008年在售的典型計算機有2 GB內存,並且摩爾定 律預測目前每年內存增加 1.2 GB,所以就算區塊頭一定要存在內存裏,存儲也不是問題。

8. 簡化的支付驗證

不運行一個完整的網絡節點也是可以進行支付驗證的。用戶只需擁有一個最長工作量證明 鏈的區塊頭副本,他可以通過向其他網絡節點查詢以確認他擁有了最長的鏈,並獲取鏈接 交易到給交易打時間戳區塊的默克爾分支。雖然他自己不能覈實這個交易,但如果交易已 經鏈接到到鏈中的某個位置,就說明一個網絡節點已經接受了此交易,而其後追加的區塊 進一步確認網絡已經接受了它。
在這裏插入圖片描述
同樣地,只要誠實節點控制着網絡這種簡化驗證就是可靠的,如果網絡被攻擊者控制 簡化驗證會變得比較脆弱。雖然網絡節點可以驗證他們自己的交易,但只要攻擊者持續控 制網絡那麼這種簡化的方法就可能被攻擊者的僞造交易欺騙。一種對策是接受其他網絡節 點發現一個無效區塊時發出的警告,提醒用戶軟件下載整個區塊和被警告的交易來檢查一致性。爲了更加獨立的安全性以及更快的支付確認,收款頻繁的公司可能仍需運行他們自 己的節點。

9. 合併和分割交易額

儘管單獨處理每個貨幣是可行的,但將一次轉賬按每一分拆成多次交易是笨拙的。爲允許 交易額被分割和合並,交易將包含多個輸入值和輸出值。通常是一個從之前交易而得的較 大輸入值或多個較小輸入值的組合,以及最多兩個輸出值:一個作爲支付,另一個作爲找 零,如果有的話,退還給支付發送方。
在這裏插入圖片描述
注意這裏的扇出,即一筆交易依賴數筆交易,這數筆交易又依賴更多的交易,在這裏 是不存在問題的。永遠不會需要獲取一筆交易歷史的完整獨立副本。

10. 隱私

傳統的銀行模型通過限制參與方和可信任第三方對信息的訪問來達到一定級別的隱私。交 易必須要公開發布就不能使用這個方法,但隱私仍可在其他地方通過阻斷信息流的方式來 保護:那就是保持公鑰匿名。公衆能看到有人正在發送一定量貨幣給其他人,但是不能將 交易關聯到某個人。這和證券交易所發佈的信息級別類似,每筆交易的時間和交易量,即 行情是公開的,但是不會顯示交易雙方是誰。
在這裏插入圖片描述
作爲額外的防火牆,對每筆交易使用新密鑰對可以防止他們被關聯到一個共同的擁有 者。由於多輸入值交易存在,有些關聯仍不可避免,因爲多輸入值交易必然暴露其多個輸 入是屬於同一個擁有者的。風險就在於如果一個密鑰的擁有者被暴露,關聯性將暴露其他 屬於同一個擁有者的交易。

11. 計算

我們考慮一個攻擊者試圖生成一條比誠實鏈更快的替代鏈的情況。即使這個目標達到了, 也不會使系統變得可以任意修改,比如憑空創建貨幣或拿走不屬於他的錢。節點將不會接 受無效的交易作爲支付,而且誠實節點永遠不會接受一個包含無效交易的區塊。攻擊者只 可能改變他自己的某筆交易來拿回他不久前已經支出的錢。
誠實鏈與攻擊者鏈之間的競爭可描述爲二項隨機漫步。成功事件是誠實節點被延長一 個區塊,兩條鏈的差距加 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. 總結

我們已經提出了一種不依賴信任的電子交易系統。我們從通用的數字簽名貨幣體系開始, 這體系提供了強有力的所有權控制,但由於缺乏防止雙重支付的方法而不完善。爲解決這 個問題,我們提出一種使用工作量證明來記錄公共交易歷史的點對點網絡,只要誠實節點 控制了多數的CPU算力,對於對攻擊者,交易歷史將很快變得在計算上不可更改。網絡 因其結構簡潔性而健壯。節點只需很少的協調就能同時工作。它們不需要被認證,因爲信 息不會被髮送到某個特殊的位置,只需被盡力傳播。節點可以隨時離開和重新加入網絡, 只需接受最長的工作量證明鏈作爲它們離開時發生事件的證據。節點使用 CPU算力來投 票,通過致力於延長有效區塊來表達對其接受,通過拒絕在無效區塊上工作來表達對其抵 制。任何需要的規則和激勵都可通過這個共識機制來加強。

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