《比特幣:一種點對點的電子現金系統》-學習日記

        區塊鏈入門學習前必讀的文章,瞭解其來源及解決問題的本質。

目錄

0、摘要

1、簡介

2、交易(Transactions)

3、時間戳服務器(Timestamp Server)

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

5、網絡(Network)

6、激勵(Incentive)

7、回收硬盤空間(Reclaiming Disk Space)

8、簡化的支付確認(Simplified Payment Verfication)

9、價值組合與分割(Combining and Splitting Value)

10、隱私(Privacy)

11、計算(Calculations)

12、結論

13、參考文獻


  • 0、摘要

(1)一種完全通過點對點技術實現的電子現金系統,它使得在線支付能夠直接由一方發起並支付給另外一方,中間不需要通過任何的金融機構;

(2)提出一種解決方案,目的是消除第三方的支持,實現防止雙重支付(double-spending);

(3)解決方案的內容:

3.1)通過隨機散列對全部交易添加時間戳(timestamps);

3.2)將時間戳添加到一個不斷延伸的基於隨機散列的工作量證明(proof-of-work)的鏈條上,作爲交易記錄。(只有一種情況交易記錄才被修改,那就是鏈條上所有的記錄都被修改)。

3.3)最長的鏈條不僅作爲被觀察到的事件序列的證明,也是來自CPU計算能力最大的池(pool)(或者理解爲鏈);

3.4)除非大多數的CPU計算能力合作一起進行全網攻擊,否則誠實節點將會生成最長的、超過攻擊者的鏈條;

(4)電子現金系統另一個特點:信息盡最大努力在全網傳播,節點(nodes)可以隨時離開和重新加入網絡,並且最長的工作鏈條作爲發生合法交易的證明

  • 1、簡介

(1)消除第三方信用中介的問題;

(2)電子支付系統,基於密碼學原理而不基於信用,使得任何達成一致的雙方,能夠直接進行支付,消除第三方的參與;

(3)杜絕回滾(reverse)支付交易的可能,保護特定的賣家免於欺詐;

(4)本文重點:提出一種通過點對點分佈式的時間戳服務器來生成依照時間前後排列並加以記錄的電子交易證明,解決雙重支付問題。

(5)系統安全性的保證策略:只要誠實的節點所控制的計算能力的總和,大於有合作關係的(從operating)攻擊者的計算能力的總和,該系統就是安全的。

  • 2、交易(Transactions)

(1)一枚電子貨幣:是一串數字簽名,每一位所有者通過對前一次交易和下一位擁有者的公鑰(public key)簽署一個隨機散列的數字簽名,將此簽名附加在該枚電子貨幣的末尾,電子貨幣就發送給下一位所有者。收款人通過對簽名進行檢驗,就能夠驗證該鏈條的所有者。

(2)交易過程解決的主要問題是-雙重支付。解決的方案核心是:每一次交易都要將交易的貨幣進行重置(或者由造幣長重新加工)。

(3)收款人,只需要確保之前所有交易中沒有本次交易的簽名。如果想要在電子系統中排除第三方中介機構,那麼交易信息就應當被公開宣佈,我們需要整個系統內的所有參與者,都有唯一公認的歷史交易序列。收款人需要確保在交易期間絕大多數的節點都認同該交易是首次出現。

  • 3、時間戳服務器(Timestamp Server)

(1)時間戳服務器通過對以區塊(block)形式存在的一組數據實施隨機散列而加上時間戳,並將該隨機散列進行廣播,就像在新聞或世界性新聞組網絡(Usenet)的發帖一樣。

(2)時間戳能夠證實特定數據必然於某特定時間是的確存在的,因爲只有在該時刻存在了才能獲取相應的隨機散列值。

(3)每個時間戳應當將前一個時間戳納入其隨機散列值中,每一個隨後的時間戳都對之前的一個時間戳進行增強(reinforcing),這樣就形成了一個鏈條(Chain)。

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

(1)需要一個類似於亞當•柏克(Adam Back)提出的哈希現金(Hashcash)[6].

(2)在進行隨機散列運算時,工作量證明機制引入了對某一個特定值的掃描工作,比方說SHA-256下,隨機散列值以一個或多個0開始。隨着0數目的上升, 找到這個解所需要的工作量將呈指數增長,而對結果進行檢驗則僅需要一次隨機散列運算。

(3)在區塊(block)中增補了一個隨機數(Nonce),這個隨機數的作用:生產隨機散列值中所需要的0的個數。

