比特幣大揭祕

一、前言

當我們在提到區塊鏈的時候,很多人都知道這是個跟金融,就是跟money有關的東西,與其說區塊鏈,我們常用的詞應該是區塊鏈技術,這種說法其實就揭露了其本質——技術。那與區塊鏈相關聯的另一個名詞又是什麼呢?那當然就是大名鼎鼎的比特幣(BitCoin)。

1.1 比特幣

比特幣,你可以把它當作是一種電子貨幣,它的出現絕對不是偶然,然是歷史發展的必然。在中本聰的論文(見附件)中對比特幣出現的前因後果大致是這麼描述的(翻譯可能有誤)

  • 在物理世界中,貨幣是由各國的央行發行,這是一箇中心化的發行機制,說白了,就是容易受到某個中心化機構的控制
  • 貨幣的流轉
    • 電子貨幣:可信的第三方(銀行、支付寶等)承擔着貨幣的流轉
    • 物理貨幣:人直接把cash交給另一個人
  • 當然,人與人直接交易,流轉貨幣,這種方式方式當然是安全的(除非遇到假鈔,這裏不討論這種情況哈)

那麼,可信的第三方作爲貨幣流轉的中介,這種方式有什麼問題嗎?我看平時支付寶用的好好的啊。中本聰的論文裏是這麼講的:

  • 中心化的第三方,沒法完全保證可信
  • 中心化的第三方,所有的交易,用戶的餘額都存在一箇中心化的數據庫中,不能完全保證交易的不可更改(因爲只有一個人知道,你改了,我找誰說去?)
  • 在人與人交易的過程中,第三方作爲中間人,也是需要承擔風險的,萬一兩個交易的人扯皮子,你說我作爲擔保人是不是得喫悶虧,這樣就無形中增加了這種交易的成本,甚至有可能讓很多人放棄這種方式的交易
  • 中心化的第三方不是福利機構啊,人家憑什麼要給你管賬本,要陪你扯皮子呢?還不是由服務費嗎?

那麼,中本聰就設想,在電子交易的過程中,能不能通過某種方式,把這個第三方給去了,像物理世界中的先進交易那樣,用戶A直接就把貨幣打到用戶B的錢包裏?

於是乎,比特幣就這麼登上歷史的舞臺。。。

1.2 區塊鏈

看完上面,相信你們對比特幣是幹嘛用的已經有了一個大致的瞭解了,中本聰的論文裏稱比特幣是一種點對點的電子現金系統,那麼作爲與物理世界裏的鈔票對應的電子現金,需要解決什麼問題呢?

  • 貨幣的發行,首先得像央行發行軟妹幣一樣,有一定的機制去保障這些個貨幣能被正常的發行出來啊。但是,又不能像央行發行軟妹幣那樣一家說了算,我想發多少就發多少,這樣遲早完蛋啊,很多血淋淋的例子我就不多列舉了
  • 貨幣的轉移,比特幣這種電子現金系統肯定也要有一種機制去保證貨幣能在用戶之間流轉吧,並且這種流轉也不能再有第三方介入了啊
  • 交易、餘額等,我得有一套機制去存人與人之間的產生的交易信息吧,我還要去記錄一個人還剩多少錢吧,並且,這個過程也不能讓某一箇中心化的機構來做

上面說到的這樣,可以看成是實現比特幣這套電子現金系統中,必須解決的關鍵性問題,那麼怎麼解決這些個問題呢?那就是今天的主角——區塊鏈技術發揮作用的地方了。大概的意思就是:區塊鏈是什麼比特幣這種電子貨幣,保障比特幣發揮作用的底層技術!

二、區塊鏈大揭祕

2.1 拋磚引玉

下面,我們來說一個故事,藉此來引出區塊鏈技術的關鍵問題。

2.1.1 故事一

那是一個晴空萬里的早上,始金嚮往常一樣高高興興的上班去了,一到公司,成曉就告訴他,老闆覺得你很不錯,剛剛說要給你升職加薪,始金一聽,心想肯定騙我的,就沒當回事,不料,過一會盛哥又來了,說了跟成曉一樣的話,始金心裏開始打鼓了,難道這是真的?沒過一會,黎晨也對他說了同樣的話,子墨,罕喻也是,這下不得了了,始金開始信了,這不得不信啊,畢竟這麼多人都說了,那肯定就是真的啊!

2.1.2 故事二

那是一個晴空萬里的早上,始金嚮往常一樣高高興興的上班去了,一到公司,馬老師就對始金說,公司決定要給你升職加薪,始金立馬就信了。

