比特幣背後的密碼學原理(連載三)

買賣虛擬貨幣

目錄:

           序言

一.      密碼學理論

二.      比特幣實戰

三.      區塊鏈

四.      挖礦原理

五.      總結

比特幣背後的密碼學原理(連載一)

比特幣背後的密碼學原理(連載二)



三.   區塊鏈


區塊鏈可以理解為資料結構概念中的連結串列(和線性表略有不同的是可能有分叉),這裡我們只需要大致瞭解區塊資料結構以及每一塊大致的意思,這些結構資訊將會在交易和挖礦部分進行詳細講解。


區塊鏈可以理解為執行在去中心化網路中的,所有節點(挖礦節點)共同維護的交易資料庫,這個資料庫是以鏈式的形式組織交易資料的,每一個連結串列的塊被稱為區塊或者block。


3.1 區塊結構


區塊是一種被包含在公開賬簿(區塊鏈)裡的聚合了交易資訊的容器資料結構。它由一個包含後設資料的區塊頭和緊跟其後的構成區塊主體的一長串交易組成。

上表中的1-9應該是1-9個位元組,否則會引起歧義。

3.2 區塊頭


區塊頭由三組區塊後設資料組成。首先是一組引用父區塊雜湊值的資料,這組後設資料用於將該區塊與區塊鏈中前一區塊相連線。第二組後設資料,即難度、時間戳和nonce,與挖礦競爭相關。第三組後設資料是merkle樹根(一種用來有效地總結區塊中所有交易的資料結構)。

Nonce、難度目標和時間戳會用於挖礦過程,Merkle根用來索引和組織該區塊所有的交易資訊,其結構見下一節。


因此區塊頭之間的連線大約像下圖所示:


從上圖我們可以知道如何避免雙重支付問題,因為收款人有辦法對這筆支付之前的所有訊息進行檢索直至追溯到原始的挖礦區塊,實際上比特幣世界裡的每一枚比特幣都是被標記可溯源,雙重支付是可以避免的。


3.3 Merkle Tree


Merkle Tree,是一種樹(資料結構中所說的樹),網上大都稱為Merkle Hash Tree,這是因為 它所構造的Merkle Tree的所有節點都是Hash值。Merkle Tree具有以下特點:


1. 它是一種樹,可以是二叉樹,也可以多叉樹,無論是幾叉樹,它都具有樹結構的所有特點;


2. Merkle樹的葉子節點上的value,是由你指定的,這主要看你的設計了,如Merkle Hash Tree會將資料的Hash值作為葉子節點的值;


3 非葉子節點的value是根據它下面所有的葉子節點值,然後按照一定的演算法計算而得出的。如Merkle Hash Tree的非葉子節點value的計算方法是將該節點的所有子節點進行組合,然後對組合結果進行hash計算所得出的hash value。


例如,下圖就是一個Merkle Hash Tree形狀,如果它是Merkle Hash Tree,則節點7的hash value必須是透過節點15、16上的value計算而得到.


在處理比對或驗證的應用場景中時,特別是在分散式環境下進行比對或驗證時,Merkle Tree會大大減少資料的傳輸量以及計算的複雜度。例如,就拿圖一舉例,假如是 15,16.......30是一個個資料塊的hash值,我把這些資料從A傳輸到B,資料傳輸到B後,我想驗證下傳輸到B上的資料的有效性型(驗證資料是否在傳輸過程中發生變化),只需要驗證A 和 B上所構造的Merkle Tree的root節點值是否一致即可,如果一致,表示資料是有效的,傳輸過程中沒有發生改變。假如在傳輸過程中,15對應的資料被人篡改,透過Merkle Tree很容易定位找到(因為此時,節點0,1,3,7,15對應的hash值都發生了變化)


需要解釋的是交易資料是怎麼構建成數的呢,其實很簡單:首先將所有交易作為葉子節點,兩兩相鄰分組(總的交易數量如果是奇數就把單個的那個複製一份),然後對每一對交易分別計算雜湊並依此向上構建樹直至根節點,如下圖所示:

4.  交易

再次強調的是,比特幣網路中流轉的是交易資訊,每個賬戶的餘額是透過交易資訊推算出來的,交易資訊是雙向的,有一個輸入必定對應一個輸出。


4.1交易輸入輸出

每一筆交易,out的總額應該等於in的總額。但是,在這個交易單裡,只會有out的Value,沒有in的Value,而是透過in的Pervious與index,追溯到上一個交易單的某一個out,獲得Value。


一次send bitcoin,剩下的錢,應該out給自己,否則這個錢就丟了。

情況列舉:


我有10個BTC,是某一次交易獲得的,我要送給朋友A,10個BTC。這時候,有一個in,一個out。


我有10個BTC,是某一次交易獲得的,我要送給朋友A,5個BTC,這時候,有一個in,兩個out,一個指向朋友5個BTC,一個指向我自己,得到剩下的5個BTC。


我有10個BTC,是以前的兩次交易獲得的,我要送給朋友A,10個BTC,這時候,有兩個in,一個out。