(4)通過反覆嘗試來找到隨機數,直到找到位置,就確定了一個工作量證明機制。只有該CPU耗費的工作量能夠滿足該工作量證明機制,那麼除非重新完成相當的工作量,該區塊的信息就不可更改。

(5)由於之後的區塊是建立在該區塊之後的,所以想要改動該區塊的信息,就還需要重新完成之後所有區塊的全部工作量。

 

(6)工作量證明機制的本質則是一CPU一票,而非是一IP地址一票。最長的鏈包含最大的工作量。

(7)如果大多數的CPU爲誠實的節點控制,那麼誠實的鏈條將以最快的速度延長,並超越其他的競爭鏈條。

(8)想要對已出現的區塊進行修改,攻擊者必須重新完成該區塊的工作量外加該區塊之後所有區塊的工作量,並最終趕上和超越誠實節點的工作量。

(9)如果對區塊進行修改,其成功概率將呈指數化遞減。(後面的公式和代碼可做參考)

(10)另一個問題:硬件的運算速度在告訴增長,而節點參與網絡的程度則會有所起伏。解決方法:工作量證明的難度(the proof-of-work difficulty)將採用移動平均目標的方法來確定,即令難度指向令每小時生產區塊的速度爲某一個預定的平均數。如果區塊生成的速度過快,難麼難度就會提高。

5、網絡(Network)

運行在該網絡的步驟:

(1)新的交易向全網進行廣播;

(2)每一個節點都將收到的交易信息納入一個區塊中;

(3)每個節點都嘗試在自己的區塊中找到一個具有足夠難度的工作量證明;

(4)當一個節點找到了一個工作量證明,它就向全網進行廣播;

(5)當且僅當,該區塊中所有交易都是有效的切之前未曾發生過,其他節點纔會認同該區塊的有效性;

(6)其他節點接收該區塊,其接受的方法是:在跟隨該區塊的末尾,製造新的區塊以延長該鏈條,而將被接受區塊的隨機散列值視爲先於新區塊的隨機散列值。

網絡區塊信息同步分析:

(a)節點視最長的鏈條爲正確的鏈條,並持續工作和延長該鏈;

(b)如果兩個節點同時廣播不同版本的新區塊,那麼其他節點在接收到該區塊的時間上將存在先後差別。此時將在率先收到的區塊基礎上進行工作,但也會保留另外一個鏈條,以防止後者變成最長的鏈條。該僵局(tie)的打破要等到下一個工作量證明被發現,而其中的一條鏈條被證實爲是較長的一條,那麼在另一條分支鏈條上工作的節點將轉換陣營,開始在較長的鏈條上工作。

(c)所謂“新的交易要廣播”,實際上不需要抵達全部的節點。只要交易信息能夠抵達足夠多的節點,那麼他們將很快被整合進一個區塊中。而區塊的廣播對被丟棄的信息是具有容錯能力的。如果一個節點沒有收到某特定區塊,那麼該節點將會發現自己缺失了某個區塊,也就可以提出自己下載該區塊的請求。

6、激勵(Incentive)

(1)約定:每個區塊的第一筆交易進行特殊處理,該交易產生一枚由該區塊創造擁有的新的電子貨幣。

(2)新的電子貨幣,就是增加了節點支持該網絡的激勵,並在沒有中央集權機構發行貨幣的情況下,提供一種將電子貨幣分配到流通領域的一種方法。其特點:將CPU的時間和電力消耗看做是消耗的資源,而添加的電子貨幣看做是挖礦得到的黃金。

(3)交易費(transaction fees)也是激勵的來源。如果某筆交易的輸出值小於輸入值,那麼差額就是交易費,該交易費將被增加到該區塊的激勵中。只要既定數量的電子貨幣已經進入流通,那麼激勵機制就可以逐漸轉換爲完全依靠交易費,那麼本貨幣系統就能夠免於通貨膨脹。

(4)激勵措施(激勵策略、激勵系統)有助於鼓勵節點保持誠實。簡單描述一下:如果一個節點組織其他節點進行非誠信交易其擁有的電子貨幣的獲取量還不如組織其他節點進行誠實交易得到的電子貨幣更多。因此攻擊者不會破壞這個系統使得其自身財富的有效性受損。

7、回收硬盤空間(Reclaiming Disk Space)

