1. 程式人生 > >區塊鏈在比特幣中的應用和原理

區塊鏈在比特幣中的應用和原理

區塊鏈記賬原理

區塊鏈(1.0)是一個基於密碼學安全的分散式賬本,是一個方便驗證,不可篡改的賬本。
通常認為與智慧合約相結合的區塊鏈為區塊鏈2.0, 如以太坊是典型的區塊鏈2.0
很多人只瞭解過比特幣,不知道區塊鏈,比特幣實際是一個使用了區塊鏈技術的應用,只是比特幣當前太熱,把區塊鏈技術的光芒給掩蓋了。區塊鏈才是未來,期望各位開發人員少關心幣價,多關心技術。
本文將講解區塊鏈1.0技術是如何實現的。

雜湊函式

雜湊函式:Hash(原始資訊) = 摘要資訊    雜湊函式的具體實現方法以後再說

原始資訊可以是任意的資訊,hash之後會得到一個簡短的摘要資訊。

雜湊函式的特點:

同樣的原始資訊用同一個雜湊函式總能得到相同的摘要資訊

原始資訊任何微小的變化都會雜湊出面目全非的摘要資訊

從摘要資訊無法逆向推算出原始資訊

舉例:

Hash(張三借給李四100萬,利息1%,1年後還本息 …..) = AC4635D34DEF

賬本上記錄了AC4635D34DEF這樣一條記錄。

可以看出雜湊函式有4個作用:

簡化資訊
很好理解,雜湊後的資訊變短了。

標識資訊
可以使用AC4635D34DEF來標識原始資訊,摘要資訊也稱為原始資訊的id。

隱匿資訊
賬本是AC4635D34DEF這樣一條記錄,原始資訊被隱匿。

驗證資訊
假如李四在還款時欺騙說,張三隻借給李四10萬,雙方可以用AC4635D34DEF來驗證原始資訊

雜湊函式的這4個作用在區塊鏈技術裡有廣泛的運用。
(雜湊函式是一組函式或演算法,以後會發文章專門介紹雜湊)

區塊鏈記賬方法

假設有一個賬頁序號為0的賬頁交易記錄如下:

賬號

入賬

出賬

餘額

備註說明

王二

100

190

收到xxx貨款

張三

100

30

xxxx

李四

120

90

170

xxxx

記賬時間為:2017-10-22 10:22:02

區塊鏈在記賬是會把賬頁資訊(包含序號、記賬時間、交易記錄)作為原始資訊進行Hash, 得到一個Hash值,如:787635ACD, 用函式表示為:

 Hash(序號0、記賬時間、交易記錄) = 787635ACD

賬頁資訊和Hash值組合在一起就構成了第一個區塊。

比特幣系統里約10分鐘記一次賬,即每個區塊生成時間大概間隔10分鐘

在記第2個賬頁的時候,會把上一個塊的Hash值和當前的賬頁資訊一起作為原始資訊進行Hash,即:

Hash(上一個Hash值、序號1、記賬時間、交易記錄) = 456635BCD

這樣第2個區塊不僅包含了本賬頁資訊,還間接的包含了第一個區塊的資訊。依次按照此方法繼續記賬,則最新的區塊總是間接包含了所有之前的賬頁資訊。

所有這些區塊組合起來就形成了區塊鏈,這樣的區塊鏈就構成了一個便於驗證(只要驗證最後一個區塊的Hash值就相當於驗證了整個賬本),不可更改(任何一個交易資訊的更改,會讓所有之後的區塊的Hash值發生變化,這樣在驗證時就無法通過)的總賬本。

比特幣如何挖礦(挖礦原理)-工作量證明

記賬工作

由於記賬是有獎勵的,每次記賬都可以給自己憑空增加一定數量的個比特幣(當前是12.5比特幣,博文寫作時每個比特幣是4萬人民幣以上,大家可以算算多少錢),因此就出現大家爭相記賬,大家一起記賬就會引起問題:出現記賬不一致的問題,比特幣系統引入工作量證明來解決這個問題,規則如下:

一段時間內(10分鐘左右,具體時間會與密碼學難題難度相互影響)只有一人可以記賬成功

通過解決密碼學難題(即工作量證明)競爭獲得唯一記賬權

其他節點複製記賬結果

不過在進行工作量證明之前,記賬節點會做進行如下準備工作:

收集廣播中還沒有被記錄賬本的原始交易資訊

檢查每個交易資訊中付款地址有沒有足夠的餘額

驗證交易是否有正確的簽名

把驗證通過的交易資訊進行打包記錄

新增一個獎勵交易:給自己的地址增加12.5比特幣

如果節點爭奪記賬權成功的話,就可以得到12.5比特幣的獎勵。

工作量證明

區塊鏈記賬原理我們瞭解到,每次記賬的時候會把上一個塊的Hash值和當前的賬頁資訊一起作為原始資訊進行Hash。
如果僅僅是這樣,顯然每個人都可以很輕鬆的完成記賬。
為了保證10分鐘左右只有一個人可以記賬,就必須要提高記賬的難度,使得Hash的結果必須以若干個0開頭。同是為了滿足這個條件,在進行Hash時引入一個隨機數變數

用偽程式碼表示一下:

Hash(上一個Hash值,交易記錄集) = 456635BCD

Hash(上一個Hash值,交易記錄集,隨機數) = 0000aFD635BCD

我們知道改變Hash的原始資訊的任何一部分,Hash值也會隨之不斷的變化,因此在運算Hash時,不斷的改變隨機數的值,總可以找的一個隨機數使的Hash的結果以若干個0開頭(下文把這個過程稱為猜謎),率先找到隨機數的節點就獲得此次記賬的唯一記賬權。

驗證

在節點成功找到滿足的Hash值之後,會馬上對全網進行廣播打包區塊,網路的節點收到廣播打包區塊,會立刻對其進行驗證。

如果驗證通過,則表明已經有節點成功解迷,自己就不再競爭當前區塊打包,而是選擇接受這個區塊,記錄到自己的賬本中,然後進行下一個區塊的競爭猜謎。
網路中只有最快解謎的區塊,才會新增的賬本中,其他的節點進行復制,這樣就保證了整個賬本的唯一性。

假如節點有任何的作弊行為,都會導致網路的節點驗證不通過,直接丟棄其打包的區塊,這個區塊就無法記錄到總賬本中,作弊的節點耗費的成本就白費了,因此在巨大的挖礦成本下,也使得礦工自覺自願的遵守比特幣系統的共識協議,也就確保了整個系統的安全。

說明

礦工的收益其實不僅僅包含新發行的12.5比特幣獎勵,同時還有交易費收益(本文忽略一些細節是為了讓主幹更清晰)。

有興趣的同學可以看看圖中區塊都包含了那些資訊,紅箭頭標示出的是本文涉及的資訊。