我有10個BTC,是以前的兩次交易獲得的,其中一次獲得了6個BTC,另一次獲得了4個BTC,我要送給我的朋友7個BTC,這時候,有兩個in,兩個out。


比特幣交易的基本單位是未經使用的一個交易輸出,簡稱UTXO。UTXO是不能再分割、被所有者鎖住或記錄於區塊鏈中的並被整個網路識別成貨幣單位的一定量的比特幣貨幣。這句話什麼意思呢?比特幣交易除了挖礦獲取以外,都是零和的,因為區塊鏈不維護餘額資訊也沒有餘額概念,區塊鏈只有交易資訊。舉個例子,你有10個比特幣現在需要支付2個出去,那麼交易資料維護的是一個輸入(未經使用的10個比特幣)和2個輸出(一個是2個幣對應的地址),還有一個是8個幣對應地址是你自己的地址。

4.2交易過程


交易的基本訴求,是付款人(payer)匯款給收款人(payee)。技術挑戰是加密(cryptography),目的是不讓第三者截獲甚至篡改匯款金額。


下圖解釋了 Owner0 給 Owner1以及後續 匯款的交易機制,截圖如下。

1. Owner0 先查到 Owner1 的公鑰。用 Owner1 的公鑰(Public Key)把匯款詳情加密。這樣,只有 Owner1 本人用自己的私鑰(Private Key),才能開啟加了密的匯款詳情。在圖例中,沒有畫匯款詳情。不過這個小小的敘述的疏忽無妨大雅。


2. 為了方便 Owner1 驗證這筆匯款的確來自 Owner0,而不是別人,Owner0 發出的匯款單裡,除了有加了密的匯款詳情,還有 Owner0 的數字簽名(Signature)。Owner1 拿到匯款時,為了驗證這筆匯款的確來自 Owner0,他可以用 Owner0 的公鑰,來驗證匯款單中 Owner0 的數字簽名。


3. Owner0 發出匯款單時,匯款單不僅僅投遞到 Owner1,而且還要廣而告之,任何人只要願意參與 BitCoin 審計,都可以收到全球所有人發出的所有匯款單。


4. 沿用 1、2、3 的原理,Owner1 給 Owner2 匯款,然後 Owner2 給 Owner3 匯款。BitCoin 透過 Hash 機制,把涉及同一枚 BitCoin 的所有匯款交易(Tranaction)串連起來,目的是為了追查重複付款(double spending)的欺詐行為。


單獨來看交易建立過程:

收款方對交易進行驗證:



四.  挖礦原理


挖礦的本質意義是挖礦節點爭奪記賬權!主觀上來說,挖礦節點獲得了挖礦獎勵及交易費,客觀上來說,這保證了區塊鏈按照特定規則持續穩定的被維護。


挖礦的具體實現就是在難度一定的情況下透過暴力雙SHA256雜湊運算獲取滿足難度taget的Nonce值,所謂的工作量證明就是無數次雜湊運算窮舉並比對的過程。


“挖礦”演算法我們可以參考區塊頭結構解說如下:


第一步:找到區塊版本號version。

第二步:找到上一個區塊的hash值(父區塊雜湊值):prev_hash。

第三步:輸入記錄交易的hash樹的根節點hash值(Merkle根):root_hash。

第四步:更新的時間(時間戳):time。

第五步:全網當前難度(難度目標):difficulty


針對難度目標需要說明:


難度在區塊中以“尾數-指數”的格式,編碼並儲存,這種格式稱作“難度位”。這種編碼的首位元組表示指數,後面的3位元組表示尾數(係數)。以區塊277316為例,難度位的值為0x1903a30c,0x19是指數(exponent)的十六進位制格式,後半部0x03a30c是係數(coefficient)。


第六步:自己找一個隨機數Nonce:這個就是反覆試的部分,不斷遞增該數字並做雜湊運算直到對應雜湊值小於難度指定的taget值。


把以上6個引數作為輸入,做二次SHA256運算,形似於

SHA256(SHA256(version , prev_hash , root_hash , time , difficulty, random))

最終得到結果result。最後把結果result提交給系統,由系統判斷這個計算結果是否有效(result<target為有效)。若判定結果為有效,你就產生了一個新的區塊,並會告知全網。


target透過difficulty可以計算得到:


target = coefficient * 2^(8 * (exponent – 3))


演算法規定:一個新的區塊的第一筆交易必須將特定數目的比特幣發到某個地址,當然這個地址肯定會設成挖礦人自己的比特幣地址,從而獲得系統的比特幣獎勵。



五.  總結


比特幣理論以密碼學為支撐,構建了一個完備、安全、去中心化的數字貨幣體系,解決了數字資產所有權問題、雙重支付問題、現實世界的通貨膨脹問題甚至還預留了機制使得構建在資產轉移之上的智慧合同成為可能。比特幣當然是偉大的創造,期待比特幣有更好的未來。

另外,本書成文過程中參考了王秒等老師翻譯的《精通比特幣》,李鈞等老師的《比特幣》以及巴位元社羣的大量知識,感謝他們。



作者簡介:

 怒馬,數字貨幣愛好者,正經大學畢業,愛技術,持續好奇心擁有者。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;