文章內容

article_man_pic

區塊鏈的原理

Hightech   2017-05-09    A20170509001
點閱 8689
評論 29
進階
article_pic

 

❒ 比特幣帳本(BTC ledger)

比特幣帳本是由一個一個的「區塊(Block)」連接而成的「鏈結(Chain)」,因此這種技術又稱為「區塊鏈(Block chain)」,如<圖一>所示,每一個區塊記錄著付款人與收款人以及交易金額,每一個區塊都記錄了許多筆交易,區塊與區塊之間再鏈結起來,例如:區塊3鏈結到區塊2,再鏈結到區塊1,最後再鏈結到區塊0。知識力www.ansforce.com。

 

 
圖一 比特幣帳本示意圖。
資料來源:杜宏毅博士,Block Chain的前世今生與未來,台灣網路認證公司。

 

<圖一>畫出來的只是示意圖,實際上比特幣帳本並不是像Excel一樣的表單,基本上比特幣是一種虛擬電子貨幣,因此比特幣帳本其實就是一個電腦程式,裡面有許多欄位,如<圖二>所示,其中包括:

➤雜湊(Hash)
“hash”:利用雜湊演算法(Hash algorithm)計算出雜湊值(Hash value)。
➤表頭(Header)
“previousblockhash”:前一個區塊(Block)的雜湊值(Hash value)。
“difficulty”:雜湊(Hash)必須小於「困難指數(Difficulty)」。
“time”:代表這個區塊形成的時間,以Unix作業系統格式表示。
“nonce”: 計算雜湊值(Hash value)所使用的參數。
“merkleroot”:儲存「交易(Transaction) 」的「摘要(Summary)」。
➤交易(Transaction)
“tx”:儲存「交易(Transaction)」的欄位,每一個區塊可以儲存多筆交易。
➤其他欄位
“confirmations”:代表這個區塊被確認了35561次。
“height”:代表這個區塊在比特幣區塊鏈中的排序為第277316個。

 


圖二 比特幣帳本(BTC ledger)。
資料來源:杜宏毅博士,Block Chain的前世今生與未來,台灣網路認證公司。

 

雜湊演算法(Hash algorithm)

雜湊演算法是一種從資料中建立「數位指紋(Digital fingerprint)」的方法,可以將任何長度的原始資料轉換成一個長度較短的「雜湊值(Hash value)」,而且也很難由雜湊值反推原始資料,等於是把原始資料加密了一樣,某一段資料對應到某一個雜湊值,不同資料具有不同雜湊值,就好像不同人具有不同指紋一樣,所以稱為「數位指紋(Digital fingerprint)」。常見的雜湊演算法有下列三種:
➤訊息摘要演算法(MD:Message Digest):MD2、MD3、MD4、MD5等。
➤安全雜湊演算法(SHA:Secure Hash Algorithm):SHA-0、SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)、SHA-3等。
➤RIPEMD-160:RACE Integrity Primitives Evaluation Message Digest。

 

假設小明支付小華100元,並且以電子文件記錄兩人各執一份,後來小明篡改為「小明支付小華200元」,此時即使小華拿出原本的電子文件,也只是各執一詞,無法證明那一份才是對的,那麼我們要如何證明小明有篡改文件呢?如<圖三>所示,假設使用雜湊演算法(SHA-256)計算出電子文件「小明支付小華100元」的雜湊值為「01011010」,如果電子文件被篡改為「小明支付小華200元」則雜湊值為「01011011」,因此我們只要比對雜湊值,就可以知道文件是否有被篡改。

 

 

圖三 雜湊演算法示意圖。
Icon made by Freepik from www.flaticon.com

 

區塊(Block)的意義

「區塊(Block)」是指電腦中的一組資料,以事先設定好的欄位與格式儲存,我們可以將<圖二>的比特幣帳本看成是一個區塊,我們的目標就是要將這個區塊的資料「封鎖(Block)」起來讓別人無法篡改,比特幣帳本的保護機制如下:
1.將交易(Transaction)資料的摘要(Summary)儲存在”merkleroot”欄位內。
2.將表頭(Header)資料經由雜湊演算法(SHA-256)計算後儲存在”hash”欄位內。
3.要變造交易(tx)就必須重新製作摘要(merkleroot)。
4.要重新製作摘要(merkleroot),就必須重新計算雜湊(hash)。
5.如果無法重新計算雜湊(hash),就無法變造交易(tx)。
6.利用以上機制將「區塊(Block)」內的資料「封鎖(Block)」起來。

 

問題是,如果「重新計算雜湊(hash)」很簡單,則這整個保護機制就無效,因此科學家發明了「條件雜湊(Conditional hash)」,規定「雜湊(Hash)」必須小於「困難指數(Difficulty)」,讓雜湊很難重新計算,而保護「交易(Transaction)」的內容不被篡改。

 

比特幣的採礦(Mining)

講到比特幣大家一定常常聽到網路上有許多人在「採礦(Mining)」,到底什麼是比特幣的採礦呢?我們先來看看比特幣的採礦步驟:
1.猜測一個nonce值。
2.用安全雜湊演算法(SHA)計算「雜湊(Hash)」。
3.如果計算出「雜湊(Hash)」小於「困難指數(Difficulty)」則成功建立一個區塊(Block),可以獲得50btc做為獎勵。知識力www.ansforce.com。
4.如果計算出「雜湊(Hash)」大於「困難指數(Difficulty)」則重複上面步驟。

 