通過上面的兩個故事,大家可以看到,要讓用戶相信一件事,其實可以通過兩種方式,一種是故事一中的很多人說這是真的,另一種就是有一個權威的第三方來說這是真的。而區塊鏈技術正式藉助故事一的思想來實現對交易的有效性的保障。

2.1.3 總結

這就是區塊鏈技術的最重要的思想——去中心化

當然,這個去中心化,包括兩層意思,第一層是貨幣的發行去中心化;另一層是貨幣的轉移(流轉)去中心化。意思就是貨幣的發行不再由像央行這樣的中心化的機構來控制,而是由整個系統來決定,至於決定貨幣發行的因素,我們後面再談;與此同時,貨幣在用戶之間的流轉也要去中心化,用戶直接將貨幣轉給另一個用戶,而不需要第三方來記賬擔保,而是所有參與的用戶都來共同擔保,大家一起來見證這筆交易,保證交易的有效性。

2.2 引人入勝

下面我們就以比特幣的在用戶之間的轉移(交易)爲例,來引出區塊鏈的各種神奇的機制。

  • 廣播交易信息
  • 喫瓜羣衆在收到交易信息後,拿出自己的小本本記下A和B的交易,一旦記錄成功,就不可撤銷,不可更改

    劃重點!!!

    1. 喫瓜羣衆爲什麼要替別人記賬本?由此引出礦工挖礦,這也是比特幣的發行機制。也就是說記賬的用戶,系統會給予它相應的獎勵。
    2. 這麼多喫瓜羣衆,每個人都拿着小本本來記賬,那麼到底最後的賬本應該採取誰的呢?因此,必須要有一種機制讓所有人都能認同最終都記賬結果的有效性,這就是比特幣採取的共識機制——基於工作量證明的共識機制

    各位看官,你們的小本本記好了嗎?

  • 繼續,在共識機制的保障下,獲得最終記賬權的羣衆會向全網廣播本次交易的交易信息,其他羣衆會覈對確認這本交易,交易達到6個確認以上就會被記錄在案。(什麼?爲什麼是6個?)

    1. 喫瓜羣衆在記錄交易信息的時候,會蓋上時間戳(Hash值),形成完整的時間鏈,這個時間戳其實是一種存在證明,表明這筆交易確實真實的發生過
    2. 每次經過確認的交易記錄都會形成一個區塊(Block)
    3. 區塊與區塊之間會通過某個神奇的算法鏈接起來

2.3 侃侃而談

好了,通過上面一番操作之後,相信各位看官對比特幣啊,區塊鏈啊這些基本的概念,還有一般的流程什麼的都有了一個感性上的認識(嗯。我好像知道區塊鏈是什麼了!)下面我們來深入的總結一下區塊鏈的關鍵思想和技術吧!

2.3.1 去中心化

  • 比特幣的網絡中,沒有一箇中心化的服務器,整個網絡由各種節點組成,共同組成了一個去中心化的網絡
  • 貨幣發行的去中心化,在比特幣網絡中,貨幣發行是由"礦工挖礦"這種機制來保障的,而這種機制是一個完全的去中心化的機制
  • 貨幣的交易流轉去中心化,比特幣的每一筆交易都是由網絡中的所有節點來共同保證其有效性和不可篡改的

2.3.2 開放性

  • 所有比特幣用戶的交易信息都被記錄在一個分佈式賬本中,這個賬本信息對所有用戶公開,任何人都可以下載這個賬本信息
  • 比特幣網絡是開放的,任何服務器都可以接入到網絡中,也可以下載到全量的賬本信息

2.3.2 不可篡改性

  • 每一筆交易信息都被存放在區塊之中,每一個新產生的區塊都是按照時間(Hash 值)的順序鏈接在一起的,時間的不可逆導致任何試圖修改區塊信息的操作都是可以被追溯的
  • 每一個新產生的區塊都應用量哈希算法來進行加密,參與哈希的因子不僅包括本次交易的信息,而且還包括上一個區塊的哈希值,這種方式下,如果對某一區塊的信息進行修改,需要更改所有區塊的信息,造假幾乎是不可能的

三、相關技術

下圖是一個真正區塊的展示,區塊中本次我們重點介紹的幾個字段有:

  • Bits
  • Nonce
  • Hash
  • Previous Block
  • Merkle Root

3.1 共識機制

http://c.biancheng.net/view/1897.html

