Featured image of post Block chain 101

Block chain 101

15分鐘瞭解最基礎區塊鏈知識,一點也不神祕。


這是一篇基礎的區塊鏈知識,搭配 Anders Brownworthdemo 網站,還有自己根據這個 demo 整理出來的小工具。若有不對的地方歡迎留言指正。


HASH

多種水果(原始 data)-> 果汁機(雜湊函數)-> 果汁( hash )

想像雜湊函數 hash function 是一臺可以把水果打成果汁的果汁機。

只要有一臺果汁機,很容易就可以把水果打成果汁;但是果汁無法被還原成水果(至少目前的科技還做不到),這過程是不可逆的。

水果 ->果汁 (很簡單可做到)

果汁 ->水果 (幾乎不可能)

hash function 的用處大概就是一臺果汁機這樣的譬喻。

假設今天去註冊 亞馬遜 購物網站,我有個密碼:hash is amazing !

亞馬遜不會記錄這個密碼,而是把 “hash is amazing !” 這字串丟到某個雜湊函數,然後生成一個 hash。

亞馬遜會把這個 hash 儲存起來( 譬如說是 f512q3e ) ,下次我登入網站輸入密碼之後生成的 hash 看看是否也是 f512q3e ,來判斷輸入的密碼是否正確。

如果哪天用戶的 hash 被盜,誰都無法單從 hash 反推得知原始的密碼,也就確保密碼的安全。解密就是一個逆推的過程,雜湊函數讓原始資料無法被逆推。

到這邊 HASH,在 data 欄位輸入 hash is amazing !

hash is amazing ! (水果) → SHA256 (果汁機) → f0722b9ae34fe075d9d08c8e0eea264108d0a04c25e1c063da059386fa140d40 (果汁)

試看看,不論 data 的長度是多少(貼一篇文章上去也可以),生成的 hash 長度都是 64 位的英文數字。 甚至可以把一個 900 MB的檔案當成 data ,產生的 hash 也是一串 64 位的英文數字。(data 長度最大似乎可以到 2 的 64 次方-1)

BLOCK

BLOCK 這邊。試看看輸入(不用按藍色 Mine 按鈕):

1
2
3
Block = 1
Nonce = 72608
Data = 空白

會生成 hash : 0000f727854b50bb95c054b39c1fe5c92e5ebcfa4bcb5dc279f56aa96a365e5a

Block , Nonce , Data 這個 3 個欄位,我們稱它作『一個區塊』( 3 個欄位都能更改)(綠色範圍圍起來的部分)

當產生的 hash 有4 個前導零的時候(背景綠色),這時候我們稱這個區塊 『被簽證』。 試看看任意更改這這 3 個欄位 ,產生的 hash 就沒有 4 個前導零,背景翻紅,這樣的區塊就 『沒有被簽證』。

回到剛剛 hash 那頁 HASH。試看看,在 data 欄位輸入 172608

一樣會得到 :0000f727854b50bb95c054b39c1fe5c92e5ebcfa4bcb5dc279f56aa96a365e5a

一模一樣的 hash。

再試看看,在 blockchain/block 頁面的三個欄位輸入:

1
2
3
Block = 3  
Nonce = 25341  
Data = 與PM戰鬥的人,應當小心自己不要成為PM

會得到 c1939cc1a59973c5e2e0936d8e3d94e331e836392c2479bd8d23862094000dde

再回到 block/hash 頁面,輸入:325341與PM戰鬥的人,應當小心自己不要成為PM

產生的 hash 跟剛剛的比較一下,是不是完全相同?( block 頁面跟 hash 頁面是否很像?做的事情幾乎都相同。) 雖然每個頁面各自有不同的欄位,從 3 個到 10 幾個不等,每個欄位對我們都有不同的意義 ( 這些資料依照需求,可以任意增加減少或是更改:產生出來的 hash 值長度都一樣 ),但在丟給 SHA256 之前,會通通先串成一個字串。

(這邊 demo 網頁的做法是很單純的由上到下由左到右,依序把各個欄位串接在一起)

也就是說:

blockchain/hash 跟 blockchain/block 還有之後的 blockchain , distributed, tokens, coinbase 頁面,都是做相同的事情:

把一串字串餵給 SHA256 ,然後得到一個 hash 值

僅此而已。

由於剛剛提到的雜湊函數的『不可逆推』特性,我們無法先預設一個 4 個前導零的 hash ,去逆推回原始字串,

這個 demo 網站的做法是其他欄位不變,只改變 nonce 這欄位。

上面提到的:『把一串字串餵給 SHA256 ,然後得到一個 hash 值 』這樣一個動作,爲了方便,我簡稱它爲一個回合

找出前導零

這個 demo 網站要找出 4 個前導零 hash 的原理很單純:

把 nonce 從 0 開始,最多到一百萬,nonce 每回合加 1 去得到一個 hash 值。如果這個 hash 值有 4 個前導零,那就停止計算。然後把這個 nonce 記下來。

一個 for 迴圈的概念而已。

丟給 sha256 的字串就會像是這樣:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
block流水號1資料 -> 某個 hash  
block流水號2資料 -> 某個 hash  
block流水號3資料 -> 某個 hash  
...  
..  
block流水號99999資料 -> 某個 hash  
...  
..  
block流水號42XXXX421資料 -> **0000**cb49ar13jgi...  
(得到一個4位前導零 hash,計算停止)nonce 爲 : 42XXXX421

按下 “Mine” 按鈕,這個 demo 網站會找出4個前導零

按下 “Mine” 按鈕,電腦就會開始做上述的事情(找到第一個讓 hash 值有 4 個前導零 的 nonce。 )

找出4個以上的前導零

這個 demo 網站就做不到,可以 clone 我的 block chain outline 專案,用 terminal 去跑。

依照 readme 指示安裝,然後打開 calcNonce.js 檔案,找到 let digit = 4 (代表會算到有 4 個前導零爲止)這一行。

要是你想要有 5 個前導零,就改成爲 let digit = 5,以此類推。最後輸入你要的 data 之後,就可以執行 node calcNonce.js找出 nonce。

在 6 個前導零、 data 百個字元以下的狀況,大約要跑 1 ~ 5 分鐘左右。還沒試過 7 個以上 ,有興趣可以跑看看。nonce 會從 0 開始計算,直到 javaScript 可以達到最大的正整數爲止。( 7 個前導零,可能需要花費數小時)

BLOCKCHAIN

上面說的都是單一個區塊,想像有多個區塊串在一起。

像是 List 的資料結構,每個區塊有個 prev 欄位,記錄上一個區塊的 hash 值。

因此,更改 a 區塊的資料 -> 影響 a 區塊的 hash 值 -> 影響 a 區塊後面的區塊 hash 值。最終,造成後面區塊的 nonce 值要通通重算,各個區塊才能符合『被簽證』形態。

Anders Brownworth 網站影片說明

以上,說明了區塊鏈技術(好單純),如何解決資料可能被篡改的問題。

想像比特幣20多個前導零、上千上萬個區塊鏈,更改其中一個區塊資料,要重算後方所有 nonce 的神話程度。

而 demo 之後的頁面(distributed, tokens, coinbase)是在說明區塊鏈如何達到去中心、驗證資料真實性:分佈式賬本。因此即使有神話般的能力算出後方所有 nonce , 還是可用『多數決』的簡單方式來驗證真僞。

最後更新 Mar 09, 2024 21:12 +0800