比特幣:一種 P2P 電子現金系統 譯

摘要

一個純正的 P2P 版本電子現金支持在線支付會從一方直接發送到另一方,而不需要經過一個金融機構。數字簽名解決了部分問題,但是如果還是需要一個可信的第三方來防止**雙花(double-spend)**問題,那也就失去了主要利處。我們提出了一個使用 P2P 網絡解決雙花問題(double-spending problem)的方案。網絡時間戳(timestamps)化交易(transactions)的方法是將它們散列(hash)到基於散列的工作量證明,不斷增長的鏈(chain)上,形成一條記錄,不可修改除非重做工作量證明。最長的鏈不僅作爲目擊事件順序的證明,而且也證明它來自 CPU 算力最大的池。只要大量 CPU 算力控制在不攻擊網絡的節點裏,它們將會產生最長的鏈而且比攻擊者節點算得快。網絡本身要求最小的結構。消息會盡量廣泛傳播,而節點可以隨意離開或者加入網絡,通過接收最長的工作量證明的鏈來確認它們離開網絡時發生的事情。

譯者注

雙花問題:即一筆錢被花了兩次或者兩次以上,也叫"雙重支付"。

1. 簡介

互聯網上的商業幾乎完全依賴於金融機構作爲可信賴的第三方來處理電子支付。雖然該系統對大多數交易(transactions)都能很好地工作,但它仍然存在基於信任的模型固有的缺陷。完全不可逆的交易實際上是不可能的,因爲金融機構無法避免調解糾紛。調解成本增加了交易(transactions)成本,限制了最小實際交易(transactions)規模,並切斷了小規模臨時交易的可能性,而且在無法爲不可逆服務進行不可逆支付的能力喪失方面存在更大的成本。有了逆轉的可能性,對信任的需求就會擴大。商家必須提防他們的客戶,麻煩他們提供除必須信息外的更多信息。一定比例的欺詐被通過不可避免。這些成本和支付不確定性可以通過使用物理貨幣在人身上避免,但是不存在這樣的機制在沒有可信第三方的情況下通過通信信道進行支付。

需要的是一個基於加密證明而不是信任的電子支付系統,允許任何兩個自願的當事方在不需要信任的第三方的情況下直接進行交易。在計算上無法逆轉的交易將保護賣方免受欺詐,而常規的託管機制(escrow mechanisms)可以很容易地實施,以保護買方。這篇論文提出了一種雙花問題的解決方案,利用 P2P 分佈式時間戳服務器生成交易(transactions)按時間順序排列的計算證明。只要誠實節點共同控制的 CPU 算力比任何攻擊者節點的合作組多,系統就是安全的。

2. Transactions

我們定義了一種數字簽名鏈的電子硬幣。每個擁有者通過數字簽名上一次交易(transaction)和下個擁有者公鑰的散列(hash)並將它們添加到硬幣的末端來轉讓硬幣。收款人通過驗證簽名來驗證鏈的擁有權。

譯者理解:

私鑰加密,公鑰解密:一般被用於數字簽名。數字簽名是用於防篡改和防止假冒的,因爲只有一人擁有私鑰。甲方通過私鑰對數據進行簽名,乙方通過甲方的公鑰驗證簽名,如果成功,說明確實是甲方發來的,並且數據沒有被修改。

數字簽名操作:先將上一次交易(transaction)和下個擁有者公鑰進行散列(hash),然後用私鑰對散列進行加密生成數字簽名。

驗證操作:收款人使用擁有者的公鑰對數字簽名進行解密,驗證該簽名是否來自擁有者。

在這裏插入圖片描述
當然,問題是收款人不能證實所有擁有者都沒有雙花(double-spend)硬幣。一個常見的解決方案是引入一個可信的中央機構或造幣廠(mint),檢查每筆交易是否存在雙花。每筆交易後,必須將硬幣退回造幣廠(mint)發行新硬幣,只有直接從造幣廠發行的硬幣才能相信沒有雙花(double-spend)。這個解決方案的問題在於,整個貨幣體系的命運取決於運營造幣廠(mint)的公司,每筆交易都必須通過它們,就像銀行一樣。

