前言
前言部分—你正在看的這個部分,不是原文的內容。目錄中正文
到版本
的部分是原文Bitcoin: A Peer-to-Peer Electronic Cash System的內容。出于學習的目的翻譯了白皮書,畢竟水平一般能力有限,若有錯誤懇請指正。
正文
比特幣:對等電子現金系統
Satoshi Nakamoto
satoshin@gmx.com
www.bitcoin.org
摘要
完全地對等網絡的電子貨幣,將允許在線支付直接從一方發送到另一方,不需要經過金融機構。數字簽名提了供解決方案的一部分,但是主要的優勢丟失了,如果仍然需要信任的第三方來預防雙重支付。我們提出一個使用對等網絡的方案來解決雙重支付問題。將交易的網絡時間戳,散列進基于散列的工作證明的擴展中的鏈,形成沒有重做工作證明地無法更改的記錄。 最長的鏈不僅可以證明所見到的證明的事件的順序的證明,而且可以證明它來自最大的CPU算力池。只要大多數CPU算力由不協作攻擊網絡的節點控制,它們將生成最長的鏈并超過攻擊者。 網絡本身需要最小的結構。 消息以盡力為基礎廣播,節點可以隨意離開并重新加入網絡,接受最長的工作證明的鏈,作為離開后發生的事情的證明。
1.介紹
在互聯網上的金融必須依賴金融機構的服務作為可信任的第三方來處理電子支付。當系統工作足夠良好對于大多數交易, 它仍然受困于固以信任為基礎的模型的弱點。完全不可逆的交易是不真實的可能,當金融機構不能避免調解糾紛。調解的花費怎加了交易的花費,限制了最小使用交易大小并且切斷了小散交易的坑,并且有一個更廣泛代價在丟失了能力去創建不可逆支付為不可逆服務。對于有可能的逆轉,需求來自相信差異。商人必須機警的對他們的客戶,向他們提供比他們需要的更多信息。一定比例的欺詐被認為是不可避免的。他們代價和支付無把握能被避免在一個人通過使用物理的貨幣,但沒有機制存在付款轉向一個通信信道的無可信。
為什么需要基于密碼學證明而不是信任電子支付系統?允許任何兩個有意愿的當事人去直接彼此交易不需要被信任的第三方機構。反向計算不可行的交易將保護賣方免受欺詐。常規托管機制能夠輕易被實現來保護買方。在這個論文中,我們提供了一個解決方法針對兩次支付問題通過使用點對點分發的時間戳服務來生成計算證明按時間交易前后排序的交易訂單。系統是加密的一旦誠實的節點全體的控制更多的CPU 算力而不是任何共同協作組織只要誠實節點比任何協作節點都能控制更多的CPU功率,系統就很安全。
2.交易
數字簽名,每位擁有者傳輸硬幣給下一個通過哈希先前交易生成的數字簽名 并且下一個擁有者添加公鑰進硬幣的尾部。一個收款人核實簽名用來確認區塊的擁有權。
這個過程的問題是收款人不能確定這筆款項的擁有者沒有雙重支付硬幣。一個常見的解決方案是引進一個被信任的中心權威,或造幣廠,這樣用來檢查每筆交易的雙重支付。每次支付之后,硬幣必須被返回到鑄幣廠來發行新幣,只有硬幣發行自鑄幣廠被信任不能被雙重支付。這個解決方案存在的問題時整個的金錢系統依賴公司的運營鑄幣廠,有每一個交易必須經過她們,就像銀行。
我們需要一種方法讓收款人知道先前的擁有者沒有簽名任何早先的交易。為了我們目的,最早的交易被計數,因此我們不需要關心后面嘗試雙重支付。這唯一的方式去確認缺席的交易是知道所有的交易。鑄造廠為基礎的模型里,鑄幣廠了解所有的交易并且判斷那一個第一個。為了達到這些沒有信任的部分,交易必須被公開宣布,并且我們需要一個系統來給參與者去同意他們收到的是獨一的訂單歷史,收款人需要證明每次交易的時間里,大量的節點同意它是第一個收到的。
3.時間戳服務
我們提出的方案開始于一個時間戳服務,一個時間戳服務運作起來通過哈一個區塊內希多個可以被時間戳標記的項目并且廣泛的發布哈希,就像在報紙或使用網絡提交,時間戳教授數據必須及時的存在,明顯的,為了進入哈希,每個時間戳包括先前時間戳的初始化哈希,形成鏈,對于每個附加的時間戳加強了在它之前的。
4. 工作量證明
為了實現基于點對點服務的分布式時間戳服務器,我們將需要使用類似于Adam Back的Hashcash的工作證明,而不是時報紙或使用網站。工作證明涉及掃描散列時的值,例如使用SHA-256,散列以零位開始。所需的平均工作量是所需零位數的指數,可以通過執行單個散列來驗證。
對于我們的時間戳網絡,我們實現工作量證明通過在區塊中增長直到區塊哈西出需要的0比特數值被找到。一旦CPU的努力已經擴展到讓它滿足工作量證明,已形成的區塊不能被改變沒有重做證明的情況下。當后來在后面鏈上他,用來改變區塊的工作量就包括重做它后面鏈的工作證明。
我們通過增加增加塊中的隨機數來實現工作證明,直到找到給出塊的散列為必須的零位的值。一旦CPU的努力已經耗盡,使其滿足工作證明,該塊不能改變而不重做工作。因為后面的區塊鏈接著他,用來改變區塊的工作將包括重做其后面所有的區塊。
隨稍后的塊連接后,更改塊的工作將包括重新生成塊后的所有快。工作量證明也解決了在多數決策中的代表性問題。如果大多數是基于一IP地址一票,那么可能會被任何能夠分配許多IP的人顛覆。工作證明本質上是一個CPU一票。大多數的決定由最長的鏈為代表的,它具有投入最大的工作證明。如果多數的CPU算力由誠實的節點控制,誠實的鏈將增長最快,超過任何競爭鏈。為了修改過去的一個塊,攻擊者必須重做塊的工作證明和它之后所有的的塊,然后趕上并超越誠實節點的工作。稍后我們將會顯示,隨著后續的塊被添加,慢速攻擊者追趕的概率呈指數減小。
以補償越來越多的硬件速度和隨時間推移運行節點的興趣,工作難易程度取決于平均每小時塊數的移動平均值,如果生成速度太快,難度就會增加。
5.網絡
運行網絡的步驟如下:
- 新的交易廣播到所有節點
- 每個節點將新交易采集到塊中。
- 每個節點致力于為自己塊找到一個困難的工作證明。
- 當節點找到工作證明,會將該塊向所有節點廣播。
- 節點只有當其中的所有交易都有效并且尚未花費時才接受該塊。
- 節點通過在鏈中創建下一個塊,來表示它們對塊的接受,使用已接受塊的哈希值作為以前的哈希值。
節點總是認為最長的鏈是正確的,并將繼續努力擴展它。如果兩個節點同時廣播下一個塊的不同版本,則某些節點可以首先接收一個或另一個節點。在這種情況下,他們工作在他們收到的第一個,但保存另一個分支,以防萬一它變得更長。當找到下一個工作證明,一個分支變得更長時,關系將被打破;在另一個分支上工作的節點將切換到較長的節點。
新的交易廣播不一定需要到達所有節點。只要他們到達很多節點,他們就會很快進入一個塊。廣播也容忍丟棄的消息。如果一個節點沒有接收到一個塊,它將在接收到下一個塊并請求它接收到一個塊時請求它。
6.動機
按照慣例,一個塊中的第一個交易是一個特殊的交易,它啟動塊的創建者所擁有的新硬幣。這增加了節點支持網絡的動機,并提供了一種初始分配硬幣流通的方式,因為沒有中央頒發這些權限。新增硬幣數量不斷增加,類似于黃金礦工投入資金,以增加黃金流通。在我們這種情況下,是花費時間和電力的CPU。
激勵也可是用交易費資助。如果交易的輸出值少于輸入值,差別是交易費被加入到激勵塊擁有的交易。一旦預定數量的硬幣進入循環狀態,激勵措施就可以完全轉換成交易費用,并且完全無通貨膨脹。
激勵可能有助于鼓勵節點保持誠實。如果一個貪婪的攻擊者能夠組裝比所有誠實的節點更多的CPU電力,他將不得不選擇使用它來欺騙人們竊取他的付款,或者用它來產生新的硬幣。他應該通過規則來發揮更有利可圖,這樣的規則比其他人合并更多的新硬幣,而不是破壞自己財富的制度和有效性。
7.回收磁盤空間
一旦硬幣中的最新交易被埋在足夠的塊之下,可以丟棄它之前的已用事務以節省磁盤空間。
為了便于此而不破壞塊的哈希,交易在Merkle Tree 中進行哈希,只有根包含在塊的哈希中。然后可以通過存儲樹的分支來壓縮現有的塊。內部的哈希不需要被保存
沒有交易的塊的頭大約有80字節。如果我們假設塊每10分鐘生成一次,每個80字節624*365=4.2MB。截止2008年,通常使用2GBRAM的計算機系統,摩爾定律預測目前每年增長1.2GB,即使塊頭必須保存在內存中,存儲也不應該是一個問題。
8.簡便的付款驗證
可以在不運行完整網絡節點的情況下驗證付款。用戶只需要保留最長的工作證明鏈接塊的副本,他可以通過查詢網絡節點來獲得,直到他確信他擁有最長的鏈接,并獲得將事務鏈接到塊的Merkle分支 它有時間戳。他不能自己檢查交易,而是通過鏈接到鏈中的一個地方,他可以看到一個網絡節點已經接受了,并且在進一步確認網絡已經接受之后繼續添加。
如上所說,只要誠實的節點控制著網絡,確認就是可靠的,但是如果網絡被攻擊者超載,則更容易受到攻擊。當網絡中的節點可以自己確認交易, 簡便的方法可以是愚蠢 持續到攻擊者可以持續超載網絡。防止這種情況的一個策略是在網絡節點檢測到無效塊時接受警報,提示用戶的軟件下載完整的塊并提醒事務以確認不一致。
收到頻繁付款的企業可能仍然希望運行自己的節點以獲得更多的獨立安全性和更快的驗證。
9.組合和分割價值
雖然可以單獨處理硬幣,但是在轉賬中每一分錢都是無法實現的。允許數值被分割和合并,交易包括多個輸入和輸出。
通常情況下,來自較大的先前交易的單一輸入或多個較小的數量輸入的組合,最多兩個輸出:一個用于支付,一個返回發送者(如果有的話。
應該注意的是,扇出,交易取決于幾個交易,而這些交易依賴于更多,這不是一個問題。 從來沒有必要提取交易歷史的完整獨立副本。
10.隱私
傳統銀行模式通過限制對相關各方和受信任的第三方的信息訪問來實現隱私級別。宣布所有交易的必要性公開排除了這種方法,但是仍然可以通過在另一個地方破壞信息流來保持隱私:通過保持匿名的公鑰。公眾可以看到有人正在向別人發送金額,但沒有將交易鏈接到任何人的信息。這與股票交易所發布的信息水平類似,個別行業的時間和規模,“磁帶”都被公開,但沒有告知當事人。
附加的防火墻, 新的鍵值對應該被用來保持遠離鏈接到一個常見的擁有者。一些鏈仍然不可避免有多輸入交易,這必然表明他們的投入由同一所有者擁有。風險在于,如果密鑰的所有者被顯示,鏈接可能會顯示屬于同一所有者的其他交易。
11.算法
我想到一個攻擊者試圖生成代替鏈的速度快于誠實節點。即使這個達成了,他不會對任意更改開放,就像憑空創造價值或創造不屬于攻擊者的錢。節點作為付款接受一個非法的交易,并且誠實節點將不再接受包含他們的塊。攻擊者只能嘗試概念交易來拿回他剛花費的錢。
我們考慮一個攻擊者試圖生成替代鏈的場景,比一般的鏈條更快。
即使這樣做,它也不會把系統開放到任意的變化中,比如憑空賺取價值,或是拿走從不屬于攻擊者的錢。節點不會接受無效的交易作為付款,誠實的節點永遠不會接受包含它們的塊。攻擊者只能嘗試改變自己的交易,以收回他最近花費的錢。
誠實鏈和攻擊者鏈之間的比賽可以表征為二項式隨機游走。成功事件是誠實鏈延伸一個塊,增加+1的領先,失敗事件是攻擊者的鏈條延伸一個塊,將差距縮小-1。攻擊者從給定的赤字追趕的概率類似于賭徒的廢墟問題。
假設有一個無限信貸的賭徒開始赤字,并且可能會嘗試無限次嘗試達到盈虧平衡。 我們可以計算出他所追求的盈虧平衡的概率,或者攻擊者追求誠實鏈的概率如下
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
Solving for P less than 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能力,通過致力于擴展塊,來表達接受塊,拒絕在塊上工作,來拒絕不合法的塊。任何需要規則和激勵 任何所需的規則和激勵措施都可以通過這種共識機制來實施。
引用
[1] W. Dai, "b-money," [http://www.weidai.com/bmoney.txt](http://www.weidai.com/bmoney.txt), 1998.
[2] H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimaltrust 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, no2, 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 Conferenceon 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](http://www.hashcash.org/papers/hashcash.pdf), 2002.
[7] R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security andPrivacy, IEEE Computer Society, pages 122-133, April 1980.
[8] W. Feller, "An introduction to probability theory and its applications," 1957.
版本
2017年06月30日11:19:30 :添加了圖片,用代碼塊顯示代碼,散落的段落組合在一起。
2017年07月20日23:24:13:更新了摘要,網絡第一段。