區塊鏈技術解決了在一個去中心化網絡中進行價值表示和價值傳輸的問題,而這種分佈式的去中心化網絡中如何對數據達成一致是一個非常關鍵的問題。在我們的日常生活中,幾乎所有的事情都是達成共識的過程。而這也恰恰是比特幣最核心的突破之一,即:如何在去中心化的情況下,對某個交易事件達成一致。

3.1.1 共識機制的兩大核心

  • 經濟激勵:通過每個區塊產生一定數量的新的比特幣來獎勵參與者
  • 引入外部資源確保安全:即通過大量的外部計算來確保共識的安全性,也就是工作量證明(Proof of Work)

3.1.2 達成共識的主要過程(產生新區塊的過程)

  • 監聽:節點監聽全網的交易信息,通過驗證的交易會進入節點的內存池
  • 構建:構建一個空的區塊,稱爲候選區塊
  • 交易:從內存池中打包交易至候選區塊
  • 造頭:構造區塊頭,填寫區塊頭的下述字段
    • 版本號version字段:表示本區塊遵守的驗證規則
    • 父區塊哈希值Previous Block
    • 用merkle樹彙總全部的交易,將merkle root的哈希值填寫至merkle root字段
    • 時間戳timestamp字段
    • 填寫目標值Bits字段
  • 運算:不斷調整隨機數Nonce,進行Hash計算,使得計算出的Hash值滿足一定的要求,即:小於目標Hash。(OR:計算出來的Hash值的二進制表示具有一定數量的前導0)
    • 因爲比較二進制數,其實比較的就是前面的0,誰的0多,誰就越小唄
  • 打包:打包區塊信息,並對外廣播(gossip協議)新區塊
  • 驗證:其他節點驗證通過後,將其鏈接(Previous Block)至主鏈(難道還有側鏈?嗯。。。)
  • 等待:等待主鏈後再鏈接5個新區塊(也就是5+1個區塊)後,那麼區塊正式生效,不可篡改。

這種達成共識的過程,我們叫做基於工作量證明的共識機制。這裏有幾點可以解釋一下:

  • 工作量如何理解?
    • 不斷調整隨機數進行SHA-256運算比拼的是計算機算力,這種依託算力進行的計算是一種工作量
  • 計算Hash值小於目標Hash爲什麼就可以體現出工作量?
    • 擲骰子擲出的點數<=6,平均需要擲一次,工作量可以量化爲1;那麼要求擲出的點數<=3呢?平均需要擲2次,工作量翻倍。當目標值很小的時候,想要讓計算出的Hash值小於目標值,難道非常大
  • 隨着計算機算力的提升,如何控制計算的難度?
    • 256位二進制數構成的目標Hash值,任意改變一個bit,難道難度就翻倍,因此,可以通過調整目標Hash值來調整難度

3.1.3 Hash計算

  • 一般採用的是一次SHA-256運算,計算輸出的Hash值是一個256位的二進制數構成,爲了表示方便,採用16進製表示,那麼就是256/4=64位16進制數
  • 輸入的一點點改變,都會引起輸出的巨大變化,毫無規律可言

3.1.4 Bits和目標Hash值

Bits與難度是相對應的,它是用一個32位的整數來壓縮存儲當前256位的目標Hash值。

  • 目標Hash值:0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  • Bits:0x1D00FFFF

怎麼壓縮的呢?規則爲:

  • 目標Hash值的有效位數 = (64-8)+ 2 = 58 (也就是29個字節),那麼Bits字段的最高字節 = 29,16進製表示就是 0x1D
    • +2是因爲目標Hash值的最高位0xFF(1111 1111)> 0x80(1000 0000)
  • Bits剩下的3個字節,取Hash值的最高3個字節來存儲

3.1.5 Merkle Root

https://www.jianshu.com/p/cfc9d27a633c

https://blog.csdn.net/u011386109/article/details/62424199

在比特幣中使用梅克爾樹,是爲了將交易信息存儲在每個區塊中。

用Merkle樹來彙總所有的交易信息,並且將彙總得到的Merkle Root放在區塊頭,這樣做的好處是顯然的:

  • 所有的交易參與Hash計算,直至彙總到Merkle Root。如果有人篡改了梅克爾樹底部的一些數據區塊,會導致上一層的哈希指針不匹配,那麼他不得不一直篡改上一層的哈希指針,直到數的頂端,而此刻,篡改即將終止,因爲我們存儲了樹根節點的哈希指針,這樣就可以防止交易信息被篡改
  • 簡化支付驗證:將Merkle Root保存在區塊頭,而不是所有的完整的交易信息,可以實現一個light client,用戶只需下載非常小的區塊頭數據就可以驗證一筆交易的真實性
    • 按最長鏈原則,拉取所有的區塊頭到本地
    • 計算待驗證交易的tx_hash值
    • 找到存有tx_hash的區塊頭
    • 找到這個區塊中的Merkle Tree的一些關鍵節點,並按構造規則構建一顆Merkle-Tree-Copy
    • 比較Merkle-Tree-Copy的Root和區塊中的Root是不是一樣
  • 只要我們記住最前面的樹根節點的哈希指針,我們就可以根據哈希指針回溯到表中的任意位置

