比特幣原理

說明

本文儘量以最簡潔的語言概況比特幣工作的流程及原理。並對一些關鍵問題的解決之道做陳述,例如雙花問題,鏈的分叉問題,當然還有比較基礎的一些技術手段,例如非對稱加密,簽名,工作量證明等。

流程及原理

總體的原則

  • 賬戶地址是分配的公鑰,用對應的私鑰進行簽名;公鑰全網公開,可以驗證簽名身份。

  • 比特幣的區塊記的是一些轉賬記錄,區塊有統一的順序,下一個區塊指向前一個區塊的hash值,形成一條鏈。例如:A轉給B一個序列號爲12345比特幣、C轉給F序列號爲23456的一個比特幣等;通過對區塊的這些記錄進行計算就可得到每個賬戶的餘額。

  • 挖礦就是生成一個隨機數然後和區塊內容進行hash,得到的hash值滿足一定要求,例如開頭前十位均爲0,並通過0的個數來調整挖礦難度,保證十分鐘左右出一個區塊。得到這樣的隨機數的節點會對交易進行驗證,並公佈驗證結果和隨機數到全網,其它幾點會進行驗證。

  • 挖礦成功會有獎勵,一開始50個比特幣,每隔21萬個區塊會減半大概4年左右,到2140年總的比特幣會挖完,2100萬個。

  • 偶然情況下,一個blockchain上會產生分支。這種情況是因爲,有時候兩個挖礦者幾乎同時驗證出來一個區塊的交易。他們同時公佈到網絡裏,有些人用一個方法更新他們的blockchain,另一些人用另外一個方法更新他們的blockchain。在這裏插入圖片描述
    這就造成了我們想要避免的情況 ——這種情況,交易的順序就不清楚了,而且誰有哪個比特幣也就不清楚了。有一個簡單的辦法可以用來消除分支。規則是這樣的:如果分支情況出現,那麼網絡上的人們繼續保持兩個分支,任何情況下,挖礦者只在最長的那個blockchain上工作。

    假設我們有一個分支,有一些挖礦者先收到block A,另一些挖礦者先收到的是block B。那些收到block A的挖礦者將要繼續沿着他們的分支挖礦,而其他人沿着Block B的分支挖礦。我們假設在B分支上的挖礦者先成功挖到下一個block:
    在這裏插入圖片描述
    當他們收到這個消息後,在A分支的人會注意到現在B分支是最長的,於是就會轉換到B的分支。在A分支上的工作就會迅速的停止,這樣每個人就會都在同一個順序的blockchain上工作了。然後block A就會被忽略。當然,所有在block A裏面的待定交易將會繼續保持待定狀態,隨後會在B分支上被放到新的block裏,這樣,所有的交易最終還是會被驗證的。

    同理,如果在分支A上的挖礦者先挖到下一個block,那麼在B分支上工作的人就是停止,轉到A分支上。

    不論結果是什麼,這個過程保證了blockchain有統一的順序。在比特幣中,一個交易能不算作確認直到 1)它存在於最長的分支中的block裏,2)至少有5個驗證過的block在其後面得到驗證。這種情況,我們說這個交易有了“6個確認”。這給了整個網絡時間去統一block的順序。

具體步驟

例如A和B之間發生比特幣交易

礦工需要計算區塊的hash值:BlockNHash=H(tn, Merkle-root, Block(N-1)Hash, nounce),其中:

  • tn爲時間戳
  • merkle-root當前記錄區塊hash值的merkle tree的根,有關merkle tree是一個hash 二叉樹,葉子節點爲區塊,父節點爲葉子節點的hash值
  • Block(N-1)Hash爲上一區塊的的hash值
  • nounce是需要計算的滿足條件的hash值

1、當A和B發生比特幣交易時,該交易保存在交易池(Transaction Pool)中,處於待確認狀態,交易需要明確告知交易方向、交易對象、將支付給曠工多少手續費等基本信息;

2、 曠工從交易池中,根據交易記錄的大小(Size)、交易的手續費等多種因素,選擇出自己偏好的交易記錄(如果一筆交易的size太小、手續費過低,可能會導致該筆交易長時間處於“待確認”的狀態,不被執行)。某筆交易被曠工選中後,會通過哈希函數算出Merkle根,曠工把這個Merkle根作爲自變量,放進接下來自己要計算的哈希函數Bn中;

3、曠工基於選中的Merkle根,以及其他變量,通過算力來尋找隨機數nounce,使得新區塊的哈希值小於等於目標哈希,例如00000000000xxxxxxxx;

4、 如果該曠工第一個找到該隨機數nounce,並滿足前述條件,廣播到全網,其產生的新區塊將有可能被加入主鏈,因爲需要六個區塊確認。

5、如果該區塊被確認加入主鏈,包含在這個區塊的所有交易纔會被“確認”,即這些交易將會從原來Pool中“待確認”的狀態變成”交易完成“的狀態,並不再保留在Pool裏;

6、曠工因爲第一個找到新區塊,會獲得一定數量的比特幣獎勵,以及區塊中所有交易記錄事先列明的交易費。

雙花問題

A轉給B一個序列號爲123456的比特幣,A轉給C一個序列號爲123456的比特幣;這裏把同一個比特幣給兩個人,也就是花費兩次,稱爲雙花問題。

假設A要同時給B和C同樣的交易。

  • 一個可能性就是讓A去驗證同時帶有兩個交易的一個block。假設A擁有百分之一的計算能力,那麼A有可能比較幸運的驗證出了這一個block。不幸的是,這個雙重花費將會馬上被其他人發現並且拒絕,儘管A解決了工作證明裏的難題。所以這個可能性我們不用擔心。

  • 另一種可能性是,A試圖分別公佈兩個交易。A可能給一部分挖礦者公佈一個交易,給另一部分挖礦者公佈另一個交易,A希望讓兩個交易都得到驗證。這種情況下,如我們剛纔所說,網絡最終只會確認其中一個交易。所以這個也不是問題。

  • 還有一種可能是,A = B,也就是說A試圖將一個幣給C,同時A又將那個幣給A自己,因爲A自己可以有多個賬戶。這種情況下,Al的策略是等到C接受了這個比特幣,也就是在交易在最長的blockchain中被確認6次之後。A再試圖去解決另外一個擁有A發給自己的交易的那個block分支。但是,這個時候A已經比最長的blockchain晚了6步。A很難在跟得上最長的分支了。其他的挖礦者不會幫助A,因爲他們都需要在最長的分支上工作才能得到獎賞。除非A在解決工作證明的時候能夠比網絡上其他人結合起來還快(也就是說她大概有多於整個網絡50%的計算能力)。當然,A可能會偶然幸運,在百分之一的算力的情況下能解決一個block,但是同時趕上6個的話相當於是 1/100^6 。這種情況概率可以說是幾乎爲0。
    在這裏插入圖片描述

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