透過範例了解區塊鏈的細節:Hash、block、blockchain、Distributed、token
BlockChain demo 101作者:Anders Brownworth
他透過非常清楚的說明,示範了區塊鏈底層的運作原理,以下是我自己的一些看法與觀點。
使用git將code同步到你的電腦上,若沒有安裝git,可以到此網址下載。
使用npm install安裝環境。若沒有npm則到此網址安裝nodejs。
這裡面的code包含著docker,透過docker-compose在你的電腦,建立出一台http server的容器環境,裡面運行著blockchain demo,是由javascript所寫的網頁。
執行npm start啟動環境,此時此終端機保持開啟勿關閉。
在你的瀏覽器上輸入localhost:3000,即可以連到你自己的demo網站。
SHA256 Hash 雜湊
名稱來自於安全雜湊演算法2的縮寫,一種密碼雜湊函式演算法標準,由美國國家安全局研發。輸入值之後會得到一串Hash,就算輸入資料只差一位或是一個字,得到的Hash也會完全不同,所以無法從Hash反推原本的資料是什麼。但只要輸入相同的值,得到的Hash是完全一樣的。
Block區塊
block由hash衍伸而來,多了區塊編號,及Nonce。綠色區塊表示,此區塊已經簽署過了,且是有效的。
紅色的區塊表示未簽署、未驗證、無效的區塊。此時,為了驗證此區塊,我們會定義一個規則來使區塊有效,即稱為共識。常見的共識有POW、POS、DPOS等。
在此Demo中的”共識”,程式碼定義的是Hash開頭為四個0,代表此區塊有效、簽署、驗證過的區塊。由於Hash值會依照輸入的資料而有所改變,因此這裡有一個Nonce欄位,來幫助”尋找”Hash值,Hash值=輸入的Data + Nonce值。Nonce是一個數字,從1開始依序遞增,直到找到Hash開頭為0000為止,尋找Nonce值的過程,稱為”挖礦”。
我們可以觀察比特幣,他的共識機制是需要Hash值開頭為19個0,才為有效區塊,圖片來源於https://blockchair.com/
在此過程中,Nonce值會不斷累加,例如此區塊的Nonce值達到824,048,282,這個數字從1開始不斷窮舉的過程(挖礦),勢必需要大量的CPU來運算,這個過程就稱為POW(工作量證明),也衍生出所謂的專用礦機,去追求每秒的運算速度(算力)。
BlockChain區塊鏈
最初的區塊稱為創始區塊,之後產出的每一個區塊,依序接在後面,稱為”區塊鏈”。每一個區塊都有Hash值,而Prev則是前一個區塊的Hash值,此時的Hash值=輸入的Data+前一個區塊的Hash值(Prev)+Nonce值。
當任一個區塊中的資料被修改過後,就會導致Hash值變動,變成無效區塊,因為不符合共識機制(此demo為開頭四個0),進而影響後續的區塊。
若要把區塊變成有效,則必須從第一個無效區塊開始,一個一個重新計算Nonce值(挖礦)。當區塊越來越多,就越難修改前面區塊的資料,但這顯然還不夠,對吧。
Distributed Blockchain分散式區塊鏈
為了防止區塊鏈上的資料被竄改,因此有了分散式區塊鏈,每一個Peer都是一個”節點”,上面存在著一模一樣的區塊鏈資料。此demo中有三個節點。
假設Peer A節點的區塊鏈被駭,區塊資料遭到修改,且被駭客重新挖礦並驗證。
就算駭客完全掌握了Peer A節點,並重新產生最新的Hash值。
只需檢查各區塊鏈的最後一個區塊的Hash值。就可以知道區塊鏈之間的資料有無差異。
在我們檢查Peer B、Peer C節點的最後一個區塊時,就會發現Peer A節點的Hash值不同。此時就可以定義Peer A節點有問題。進而確保B、C節點上的資料是正確的。若將此複製到全球幾十萬台節點上,就會更難修改,因此有所謂的51%攻擊理論。
指的是駭客必須要掌握區塊鏈網路上的51%節點,才擁有能夠對區塊鏈修改的權力,例如將區塊鏈上的所有交易都改為對自己發送資金等。但顯然的是網路節點越分散且越多(分布在各國家、使用不同的網路、電網、不同的區塊鏈客戶端),駭客就越難獲得51%以上的節點。
Tokens代幣
顯然地,用區塊鏈儲存資料有一定的防偽用途,若我們拿來儲存金錢交易的資訊,就可以防止交易紀錄被竄改。上述的區塊資料內,寫入了每一筆交易,每一個區塊含有多筆交易。
若試圖修改交易的金額,或是轉帳對象,顯然是徒勞的,因為必須要重新驗證區塊以及還有其他節點的區塊鏈做備份。但這還有一個問題,究竟怎麼知道此帳戶是否有足夠的餘額轉賬?
CoinBase以代幣為基礎
我們在每一個區塊中加入CoinBase欄位,寫入這個區塊鏈系統,在生成區塊時,要發給某人多少錢。上圖是在產出區塊的同時,此區塊鏈系統給Anders 100元,而當Anders轉帳給Sophia 10元,這個行為會寫入在區塊鏈的資料內,下次當Sophia想轉帳給其他人時,就能夠從前面的區塊中,查詢sophia剩餘的金額。
在實際案例中,比特幣、以太幣區塊鏈本身均會給挖出區塊的礦工小費,來獎勵他們運行節點、產出區塊、以及維護區塊鏈網路安全性。在挖礦的當下,優先找到Nonce值的那個節點就稱為挖礦成功,此節點能夠獨自拿走挖礦獎勵。
礦工收到的費用加總:區塊鏈的區塊獎勵+用戶基本交易費用+用戶為了提高交易速度給礦工的小費等。
在我們上述中提到,Nonce值的尋找,就是挖礦。而當共識機制變動,例如:比特幣,從找19個0開頭的Hash,變成找20個0開頭的Hash,意味著找到Nonce值花費的時間會更長,這就是挖礦難度的提升。
區塊鏈分叉,實際上就是區塊鏈網路,不一致的現象。
在區塊鏈算出Nonce值的節點,會優先將他算出來的Nonce值結果,”廣播”到鄰近的區塊鏈節點。其他的節點則會驗證他的結果,若成功則每一個區塊鏈節點都會認同他的區塊,將挖礦獎勵讓給他,繼續計算下一個區塊。
當區塊鏈的節點越來越多,就有可能發生”同時”算出Nonce值的節點。這裡指的”同時”是,在網路延遲的情況下,有兩個以上的節點,在很短的時間內,都將自己計算的結果,廣播到區塊鏈的網路上,而全網路的節點,最後都會收到兩種區塊(但內容不同,稱為分叉),直到下一個區塊,出現在這兩個區塊其中一個的後面,那個鏈就會成為最長的鏈,全網節點將保留最長的鏈,捨棄短的區塊。