我們需要一種方式讓收款人知道先前的擁有者沒有簽名任何更早的交易(transactions)。

譯者理解: 簽名任何更早的交易指沒有創建多個數字簽名,即沒有雙花

就我們的目的而言,最早的交易纔是最重要的,所以我們不關心後面交易試圖雙花的問題。確認一筆交易不存在的唯一方法是知道所有交易。在以造幣廠爲基礎的模型中,造幣廠知道所有的交易,並決定哪些交易最先到達。要在沒有可信第三方的情況下實現這一點,交易必須公開宣佈[1]並且我們需要一個系統,讓參與者們對他們接收的交易順序歷史達成一致。

3. Timestamp Server

我們提出的解決方案從時間戳服務器(timestamp server)開始。時間戳服務器的工作方式是對要加時間戳的項目塊(a block of items)進行散列(hash),並廣泛地發佈該散列(hash),例如在報紙或全球新聞組網絡(Usenet)帖子中[2-5]。時間戳證明數據必須在當時存在,才能進入到散列(hash)中。每個時間戳在其散列(hash)中包括上一個時間戳,形成一個鏈,每個附加的時間戳加固了其前面的時間戳。
在這裏插入圖片描述

4. Proof-of-Work

要在 P2P 的基礎上實現分佈式時間戳服務器,我們需要使用類似於 Adam Back’s Hashcash[6] 的工作量證明系統,而不是報紙或全球新聞組網絡(Usenet)帖子。工作量證明涉及到尋找一個值,當被散列(hashed)時,例如使用 SHA-256,這個值的散列(hash)以若干個零位(ZERO bits)開始。所需的平均工作量隨着指定的零位(ZERO bits)數增加而指數級增長,可以通過執行單個散列(hash)驗證。

對於我們的時間戳網絡,我們實現的工作量證明是通過遞增 block 中的 nonce 直到找到一個值,該值使得 block 的散列(hash)的零位數符合要求。一旦消耗 CPU 算力滿足了工作量證明,block 將不能修改除非重做工作量證明。因爲新的 blocks 會鏈接在當前 block 後面,修改當前 block 的工作將包括重做它後面的所有塊。

譯者理解:比特幣工作量證明具體實現是以 SHA256 算法計算一個目標哈希,使得這個哈希值符合前 N 位全是 0。

在這裏插入圖片描述
工作量證明還解決了大多數決定中確定代表權的問題。如果大多數基於一個 IP 地址一票,那麼任何能夠分配許多IP的人都可以顛覆它。工作量證明本質上是一個 CPU 一個票。大多數決定由最長的鏈代表,最長的鏈意味着投入的工作量證明最大。如果 CPU 算力的大多數由誠實節點控制,那麼最誠實的鏈將會增長最快並超過任何與之競爭的鏈。爲了修改過去的 block,攻擊者將不得不重做該 block 以及它後面的 blocks 的工作量證明而且要追上並超過最誠實的節點們的工作速度。我們稍後會講到速度更慢的攻擊者追上的可能性會隨着後續塊的增加指數級下降。

爲了補償隨着時間過去硬件速度的提高和運行節點的興趣變化,工作量證明的難度由一個以平均每小時產生的塊數爲目標的活動平均值來確定。如果它們增加太快,難度就會增加。

5. Network

運行該網絡的步驟如下:

  1. 新交易向所有節點廣播。
  2. 每個節點將新交易收集到 block 中。
  3. 每個節點爲它的 block 計算工作量證明。
  4. 當一個節點計算得到工作量證明後,向所有節點廣播 block。
  5. 節點接收那些含有的所有交易都有效並且沒被花掉的 block。
  6. 節點通過在鏈中創造下個 block,使用接收的 block 的散列(hash)作爲 privious hash 表達它們接收了 block。