(1)如果最近的交易已經被納入了足夠多的區塊之中,那麼就可以丟棄該交易之前的數據,以回收硬盤空間。爲了同時確保不損害區塊的隨機散列值,交易信息被隨機散列時,被構建成一種Merkle樹(Merkle tree)[7] 的形態,使得只有根(root)被納入了區塊的隨機散列值。通過將該樹(tree)的分支拔除(stubbing)的方法,老區塊就能被壓縮。而內部的隨機散列值是不必保存的。

(2)一Merkle樹形式散列的交易

(3)將Tx0-2從區塊中剪除

(4)不含交易信息的區塊頭(Block header)大小僅有80字節。如果設定區塊生成的速率爲每10分鐘一個,那麼每一年產生的數據位4.2MB。(80 bytes * 6 * 24 * 365 = 4.2MB)。2008年,PC系統通常的內存容量爲2GB,按照摩爾定律的預言,即使將全部的區塊頭存儲於內存之中都不是問題。

8、簡化的支付確認(Simplified Payment Verfication)

(1)網絡節點不完整的情況下,也能完成對支付的檢驗。用戶需要保留最長工作量證明鏈條的區塊頭的拷貝,它可以不斷向網絡發起詢問,直到它確信自己擁有最長的鏈條,並能夠通過merkle的分支通向它被加上時間戳並納入區塊的那次交易。

(2)節點想要自行校驗該交易的有效性原本是不可能的,但通過追溯到鏈條的某個位置,它就能看到某個節點曾經接受過它,並且於其後追加的區塊也進一步證明全網曾經接受了它。

(3)只要誠實的節點控制了網絡,檢驗機制就是可靠的。

(4)如果全網中有一個計算力強的攻擊者進行攻擊時,網絡節點就會變的脆弱。原因是網絡節點能夠自行確認交易的有效性,只要攻擊者能夠持續地保持計算力優勢,簡化的機制會被攻擊者焊接的交易欺騙。

(5)上述交易欺騙如何處理呢?採用報警的方式。只要鏈路中發現一個無效的區塊,就立刻發出警報,收到警報的用戶將立刻開始下載被警告有問題的區塊或者交易的完整信息,以便對信息的不一致進行判斷。

9、價值組合與分割(Combining and Splitting Value)

(1)系統可以單個單個的處理電子貨幣,但是不建議這樣做。爲了使得交易中的價值易於組合與分割,在交易過程中可以設置多個輸入和輸出。
(2)某次價值較大的前次交易構成的單一輸入,或者由某幾個價值較小的前次交易共同構成的並行輸入,但是輸出最多隻有兩個:一個用於支付,另一個用於找零(需要的話就存在,不需要只有一個支付就可以)。(如下圖所示)

(3)需要明確的是,當前的一筆交易依賴之前的多筆交易,多筆交易又各自依賴之前的多筆交易,但這樣也不會影響到校驗的效率,因爲這個過程並不需要展開校驗之前發生的所有交易歷史。

10、隱私(Privacy)

(1)由於向可信任的第三方索取交易信息是受到限制的,因此傳統造幣過程對參與者的信息具有一定的隱私保護。

(2)對於全網廣播是否會打破這種隱私的保護呢?不會的。其策略爲:將公鑰保持爲匿名。各個公衆節點得知的信息僅僅是有某個人將一定數量的貨幣發給另一個人,但是難以將該交易通特定的人聯繫起來,即公衆節點不能確定這些人究竟是誰。這可以類比於股票交易所發佈的信息,股票交易發生的時間,交易量是記錄在案且可供查詢的,但是交易雙方的身份信息卻不予透露。

(3)爲增強隱私安全,使用者可以讓每次交易都生成一個新的地址,以確保這些交易不被追溯到一個共同的所有者。但是由於並行計算的存在,一定程度上的追溯還是不可避免的。因爲並行輸入表面這些貨幣都屬於同一個所有者。若某人的某一個公鑰被確認屬於他,那麼就可以追溯出此人的其他很多交易。

11、計算(Calculations)

(1)設想如下場景:一個攻擊者試圖比誠實節點產生鏈條更快地製造替代性區塊鏈。即便它達到了這一目的,但是整個系統也並非就此完全受制於攻擊者的獨斷意志了,比方說憑空創造價值,或者掠奪本不屬於攻擊者的貨幣。這是因爲節點將不會接受無效的交易,而誠實的節點永遠不會接受一個包含了無效信息的區塊。一個攻擊者能做的,最多是更改他自己的交易信息,並試圖拿回他剛剛付給別人的錢。

