做者:林冠宏 / 指尖下的幽靈git
GitHub : https://github.com/af913337456/數據庫
騰訊雲專欄: https://cloud.tencent.com/developer/user/1148436/activities安全
本文不作通常入門的區塊鏈描述講解。着重簡述講解:網絡
因爲最近的開發工做是與以太坊公鏈相關的去中心化交易所,項目兩個多月之久,對區塊鏈相關的知識內容瞭解了一些,故擇文以記錄之,但求文字通俗易懂,無紕漏。因自身求學過程當中所遇坑無數,業內良文亦少之又少,深感朦朧之懂之不爽。此外,亦堅信區塊鏈技術將來必能大放光芒,因如今多應用於虛擬貨幣,故人談區塊鏈,心裏首想皆炒幣相關以內容。數據結構
咱們通常意識形態中的 鏈 是鐵鏈
,由鐵鑄成,一環扣一環。形象地,區塊鏈的也能夠這麼理解,只不過它不是由鐵鑄成,而是由擁有必定數據結構的塊
鏈接而成,這是一個最簡單的雛形
函數
見下圖區塊鏈
所謂共識
,通俗來講,就是咱們你們對某種事物的理解達成一致的意思。好比說平常的開會討論問題,又好比判斷一個動物是否是貓,咱們肉眼看了後以爲像貓,其知足貓的特徵,那麼咱們認爲它是貓。共識,是一種規則。加密
繼續咱們的會議例子。參與會議的人
,經過開會
的方式來達到談論解決問題
。
對比區塊鏈
中,參與挖礦的礦工
經過某種共識方式(算法)
來解決讓本身的帳本跟其餘節點的帳本保持一致
。讓帳本保持一致的深刻一層意思就是,讓鏈中區塊信息保持一致。
爲何須要共識
,不須要可不能夠?固然不能夠,生活中沒了共識的規則
,一切亂套。區塊鏈沒了共識的規則
,各個節點各幹各的,失去一致的意義。
這兩個例子的對應的關係以下:
會議的人
= 挖礦的礦工
開會
= 共識方式(算法)
談論解決問題
= 讓本身的帳本跟其餘節點的帳本保持一致
若是你對節點
的概念意思不懂,請先理解爲礦工
,一個節點內部包含不少角色,礦工是其中之一。
目前常見的在區塊鏈中,節點們讓本身的帳本跟其餘節點的帳本保持一致
的共識方式(算法)
有以下幾種:
下面通俗講解下每種共識算法
的概念,注意!是概念,非代碼層面的詳細實現。
它的全稱是:Proof of Work 工做量證實
。字面意思,就是誰作的活越多,誰話事權越大,必定層面上相似現實生活的多勞多得的概念。該例子會穿插生活事例,其餘的幾個講解將再也不累贅。
拿比特幣
爲例子,比特幣挖礦
就是經過計算符合某一個比特幣區塊頭
的哈希散列值
爭奪記帳權
。這個過程須要經過大量的計算實現,簡單理解就是你進行的計算量大(工做量大),你就有大機率得到記帳權,即礦工的挖出的區塊併入主鏈。
區塊頭
,區塊鏈中的區塊的頭部。你有一個飯盒,飯盒第一層,形象爲動物頭部,稱之爲頭部。第一層放着米飯,米飯就是頭部裝載着的東西哈希散列值
,一種經過數學公式計算得出的值
哈希
:數學中的散列函數散列值
: 經過哈希函數得出的值哈希公式
:hash(1,2) = 結果區塊頭
的哈希散列值
,飯盒第一層裝着的是飯。那麼這裏的這個值就是區塊頭
裝着的東西記帳權
,話事權,誰挖出的區塊
是有效的。因此說。在不少個節點都在挖礦的狀況下,你們都有可能挖出一個區塊,隨之廣播到其餘節點中去,那麼每一個節點中會根據誰先挖出爲準,確認該區塊,併入鏈中。
對比現實生活,數學競賽中,參數者 至關於礦工,一道題目,誰先作出就公佈計算過程和答案,不禁裁判判斷,由參賽者一塊兒驗證,沒問題後,宣佈該題目結束,解題者等相關信息被記錄到冊子/數據庫/網絡。以後繼續下一道題。
回到比特幣挖礦中:
計算出正確的哈希散列值
計算哈希散列值
隨着難度係數增大,會愈來愈困難同時解出問題的狀況怎麼辦?---① 答案見下一章節 http://www.javashuo.com/tag/區塊鏈分叉
注意私有節點不在討論範圍內,全部節點基於公有節點。分叉的狀況有:
舊節點
沒法承認新節點產生的區塊,爲硬分叉
舊節點
可以承認新節點產生的區塊,爲軟分叉
如今先回答上一章節留下的問題 --- ①,
① 的狀況是軟分叉
的一種,當有兩個或多個節點同時挖出了同區塊號碼的一個區塊,而後它們同時廣播信息出去,假設一個是A
,而另外一個是B
,那麼距離 A 比較近的節點,還沒等到收到其餘消息就先收到了 A 的信息,並開始確認 A 所挖出的這個區塊的信息,隨後加入A挖出的這個區塊到本身所在的公鏈中去。同理 距離 B 比較近的節點,也會先處理 B 挖出的區塊信息並添加入本身所在的公鏈中。
上面文字對應於下圖。距離 A 最近的是 節點1
,距離 B 最近的是 節點5
至此,出現了鏈的分叉。這是一種使用了一樣共識算法,共識規則下致使的分叉,
出現了這種狀況,礦工是比較好自我糾正的。因爲解題能力和礦工的數量成正比,所以兩條鏈的增加速度
也是不同的,在一段時間以後,總有一條鏈的長度要超過另外一條。當礦工發現全網有一條更長的鏈時,他就會拋棄他當前的鏈,把新的更長的鏈所有複製回來,在這條鏈的基礎上繼續挖礦。全部礦工都這樣操做,這條鏈就成爲了主鏈,分叉出來的鏈便會被拋棄掉。
若是區塊鏈軟件的共識規則被改變,而且這種規則改變沒法向前兼容,舊節點沒法承認新節點產生的區塊,且舊節點恰恰就是不升級,那麼該分叉將致使鏈一分爲二。
分叉點後的鏈
,日後互不影響,節點在站好派別後,也不會再互相廣播區塊信息。新節點
和舊節點
會開始在不一樣的區塊鏈上運行(挖礦
、交易
、驗證
等)
舉個簡單的例子,若是節點版本1.0 所接收的區塊結構字段是10個,1年後發佈節點2.0版本,2.0 兼容 1.0,可是 1.0 的不能接受 2.0 版本中多出的字段。
硬分叉的過程:
節點代碼
,新的改變了區塊鏈的共識規則且不被舊的兼容,因而節點程序出現了分叉
(software fork)開始短暫的斷開
與這些發送被本身拒絕的交易與區塊新節點的鏈接,因而整個區塊鏈網絡出現了分叉
(network fork)算力出現了分叉
(mining fork)一個實例:
2017年8月1號,Bitcoin Cash(BCH)區塊鏈成功在區塊高度478559與主鏈分離。這一新的加密貨幣默認區塊大小爲8MB,而且能夠實現區塊容量的動態調整。
因爲舊節點只承認小於1MB的區塊,因此運行BCH客戶端節點產生的區塊沒法向前兼容,將被舊節點拒絕,最後運行不一樣客戶端的礦工將會長期運行在兩條不一樣的區塊鏈上(BTC和BCH)
例子
第二種的軟分叉是不必定能由節點自我糾正的。萬全的解決方案必須依賴人力升級節點到同版本。
當 新節點全網算力大於50%
,由於新節點算力大於50%,因此不論舊節點升級不升級,最長的鏈也必定會是所有由新節點生成的區塊組成的鏈。並且,這條最長鏈最終都會是雙方都認爲合法的一條,緣由參考上面談到的最長鏈複製,因知足下面幾點因此能被複制。
當 新節點全網算力小於等於50%
,最終不能經過短的複製長的達到統一,結果是:分叉
。緣由以下。
寫到這,發現內容鋪開後比我想象中的要多。
故目前暫時分紅兩章節
,剩下的共識算法的介紹留到第二章
。
http://www.javashuo.com/article/p-wfmkkumw-cz.html
http://www.javashuo.com/article/p-uibrlpbx-y.html