節點始終將最長的鏈視爲正確的鏈,並將繼續努力擴展它。如果兩個節點同時廣播下一個塊的不同版本,則某些節點可能首先接收這一個或另一個。在這種情況下,他們會在收到的第一個分支上工作,但會保留另一個分支,以防它變得更長。當下一個工作量證明被找到時一個分支會變得更長,它們的連接將不復存在;工作在另外一個分支上的節點將切換到更長的分支上。

新交易不一定需要到達所有節點。只要他們到達很多的節點,不久就會進到 block 中。Block 廣播也容忍信息丟失。如果一個節點沒有接收到 block,當它接收到下一個 block 並發現丟失了 block時,就會請求這個 block。

6. 激勵

按照慣例,區塊中的第一筆交易(transaction)是一種特殊交易(transaction),它產生(start)了一枚新硬幣歸 block 創建者所有。這增加了節點支持網絡的動力,並提供了一種將硬幣初始分配到流通中的方法,因爲沒有中央授權來發行它們。穩定增加一定數量的新硬幣類似於黃金開採商(gold miner)消耗資源以增加黃金的流通量。在我們的場景中,花費的是 CPU 時間和電力。

激勵措施也可以由交易費用(transaction fees)提供資金。如果交易的輸出值小於其輸入值,則差額是交易費用,該費用加到包含交易的 block 的激勵值中。一旦預定數量的硬幣進入流通,激勵就可以完全過渡爲交易費用,並且完全沒有通貨膨脹。

激勵措施可能有助於鼓勵節點保持誠實。如果一個貪婪的攻擊者能夠集合比所有誠實節點更多的 CPU 算力,他將面臨選擇使用它竊取他的付款來欺騙別人,還是使用它產生新的硬幣。他應該會發現,遵守這些規則比從其他任何人那裏騙得的錢要多得多,這些規則比其他任何人加起來都更有利於他,而不是去破壞系統和他擁有的財富的有效性。

譯者理解

如何理解竊取他的付款來欺騙別人?

這就是 51% 攻擊(majority attack)。根據第5節的工作量證明所講可知,當擁有超過半數的算力時,不僅可以重做當前 block 和後面的 blocks,還能在重做完後創建新 block 趕超其它節點。使得它創建的鏈更長而獲得全網認可。相當於可以篡改他之前的付款交易。

7. 回收磁盤空間

一旦硬幣中的最新交易被埋在足夠的 blocks 下,已支付的交易就可以丟棄,以節省磁盤空間。爲了在不破壞 block 的散列(block’s hash)的情況下實現這一點,交易(transactions)在默克爾樹(Merkle Tree)[7] [2] [5]中進行散列(hashed)處理,只有根包含在block 的散列(block’s hash)中。然後可以通過砍掉樹的分支來壓縮舊塊。內部的散列(hash)不需要存儲。
在這裏插入圖片描述
沒有交易記錄(transactions)的 block header 大約爲 80 字節(bytes)。如果我們假設每10分鐘產生一個 block,則每年 80 字節 * 6 * 24 * 365 = 4.2 MB。截止到2008年,銷售的計算機系統通常帶有 2GB RAM,而摩爾定律預測當前每年會增長 1.2 GB,即使必須將 block header 保存在內存中,存儲也不成問題。

8. 簡化支付驗證

無需運行完整的網絡節點就可以驗證付款。用戶只需要保留最長工作量證明鏈的 block header 的副本,在確信自己擁有最長的鏈之前,可以通過查詢網絡節點(network nodes)來獲取該副本,以及獲取默克爾分支(Merkle branch),該分支將交易(transaction)鏈接到已加上時間戳的 block 上。他本身無法檢查交易(transaction),但是通過將其鏈接到鏈中的某個位置,他可以看到有網絡節點已接受該交易,並且其之後添加的 blocks 也進一步確認網絡已接受該交易。

譯者理解