3.1.6 爲什麼通過驗證後還需要等待6個區塊

交易被打包進入區塊,並且通過驗證之後,需要再等待6個區塊纔會正式生效,主要是爲了解決"雙花"問題。那麼什麼是"雙花"問題呢?這裏,我們整理一下與此相關的幾個概念:

  • 51%算力攻擊
  • 雙花問題

3.1.6.1 51%算力攻擊

在基於工作量證明的共識機制當中,網絡中的節點比拼計算機算力進行復雜的Hash運算,最先算出結果的那個節點所生成的區塊將被全網接受,鏈接到區塊鏈上,稱爲新的區塊。那麼,當某個人或組織掌握了全網51%的算力時,就可以按"隨心所欲"的僞造交易。


3.1.6.2 雙花問題

假設小黑有666BTC,他把這些幣支付的大白同時,也把這些幣發到自己的另一錢包地址上。

最終,發給大白那筆交易先被得到了確認,並打包在區塊高度爲N的區塊內。

這時,控制了超過50%算力的小黑,發起51%算力攻擊,他通過重新組裝第N個區塊,將發給自己那筆交易打包進區塊裏,並持續在這條鏈上延展區塊,由於算力的優勢,這條量將稱爲合法的最長鏈。(用戶只承認他看到的最長鏈——最長鏈原則)

這時,轉賬給大白的那邊交易就被篡改


3.1.6.2 如何避免
  • 爲了避免雙花造成的損失,一般認爲,等 6 個區塊確認後的比特幣交易基本上就不可篡改了。

  • 一般來說,確認的區塊數越多,越安全,交易被篡改的可能性就越低。

想要實現雙花,其實就是惡意節點和安全節點相互比拼算力挖礦的過程,當惡意節點形成的惡意鏈比安全節點形成的可信鏈長的時候,惡意節點就可以實現雙花。這裏,做了一個假設,即:假設惡意節點佔全網的算力爲p,那麼安全節點就爲q=1-p,在經過第n個區塊後,惡意鏈追上可信鏈的概率爲:
(pq)n(\frac{p}{q})^n
那麼,當可信節點產生了n個區塊後,惡意節點產生了多少個區塊呢?

在這裏,中本聰假設惡意節點產生的區塊的個數服從一個泊松分佈:
P(X=k)=(λkk!)eλP(X=k)=(\frac{\lambda^k}{k!})e^{-\lambda}
這個公式表示:惡意節點產生k個區塊的概率爲:P(X=k)

因此,我們可以求出,在可信節點產生n個區塊後,惡意節點產生區塊的期望值。

k=0(λkk!)eλ(pq)nk\sum_{k=0}^\infty(\frac{\lambda^k}{k!})e^{-\lambda}(\frac{p}{q})^{n-k}

對這個數列求和,當N=6,p=10%時sum=0.0002。

表示:當可信節點產生6個區塊後,惡意節點產生區塊個數的期望值爲0.0002

也就是說,在上述假設的條件下,經過6個區塊的確認後,惡意節點造假的可能性幾乎爲0。

參考文獻

https://www.atatech.org/articles/99332
https://www.jianshu.com/p/cfc9d27a633c
https://blog.csdn.net/u011386109/article/details/62424199
http://c.biancheng.net/view/1894.html
https://www.jianshu.com/p/330736abc7e7
https://www.jianshu.com/p/04fc789c4155
https://segmentfault.com/a/1190000018245107
https://bitcoinwisdom.com/bitcoin/difficulty
https://www.jianshu.com/p/65b27f209326
https://www.cnblogs.com/fengzhiwu/p/5524324.html
https://www.blockchain.com/btc/block/0000000000000000003e1641219b1291b53e0c609d53f4d56aadcf0646cdfd36
https://baike.baidu.com/item/泊松分佈/1442110?fr=aladdin
https://www.jianshu.com/p/cfc9d27a633c
https://blog.csdn.net/u011386109/article/details/62424199

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