(2)誠實鏈條和攻擊者鏈條之間的競賽,可以用二叉樹隨機漫步(Binomial Random Walk)來描述。成功事件定義爲誠實鏈條延長了一個區塊,使其領先性+1,而失敗事件則是攻擊者的鏈條被延長了一個區塊,使得差距-1。

(3)攻擊者成功填補某一既定差距的可能性,可以近似地看做賭徒破產問題。假定一個賭徒擁有無限的透支信用,然後開始進行潛在次數爲無窮的賭博,試圖填補上自己的虧空。那麼我們可以計算他填補上虧空的概率,也就是該攻擊者趕上誠實鏈條,如下所示:

(4)假定p>q,那麼攻擊成功的概率就因爲區塊數的增長而呈現指數化下降。

(5)由於概率是攻擊者的敵人,如果他不能幸運且快速地獲得成功,那麼他獲得成功的機會隨着時間的流逝就變得愈發渺茫。

(6)那麼考慮一個收款人需要等待多長時間,才能足夠確信付款人已經難以更改交易了。假設付款人是一個支付攻擊者,希望讓收款人在一段時間內相信他已經支付完成,然後立即將支付的款項重新支付給自己。雖然收款人屆時會發現這一點,但爲時已晚。

(7)收款人生成了新的一對密鑰組合,然後只預留一個較短的時間將公鑰發送給付款人。這將可以防止以下情況:付款人預先準備好一個區塊鏈然後持續地對此區塊進行運算,直到運氣讓他的區塊鏈超越了誠實鏈條,方纔立即執行支付。當此情形,只要交易一旦發出,攻擊者就開始祕密地準備一條包含了該交易替代版本的平行鏈條。然後收款人將等待交易出現在首個區塊中,然後在等到z個區塊鏈接其後。此時,他仍然不能確切知道攻擊者已經進展了多少個區塊,但是假設誠實區塊將耗費平均預期時間以產生一個區塊,那麼攻擊者的潛在進展就是一個泊松分佈,分佈的期望值爲:

(8)爲了計算攻擊者追趕上的概率,我們將攻擊者取得進展區塊數量的泊松分佈的概率密度,乘以在該數量下攻擊者依然能夠追趕上的概率。

(9)重新排列以避免對分佈的無限尾部求和:

(10)利用C語言實現上述邏輯:

#include <stdio.h>
#include <math.h>

double AttackerSuccessProbability(double q, int z);
main()
{
	double d = 0.0;
	d = AttackerSuccessProbability(0.1,2);
	printf("%lf \n",d);//輸入0.1和2,結果爲0.050978 
}
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; 
}

對應的結果,各位可自行計算進行分析攻擊成功的概率值。

注1:二叉樹隨機漫步(Binomial Random Walk):也就是指隨機漫步是兩個方向,要麼是誠實鏈條領先,要麼是攻擊鏈條領先,形成的一種概率模型。(學習鏈接)

注2:賭徒破產問題(Gambler’s Ruin problem):(學習鏈接)

12、結論

(1)本文提出了一種不需要信用中介的電子支付系統;

(2)首先討論了通常的電子貨幣的電子簽名原理,雖然這種系統爲所有權提供了強有力的控制,但是不足以防止雙重支付。

(3)爲了解決上述問題,文中提出了一種採用工作量證明機制的點對點網絡來記錄交易的公開信息,只要誠實的節點能夠控制絕大多數的CPU計算能力,就能使得攻擊者事實上難以改變交易記錄。

(4)該網絡的強健之處在於結構上的簡潔性。節點之間的工作大部分是彼此獨立的,只需要很少的協同。每個節點不需要明確自己的身份,對交易信息的流動路徑無任何要求,只要盡其最大努力傳播即可。

(5)節點可以隨時離開網絡,重新加入也非常方便,只需要補充接收離開期間的工作量證明鏈條就行。

(6)節點通過自己的CPU計算力進行投票,表決他們對有效區塊的確認,節點不斷延長有效的區塊鏈來表達自己的確認,並決絕在無效的區塊之後延長區塊以表示拒絕。
(7)另外,本文提到了一個激勵機制措施。

13、參考文獻

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

  2. [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. [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. [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. [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. [6]  A. Back, "Hashcash - a denial of service counter-measure,"

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

  7. [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. [8]  W. Feller, "An introduction to probability theory and its applications," 1957.

 

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