如何理解已加上時間戳的 block(the block it’s timestamped in)?

查看第三節 Timestamp Server

在這裏插入圖片描述
這樣,只要誠實的節點控制網絡,驗證就是可靠的,但如果網絡被攻擊者控制,驗證會更容易受到攻擊。雖然網絡節點(network nodes)可以自己驗證交易(transaction),但只要攻擊者能夠繼續控制網絡,簡化的驗證方法就可能被攻擊者捏造的交易(transaction)所欺騙。防止這種情況發生的一種策略是,接收來自網絡節點檢測到無效塊時發出的警報,提示用戶軟件下載完整的 block 和被警告的交易(transaction)以確認是否不一致。經常收到付款的企業可能仍希望運行他們自己的節點,以獲得更獨立的安全性和更快的驗證。

9. 合併和拆分價值

儘管可以分別處理硬幣,但要對轉賬中的每一分錢都進行單獨交易就會很不方便。爲了允許價值被分割和合並,交易要包含多個輸入和輸出。通常情況下,會有一個單筆輸入來自較大的上一筆交易(transaction)或多筆較小金額的組合輸入,以及最多有兩筆輸出:一筆用於支付,另一筆將零錢(如果有)返回給發送方。
在這裏插入圖片描述
應該注意的是,扇出(fan out),指一個交易依賴於多個交易,而這些交易又依賴於更多交易,在這裏不是問題。因爲永遠不需要提取交易歷史記錄的完整獨立副本。

譯者理解

fan out:直譯爲扇出,也意爲展開

10. 隱私

傳統的銀行模式通過限制相關方和受信任的第三方對信息的訪問來達到一定程度的隱私。公佈所有交易(transactions)的必要性排除了此方法,但仍可以通過在另一個地方中斷信息流通來保持隱私:通過使公鑰匿名。公衆可以看到有人正在向其他人匯款,但沒有信息將交易(transaction)和任何人聯繫在一起。這類似於證券交易所發佈的信息級別,在該級別上,公開了單個交易的時間和規模,即"磁帶"(tape),但沒有告知參與方是誰。

譯者理解

公鑰匿名:使得我們不知道轉賬的發起方和接收方
tape:磁帶;聽到聲音,卻不能確定是誰的聲音。

在這裏插入圖片描述
作爲一個附加防火牆,每個交易(transaction)都應該使用新的密鑰對,以防止它們指向同一所有者。在多輸入交易(multi-input transactions)中,某些聯繫仍然不可避免,因爲顯然它們的輸入都是由同一所有者擁有的。風險在於如果密鑰的所有者暴露,該密鑰所有者的其他交易也會暴露。

11. 計算

考慮攻擊者試圖生成一條替代誠實鏈的鏈且比誠實鏈延長速度更快的情況。即使做到這一點,也不意味着系統會被任意更改,比如憑空創造價值或獲取不屬於攻擊者的錢。節點不會接受無效交易(transaction)的付款,誠實節點不會接受包含它們的 block。攻擊者只能嘗試更改他自己的交易(transaction),偷回他最近花掉的錢。

誠實鏈和攻擊者鏈之間的競爭可以描述爲二項隨機漫步(Binomial Random Walk)。成功事件是誠實鏈延長一個 block,領先優勢增加 1,失敗事件是攻擊者鏈延長一個 block,差距減少 1。

攻擊者追趕上給定差距的概率類似於賭徒破產問題(Gambler’s Ruin problem)。假設信用能夠無限透支的賭徒從欠錢開始賭錢,可以進行無數次嘗試回本。我們可以計算出他能回本的概率,或者說攻擊者鏈趕上誠實鏈的概率,如下所示[8]:

p = 誠實節點產生下一個 block 的概率

q = 攻擊者產生下一個 block 的概率

qz = 攻擊者落後 z 個 blocks 追上的概率


qz=(1ifpq(q/p)z ifp>q) q_{z}= \begin{pmatrix} 1&if p \leq q\\\\ \left (q/p \right )^{z}&\ if p>q \end{pmatrix}


