區塊鏈教程(1)——區塊鏈原理
參考:廖雪峰的官方網站區塊鏈教程
https://www.liaoxuefeng.com/wiki/1207298049439968
文章目錄
- 區塊鏈教程(1)——區塊鏈原理
- 位元幣
- 1.1 區塊鏈原理
- 1.2 哈希演算法
- 1.3 哈希碰撞
- 1.4 常用哈希演算法
- 1.5 區塊鏈不可篡改特性
- Merkle Hash
- Block Hash
位元幣
位元幣是人類歷史上第一種數字貨幣,數字貨幣是基于數學加密原理構建的不可偽造的貨幣系統,而位元幣是第一個基于數學加密原理構建的分布式數字貨幣系統,位元幣使用區塊鏈技術實作了數字貨幣的可信支付,
電子貨幣本質上仍然是法幣,它仍然是由央行發行,只是以計算機技術把貨幣以物體紙幣形式的流通變成了銀行計算機系統的存款,和紙幣相比,電子貨幣具有更高的流動性,我們每天使用的網上銀行、支付寶、微信支付等,都是這種方式,
而位元幣作為一種數字貨幣,它和電子貨幣不同的是,位元幣不需要一個類似銀行的中央信任機構,就可以通過全球P2P網路進行發行和流通,這一點聽上去有點不可思議,但位元幣正是一種通過密碼學理論建立的不可偽造的貨幣系統,
傳統的基于銀行等金融機構進行交易,本質上是通過中央資料庫,確保兩個交易用戶的余額一增一減,這些交易高度依賴專業的開發和運維人員,以及完善的風控機制,
位元幣則是通過區塊鏈技術,把整個賬本全部公開,人手一份,全網相同,因此,修改賬本不會被其他人承認,位元幣的區塊鏈就是一種存盤了全部賬本的鏈式資料庫,通過一系列密碼學理論進行防篡改,防雙花,
1.1 區塊鏈原理
區塊鏈是由一個一個區塊構成的有序鏈表,每一個區塊都記錄了一系列交易,并且,每個區塊都指向前一個區塊,從而形成一個鏈條:

如果我們觀察某一個區塊,就可以看到,每個區塊都有一個唯一的哈希標識,被稱為區塊哈希,同時,區塊通過記錄上一個區塊的哈希來指向上一個區塊:

每一個區塊還有一個Merkle哈希用來確保該區塊的所有交易記錄無法被篡改,
區塊鏈中的主要資料就是一系列交易,第一條交易通常是Coinbase交易,也就是礦工的挖礦獎勵,后續交易都是用戶的交易,
1.2 哈希演算法
哈希演算法,又稱散列演算法,它是一個單向函式,可以把任意長度的輸入資料轉化為固定長度的輸出:
h
=
H
(
x
)
h=H(x)
h=H(x)
例如,對morning和bitcoin兩個輸入進行某種哈希運算,得到的結果是固定長度的數字:
H("morning") = c7c3169c21f1d92e9577871831d067c8
H("bitcoin") = cd5b1e4947e304476c788cd474fb579a
我們通常用十六進制表示哈希輸出,因為哈希演算法是一個單向函式,要設計一個安全的哈希演算法,就必須滿足:通過輸入可以很容易地計算輸出,但是,反過來,通過輸出無法反推輸入,只能暴力窮舉,
1.3 哈希碰撞
碰撞是指,如果兩個輸入資料不同,卻恰好計算出了相同的哈希值,那么我們說發生了碰撞,一個安全的哈希演算法還需要滿足另一個條件:碰撞率低, 因為輸入資料長度是不固定的,所以輸入資料是一個無限大的集合,而輸出資料長度是固定的,所以,輸出資料是一個有限的集合,把一個無限的集合中的每個元素映射到一個有限的集合,就必然存在某些不同的輸入得到了相同的輸出,
安全哈希演算法還需要滿足一個條件,就是輸出無規律,輸入資料任意一個bit(某個位元組的某一個二進制位)的改動,會導致輸出完全不同,從而讓攻擊者無法逐步猜測輸入,只能依賴暴力窮舉來破解,
假設我們相信一個安全的哈希演算法,那么我們認為,如果兩個輸入的哈希相同,我們認為兩個輸入是相同的,
如果兩份資料的哈希相同,則可以100%肯定,兩份資料是相同的,位元幣使用哈希演算法來保證所有交易不可修改,就是計算并記錄交易的哈希,如果交易被篡改,那么哈希驗證將無法通過,說明這個區塊是無效的,

