bitcoin學習與心得---區塊鏈 block chain

區塊鏈 Block Chain

中文翻譯區塊鏈,是bitcoin的底層技術。
區塊鏈本質上是去中心化的分佈式數據庫,與傳統的數據庫不同,區塊鏈的數據是以數據庫的形式存在用戶的電腦上,而傳統的數據庫是中心化的,存在服務器上。爲什麼說區塊鏈是去中心化的數據庫呢,它和分佈式數據庫又有什麼區別呢?
現在很多公司的數據庫都是分佈式的,比如谷歌的數據庫,全球都佈滿了谷歌的數據庫,分佈式數據庫有很多好處,比如容災,負載均衡等,在這裏就不多做介紹。但是分佈式數據庫它的擁有人是谷歌公司,谷歌公司可以對數據庫做任何修改,如果谷歌公司修改這些數據來作惡,這將是一場災難。
對於區塊鏈所對應的去中心化的分佈式數據庫來說,就不存在這種問題,沒有人對區塊鏈的數據擁有全部的所有權,沒有人能隨意修改區塊鏈中的數據,區塊鏈的數據屬於參與區塊鏈上的所有人,不爲個人利益所修改。
對於區塊鏈爲什麼會有這樣的特點,就需要講解一下區塊鏈的原理。

區塊鏈綜述

區塊鏈簡化圖
上圖是比特幣區塊鏈的簡化模型,整個比特幣網絡就是由這一個個Block鏈接起來的。區塊2(Block2)記錄了上一個區塊(Block1)的一些信息(區塊頭的哈希值),下一個區塊又記錄了上一個區塊的信息,這樣就形成了一個類似於鏈條的數據鏈。

Merkle Tree

這裏有一個概念,叫Merkle Tree,它又稱Hash Tree。具體的內容和定義請查看wiki百科-Merkle_tree。在比特幣網絡中,它的作用是保證交易不被修改。Merkle Tree
假設有A B C D E這五筆交易,怎麼保證這5筆交易沒有別人修改?一般來說是計算hash值,或者說計算一下該交易的摘要,如果摘要沒有改變,就可以認爲交易沒有被修改。摘要的概念已經被廣泛用於現在網絡中。這裏就是先計算A B C D E這五筆交易的hash值(這個hash值也被稱爲該交易的transaction identifier 或稱txid),然後將A和B的hash值放到一起,再做一次hash運算,得到AB,同理將C和D的hash值放到一起,再做一次hash運算,得到CD,如果現在剩下一個E,它只能和自身的hash值放一起,做hash運算,得到EE。然後將AB和CD放一起,做一次hash運算,EE與自身做hash運算。經過這輪運算後會得到ABCD和EEEE這兩個hash值,然後將這兩個hash值做hash運算,得到ABCDEEEE。最終只剩下一個hash值,這個值就被稱爲Merkle root。整個A B C D E AB CD EE ABCD EEEE ABCDEEEE所構成的,就是Merkle Tree。它記錄了每筆交易的hash值,Merkle root就記錄了這五筆交易的hash值,能代表這五筆交易。在區塊鏈中,Merkle root就代表了這個區塊中所有的交易,如果Merkle root是可信的,就可以認爲這個區塊中的交易是可信的。
將這個區塊的Merkle root和上一個區塊的hash值存入到這個區塊的區塊頭中,就保證了區塊信息的可信。因爲如果你修改了某個區塊的交易信息,那麼Merkle root勢必會不一樣,導致該區塊的區塊頭的hash值改變,下一個區塊進行驗證的時候就會出錯。所以,如果要修改某一個區塊的交易值,就需要修改該區塊及以後所有區塊的信息。如果很容易就能修改以後所有區塊的信息,那麼這種安全保證就沒有任何作用,所以這裏引入另一個概念,叫Proof of Work:POW。即修改者需要以很大的代價來修改區塊鏈中的數據。

工作量證明 Proof Of Work