假設 p>qp > q,隨着攻擊者要追趕的 blocks 數不斷增加,概率會呈指數下降。如果他在早期沒有追趕成功,那麼隨着他落後地越來越多,他的機會也會變得越來越渺茫。

現在考慮下新交易的接收者需要等待多長時間才能充分確定發送者不能更改交易。我們假設發送者是攻擊者,他想讓接收者相信他已經支付過一段時間,然後再在一段時間後將交易切換爲支付給自己。當這種情況發生時,接收者會收到警告消息,但發送者希望這已經爲時已晚。

接收者生成一個新的密鑰對,並在簽名前不久纔將公鑰給發送者。這可以防止發送者提前準備一個區塊鏈(a chain of blocks),通過不斷地爲該鏈生成 blocks,等到他僞造的鏈足夠超前,然後在那一刻執行交易。一旦交易被髮送,不誠實的發送者就開始偷偷準備包含其另一個版本的交易的並行鏈。

接收者會一直等待直到交易被添加到一個 block 中並且在其之後鏈接了 z 個 blocks。他不知道攻擊者已經取得的確切進度(重做了多少 blocks),但是假設誠實的 block 花費的時間是每個 block 的平均預期時間,那麼攻擊者的潛在進度(重做了多少 blocks)將是一個泊松分佈(Poisson distribution),期望值爲:


λ=zqp \lambda = z\frac{q}{p}


泊松分佈

如果某事件以固定強度 λ\lambda,隨機且獨立地出現,該事件在單位時間內出現的次數(個數)可以看成是服從泊松分佈。
參考 http://episte.math.ntu.edu.tw/articles/sm/sm_16_07_1/index.html

爲了得到攻擊者當前仍然可以追上的概率,我們將用表示攻擊者取得的各個進度的泊松密度乘以他從該點可以追上的概率:


k=0λkeλk!{(q/p)(zk)ifkz1ifk>z}\sum_{k=0}^{\infty }\frac{\lambda ^{k}e^{-\lambda }}{k!}\cdot \begin{Bmatrix} \left ( q/p \right )^{\left ( z-k \right )} & if k\leqslant z\\\\ 1 & if k > z \end{Bmatrix}


重新調整避免對分佈的無窮極數求和:


1k=0λkeλk!(1(q/p)(zk)) 1-\sum_{k=0}^{\infty }\frac{\lambda ^{k}e^{-\lambda }}{k!} \left ( 1-\left ( q/p \right )^{\left ( z-k \right )} \right )


譯者注

用表示攻擊者取得的各個進度的泊松密度乘以他從該點可以追上的概率,這句話我翻譯不一定對。

轉換成 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. 總結

我們提出了一種不依賴信任的電子交易系統。我們從常見的數字簽名硬幣框架開始,該框架提供了對所有權的強大控制,但是它並不完善因爲沒有防止雙花問題(double-spending)。爲了解決這個問題,我們提出了一種使用工作量證明的 P2P 網絡來記錄交易的公開歷史,如果誠實節點控制了大多數 CPU 算力,則對於攻擊者而言,更改記錄很快會變得在計算上不現實。該網絡非結構化的簡單性非常健壯(robust)。節點在幾乎沒有協調的情況下同時工作。它們不需要識別,因爲消息不會被路由到任何特定的地方,只需要盡最大努力地傳遞。節點可以隨意離開和重新加入網絡,接收工作量證明鏈來證實它們離開時都發生了事情。它們用自己的 CPU 算力投票,通過擴展有效 blocks 來表達對有效塊的接受,拒絕處理無效塊來表示拒絕。任何必要的規則和激勵措施都可以通過這種共識機制(consensus mechanism)來執行。

參考文獻

[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.


論文相關信息

作者 SatoShi Nakamoto

郵箱 [email protected]

網址 www.bitcoin.org


發佈了10 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章