1.4 常用哈希演算法
位元幣使用的哈希演算法有兩種:SHA-256和RipeMD160,
位元幣使用兩種哈希演算法,一種是對資料進行兩次SHA-256計算,這種演算法在位元幣協議中通常被稱為hash256或者dhash,另一種演算法是先計算SHA-256,再計算RipeMD160,這種演算法在位元幣協議中通常被稱為hash160,
1.5 區塊鏈不可篡改特性
Merkle Hash
在區塊的頭部,有一個Merkle Hash欄位,它記錄了本區塊所有交易的Merkle Hash:

Merkle Hash是把一系列資料的哈希根據一個簡單演算法變成一個匯總的哈希,
假設一個區塊有4個交易,我們對每個交易資料做dhash,得到4個哈希值a1,a2,a3和a4:
a1 = dhash(tx1)
a2 = dhash(tx2)
a3 = dhash(tx3)
a4 = dhash(tx4)
注意到哈希值也可以看做資料,所以可以把a1和a2拼起來,a3和a4拼起來,再計算出兩個哈希值b1和b2:

最后,把b1和b2這兩個哈希值拼起來,計算出最終的哈希值,這個哈希就是Merkle Hash:

如果有5個交易,我們可以看到,a5被復制了一份,以便計算出b3,隨后b3也被復制了一份,以便計算出c2,總之,在每一層計算中,如果有單數,就把最后一份資料復制,最后一定能計算出Merkle Hash:

從Merkle Hash的計算方法可以得出結論:修改任意一個交易哪怕一個位元組,或者交換兩個交易的順序,都會導致Merkle Hash驗證失敗,也就會導致這個區塊本身是無效的,所以,Merkle Hash記錄在區塊頭部,它的作用就是保證交易記錄永遠無法修改,
Block Hash
區塊本身用Block Hash——也就是區塊哈希來標識,但是,一個區塊自己的區塊哈希并沒有記錄在區塊頭部,而是通過計算區塊頭部的哈希得到的:

區塊頭部的Prev Hash記錄了上一個區塊的Block Hash,這樣,可以通過Prev Hash追蹤到上一個區塊,由于下一個區塊的Prev Hash又會指向當前區塊,這樣,每個區塊的Prev Hash都指向自己的上一個區塊,這些區塊串起來就形成了區塊鏈,區塊鏈的第一個區塊(又稱創世區塊)并沒有上一個區塊,因此,它的Prev Hash被設定為00000000...000,
如果一個惡意的攻擊者修改了一個區塊中的某個交易,那么Merkle Hash驗證就不會通過,所以,他只能重新計算Merkle Hash,然后把區塊頭的Merkle Hash也修改了,這時,我們就會發現,這個區塊本身的Block Hash就變了,所以,下一個區塊指向它的鏈接就斷掉了,

由于位元幣區塊的哈希必須滿足一個難度值,因此,攻擊者必須先重新計算這個區塊的Block Hash,然后,再把后續所有區塊全部重新計算并且偽造出來,才能夠修改整個區塊鏈,
修改一個區塊的成本就已經非常非常高了,要修改后續所有區塊,這個攻擊者必須掌握全網51%以上的算力才行,所以,修改區塊鏈的難度是非常非常大的,并且,由于正常的區塊鏈在不斷增長,同樣一個區塊,修改它的難度會隨著時間的推移而不斷增加,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/287438.html
標籤:區塊鏈
上一篇:Swarm主網上線日期將至,Swarm BZZ挖礦前景如何?
下一篇:智能合約實戰 solidity 語法學習 08 [ require assert modifier revert ]