爲了在創建一個區塊的時候做一些額外的工作,使得創建區塊並不是那麼容易,防止爛用創造區塊的功能,提出了Proof Of Work的機制。生成區塊的時候,需要計算區塊的區塊頭的hash值,但是比特幣網絡要求該hash值符合某一條件,比如說該hash值要小於2^256 -1或hash值第一位是0,如果你產生的hash值符合該條件,你就達成了目標,能建立起區塊hash值的前5位都是0,則計算機需要計算16^5=1048576次hash值。如果要求該條件會根據網絡上的計算量動態改變,如果網絡上的算力很大,則目標越難達成,主要目的是爲了保證整個區塊鏈以一定的速度增長。

分叉Forking

在比特幣裏面,經常有個概念叫分叉,比如xx幣將在xx高度進行分叉。一個礦工如果成功得創建了一個區塊,那麼他就可以向這個區塊裏面添加交易。因爲前面說到,區塊鏈它是一個鏈條式的數據結構,從第一個區塊(創世區塊)開始,第二個區塊連接在第一個區塊的後面,第二個區塊的高度就是1,那麼連接在第二個區塊後面的區塊,高度是2。所以區塊的高度指的是,該區塊到創世區塊途中所經過的區塊的個數。
如果兩個區塊或多個區塊有相同的高度,那麼這個現象就是分叉。分叉的原因有幾種:
1.多個礦工同時或近乎同時創造出了區塊,這樣就會出現多個區塊擁有相同的高度,而其他礦工會自己選擇對自己而言最新的一條區塊,在這個區塊的基礎上繼續延伸,這樣,就會出現有的區塊被人認可度高,人們就會在這個基礎上繼續延伸,而認可度不高的區塊就會慢慢被人丟棄,最終該高度只剩下一個區塊被人維護。
2.區塊鏈網絡被攻擊,區塊鏈的攻擊者爲了修改交易,需要自己建立起一條區塊鏈,攻擊者一直不停擴展虛假的一條鏈,而誠實的礦工則在維護另外一條鏈,這樣就會形成分叉。
3.區塊鏈的共識機制改變,造成的分叉,這個將在後面講到。

交易數據

可能很多人不知道,比特幣的單位並不是個,而是satoshis(聰)。每個區塊都需要包含1筆或多筆交易。一個區塊的第一筆交易被稱爲coinbase交易,這筆交易是用來獎勵挖出這個區塊的礦工,這就是爲什麼礦工能挖到比特幣的原因了。礦工只要創建一個新的區塊,那麼就能自動完成一筆coinbase交易,他就獲得了一筆比特幣。但是這筆比特幣不能被馬上花掉,而是要等到至少100個區塊以後才能被花掉。主要是爲了防止出現上述說的分叉現象,多個礦工同時創建了同一高度的區塊,,所以他們每個人都擁有一筆比特幣,但是隻有區塊真正被人認可的時候,那筆比特幣纔是有效的,其餘人的比特幣都是無效的,保證了比特幣以一定的速率增長。
上面說到,一個區塊一定會有一筆coinbase交易,但是不要求一定要包含一筆其他交易。但是礦工還是儘量會去包含其他人的交易,因爲他可以從其他人的交易中獲得手續費。
這樣所有交易都以二進制數據的形式被存儲到這個區塊裏面,每筆交易都會計算出一個hash值,也就是上面提到的txid,然後生成Merkle Tree。這樣如果要查找一筆交易的話,只需要查找Merkle Tree中的txid,如果在Merkle Tree中找到該txid,則可以認爲該區塊中存儲了改交易。

共識機制

一般來說,整個區塊鏈網絡使用同一套共識機制,但是在某些情況下,可能共識機制會發生改變,就出現了一個情況:有的人用新的共識機制,但是有的人用舊的共識機制,這裏的情況又分兩種:
1.

[注:以上圖片來自於網絡 ,如有侵權,告知後立即刪除]

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