我們將猜測nonce值,計算雜湊(Hash)的動作稱為「採礦(Mining)」,而我們所要採的「礦」就是計算出一個「區塊(Block)」其「雜湊(Hash)」小於「困難指數(Difficulty)」,找到了這個區塊就可以把「交易(Transaction)」打包「封鎖(Block)」起來。進行採礦的人稱為「礦工(Miner)」,計算出一個區塊可以獲得50btc的酬勞,如果其他支付交易有給手續費,則礦工還會獲得手續費。比特幣設計大約每10分鐘採出一個區塊,每採出21萬個區塊(大約4年)酬勞減半,因此比特幣總數不超過2100萬個(btc),總數固定可以提升比特幣的價值。

 

【動動腦】

比特幣的礦工計算出一個區塊可以獲得50btc的酬勞,大約每10分鐘採出一個區塊,每採出21萬個區塊(大約4年)酬勞減半,有沒有人想要試著算算看為什麼這樣比特幣的總數就會不超過2100萬個(btc)?(提示:這其實是個無窮等比級數唷!)

 

比特幣2009年發行礦工酬勞50btc,2012年12月第一次減半酬勞剩下25 btc,2016年7月第二次減半酬勞只有12.5btc,酬勞下降使手續費成為採礦動機。為了維持大約每10分鐘採出一個區塊,產生新區塊的難度會定期調整,每採出2016個區塊(大約兩週)會自動調整接下來2016個區塊的採礦難度。 為了維持大約每10分鐘採出一個區塊,產生新區塊的難度會定期調整,每採出2016個區塊(大約兩週)會自動調整接下來2016個區塊的採礦難度,比特幣的區塊大約1MB,一筆交易大約256B,一個區塊大約儲存4096筆交易,平均每秒最多只能處理7筆交易(4096筆交易/600秒=6.82),這麼慢的處理速度造成使用上的許多限制。
 

比特幣礦工最早使用Intel或AMD的中央處理器(CPU:Central Processing Unit)產品來挖礦,2013年礦工開始使用圖形處理器(GPU:Graphics Processing Unit)、現場可程式化邏輯陣列(FPGA:Field Programmable Gate Array),甚至特定應用積體電路(ASIC:Application Specific Integrated Circuit)投入使得個人礦工已經沒有收益。知識力www.ansforce.com。

 

鏈結(Chain)的意義

區塊鏈(Block chain)的「鏈結(Chain)」是指將不同的區塊以「 “hash”與“previousblockhash”」鏈結(Chain)起來,如此可以大大增加資料的安全性,如<圖四>所示,在每個區塊的「表頭(Header)」裡有「前區塊雜湊(Previousblockhash)」這個欄位。把前面一個區塊的雜湊(Hash)放進後面一個區塊的表頭(Header),而表頭用會用來計算這個區塊的雜湊(Hash),這樣等於是把前一個區塊和後一個區塊「鏈結(Chain)」起來。

 

 

圖四 鏈結的示意圖。

 

如果有人想要篡改區塊一內的「交易(Transaction)」,由於交易會影響表頭(Header)內的摘要(merkleroot),必須重新計算區塊一的「雜湊(Hash)」;區塊一的雜湊(Hash)儲存在區塊二表頭(Header)內的「 “previousblockhash”」,因此必須重新計算區塊二的「雜湊(Hash)」,依此類推。


假設這個區塊鏈有100個區塊(Block),則篡改一個區塊的交易(Transaction)就必須重新計算100次雜湊(Hash),在合理的時間內根本不可能,我們就利用這種方法使區塊鏈「牽一髮而動全身」,當區塊鏈(Block chain)愈長,前面的區塊(Block)就被保護的愈安全,而且每個結點都有比特幣帳本,只篡改一個節點也沒有用。知識力www.ansforce.com。

 

我們複習一下,「區塊(Block)」是指電腦中的一組資料,以事先設定好的欄位與格式儲存,我們使用「條件雜湊(Conditional hash)」,也就是計算出來的雜湊(Hash)必須小於困難指數(Difficulty),將這個區塊的資料「封鎖(Block)」起來,區塊與區塊之間再以「雜湊(“hash”)與前區塊雜湊(“previousblockhash”)」給「鏈結(Chian)」起來,使區塊鏈「牽一髮而動全身」,在合理的時間內根本不可能篡改。看到這裡大家是不是真的了解區塊鏈的意義了呢?下回再聽到別人說區塊鏈,別忘了問問對方到底什麼是「區塊(Block)」?又「鏈結(Chian)」了什麼呢?當對方吞吞吐吐說不清楚,別忘了把這篇文章分享給他唷!

 

【請注意】上述內容經過適當簡化以適合大眾閱讀,與產業現狀可能會有差異,若您是這個領域的專家想要提供意見,請自行聯絡作者;若有產業與技術問題請參與社群討論。

 

【資料來源】杜宏毅博士,Block Chain的前世今生與未來,台灣網路認證公司。


【延伸閱讀】其他詳細內容請參考「雲端通訊與多媒體產業,全華圖書公司」。<我要買書