# BlockChain Demo：了解區塊鏈運作原理及挖礦

By [kiralee.eth](https://paragraph.com/@kiralee) · 2022-07-29

---

透過範例了解區塊鏈的細節：Hash、block、blockchain、Distributed、token

BlockChain demo 101作者：Anders Brownworth

他透過非常清楚的說明，示範了區塊鏈底層的運作原理，以下是我自己的一些看法與觀點。

環境準備：
-----

> [https://github.com/anders94/blockchain-demo](https://github.com/anders94/blockchain-demo)

![](https://storage.googleapis.com/papyrus_images/640a5d63ce528c6a738d1108873d785451d716fbc1c941af833d4a9032500a0c.png)

> 使用git將code同步到你的電腦上，若沒有安裝git，可以到此網址下載。
> 
> [https://git-scm.com/](https://git-scm.com/)

![](https://storage.googleapis.com/papyrus_images/bde2b4adf753edc9c9c599cf9fe1e0f6a7017ec3ef8d21423b1f4419e3e54c14.png)

> 使用npm install安裝環境。若沒有npm則到此網址安裝nodejs。
> 
> [https://nodejs.org/en/](https://nodejs.org/en/)
> 
> 這裡面的code包含著docker，透過docker-compose在你的電腦，建立出一台http server的容器環境，裡面運行著blockchain demo，是由javascript所寫的網頁。

![](https://storage.googleapis.com/papyrus_images/f2d6a814a79bd84db142bcfa12db9ad242f93dbdb374958153fdaffea397c6c7.png)

> 執行npm start啟動環境，此時此終端機保持開啟勿關閉。

![](https://storage.googleapis.com/papyrus_images/64aaf357837d1666d3243d0856cd184557b12295c68f769d46e6088e343e90a5.png)

> 在你的瀏覽器上輸入localhost:3000，即可以連到你自己的demo網站。

Blockchain演示及說明：
----------------

> **_SHA256 Hash 雜湊_**

![](https://storage.googleapis.com/papyrus_images/d3f7b39fe229de6658b7ff817de012c3b90fbe84a2eec49b435798caf84d8374.png)

![](https://storage.googleapis.com/papyrus_images/53e8f36644cf95637a8505084aa1f8da7ac9881a9bda0fe4230394d104b9dcea.png)

> 名稱來自於安全雜湊演算法2的縮寫，一種密碼雜湊函式演算法標準，由美國國家安全局研發。輸入值之後會得到一串Hash，就算輸入資料只差一位或是一個字，得到的Hash也會完全不同，所以無法從Hash反推原本的資料是什麼。但只要輸入相同的值，得到的Hash是完全一樣的。

> **_Block區塊_**

![](https://storage.googleapis.com/papyrus_images/85a84e0608176004dc1f8289e31e18761c2845d6ee4c17c8768c5377c3fe0849.png)

> block由hash衍伸而來，多了區塊編號，及Nonce。綠色區塊表示，此區塊已經簽署過了，且是有效的。

![](https://storage.googleapis.com/papyrus_images/7dcd8865366617c1593938fc2b259cc7b47a969c44891ab91bc6a31f0efccdc1.png)

> 紅色的區塊表示未簽署、未驗證、無效的區塊。此時，為了驗證此區塊，我們會定義一個規則來使區塊有效，即稱為共識。常見的共識有POW、POS、DPOS等。

![](https://storage.googleapis.com/papyrus_images/f880ea9e65476631aa561700f9ae358240965b97d87d9ee9e5541072088f14e8.png)

> 在此Demo中的”共識”，程式碼定義的是Hash開頭為四個0，代表此區塊有效、簽署、驗證過的區塊。由於Hash值會依照輸入的資料而有所改變，因此這裡有一個Nonce欄位，來幫助”尋找”Hash值，Hash值=輸入的Data + Nonce值。Nonce是一個數字，從1開始依序遞增，直到找到Hash開頭為0000為止，尋找Nonce值的過程，稱為”挖礦”。

![](https://storage.googleapis.com/papyrus_images/7af52f2fa1e4a96b0bdb02d398bbcf8871215ae87e2ddd2836936877965a9370.png)

> 我們可以觀察比特幣，他的共識機制是需要Hash值開頭為19個0，才為有效區塊，圖片來源於[https://blockchair.com/](https://blockchair.com/)

![](https://storage.googleapis.com/papyrus_images/1e58e43db11b1b848d62cc4839ff8c7c307202adfac94dd768f8b9fde4064b84.png)

> 在此過程中，Nonce值會不斷累加，例如此區塊的Nonce值達到824,048,282，這個數字從1開始不斷窮舉的過程(挖礦)，勢必需要大量的CPU來運算，這個過程就稱為POW(工作量證明)，也衍生出所謂的專用礦機，去追求每秒的運算速度(算力)。

> **_BlockChain區塊鏈_**

![](https://storage.googleapis.com/papyrus_images/c02f14061749d89089a5ecfd1b0f4c89426aaaa65913620e2536bdf28fb3a2ed.png)

> 最初的區塊稱為創始區塊，之後產出的每一個區塊，依序接在後面，稱為”區塊鏈”。每一個區塊都有Hash值，而Prev則是前一個區塊的Hash值，此時的Hash值=輸入的Data+前一個區塊的Hash值(Prev)+Nonce值。

![](https://storage.googleapis.com/papyrus_images/d7cf7592093a2c4bc9825207ee389baec3212e37d3e0cf557ba7e27501c2636d.png)

> 當任一個區塊中的資料被修改過後，就會導致Hash值變動，變成無效區塊，因為不符合共識機制(此demo為開頭四個0)，進而影響後續的區塊。

![](https://storage.googleapis.com/papyrus_images/d3423a688c7a877692a45556af5f9ffee6279505307e93ba554c9a313b8d12f9.png)

> 若要把區塊變成有效，則必須從第一個無效區塊開始，一個一個重新計算Nonce值(挖礦)。當區塊越來越多，就越難修改前面區塊的資料，但這顯然還不夠，對吧。

> **_Distributed Blockchain分散式區塊鏈_**

![](https://storage.googleapis.com/papyrus_images/21a46cdaab05234fb820dd3ff13316468cb687469f221de570c155be7f37105e.png)

> 為了防止區塊鏈上的資料被竄改，因此有了分散式區塊鏈，每一個Peer都是一個”節點”，上面存在著一模一樣的區塊鏈資料。此demo中有三個節點。

![](https://storage.googleapis.com/papyrus_images/d0fd09910b8ee0baf1df6fb957998bff9c765cfda6bbd57c49dd5761dd3b887d.png)

> 假設Peer A節點的區塊鏈被駭，區塊資料遭到修改，且被駭客重新挖礦並驗證。

![](https://storage.googleapis.com/papyrus_images/a53d4a8f7b2273e0950f7f64c6b96342d7538e4a9d5f1881d3982f895569d351.png)

> 就算駭客完全掌握了Peer A節點，並重新產生最新的Hash值。

![](https://storage.googleapis.com/papyrus_images/fae1d288b8eac3a6098c2761580cfa0f3a67db40fbf19b75d566a493e3a95238.png)

> 只需檢查各區塊鏈的最後一個區塊的Hash值。就可以知道區塊鏈之間的資料有無差異。

![](https://storage.googleapis.com/papyrus_images/595e4ceef509d6454ba4f2dbebd1d92ff0088edee81b955a55953091e7519a2e.png)

> 在我們檢查Peer B、Peer C節點的最後一個區塊時，就會發現Peer A節點的Hash值不同。此時就可以定義Peer A節點有問題。進而確保B、C節點上的資料是正確的。若將此複製到全球幾十萬台節點上，就會更難修改，因此有所謂的51%攻擊理論。

51%攻擊:
------

指的是駭客必須要掌握區塊鏈網路上的51%節點，才擁有能夠對區塊鏈修改的權力，例如將區塊鏈上的所有交易都改為對自己發送資金等。但顯然的是網路節點越分散且越多(分布在各國家、使用不同的網路、電網、不同的區塊鏈客戶端)，駭客就越難獲得51%以上的節點。

> **_Tokens代幣_**

![](https://storage.googleapis.com/papyrus_images/cf35dc63368f4ca2a00ae7dc9859f4f342d3405885d080e72fd084cc3075fee1.png)

> 顯然地，用區塊鏈儲存資料有一定的防偽用途，若我們拿來儲存金錢交易的資訊，就可以防止交易紀錄被竄改。上述的區塊資料內，寫入了每一筆交易，每一個區塊含有多筆交易。

![](https://storage.googleapis.com/papyrus_images/07582ff3afc64476d0545849acf8963af795d2790faaf4bc6d207c5c47a254f8.png)

> 若試圖修改交易的金額，或是轉帳對象，顯然是徒勞的，因為必須要重新驗證區塊以及還有其他節點的區塊鏈做備份。但這還有一個問題，究竟怎麼知道此帳戶是否有足夠的餘額轉賬?

> **_CoinBase以代幣為基礎_**

![](https://storage.googleapis.com/papyrus_images/bc508574c2b76ffc1217a8638fbf7f8e3ba58a64a8eab9fe1fd6ad75bbea34a0.png)

> 我們在每一個區塊中加入CoinBase欄位，寫入這個區塊鏈系統，在生成區塊時，要發給某人多少錢。上圖是在產出區塊的同時，此區塊鏈系統給Anders 100元，而當Anders轉帳給Sophia 10元，這個行為會寫入在區塊鏈的資料內，下次當Sophia想轉帳給其他人時，就能夠從前面的區塊中，查詢sophia剩餘的金額。

礦工怎麼賺錢?
-------

在實際案例中，比特幣、以太幣區塊鏈本身均會給挖出區塊的礦工小費，來獎勵他們運行節點、產出區塊、以及維護區塊鏈網路安全性。在挖礦的當下，優先找到Nonce值的那個節點就稱為挖礦成功，此節點能夠獨自拿走挖礦獎勵。

礦工收到的費用加總：區塊鏈的區塊獎勵+用戶基本交易費用+用戶為了提高交易速度給礦工的小費等。

挖礦難度：
-----

在我們上述中提到，Nonce值的尋找，就是挖礦。而當共識機制變動，例如：比特幣，從找19個0開頭的Hash，變成找20個0開頭的Hash，意味著找到Nonce值花費的時間會更長，這就是挖礦難度的提升。

區塊鏈分叉：
------

區塊鏈分叉，實際上就是區塊鏈網路，不一致的現象。

在區塊鏈算出Nonce值的節點，會優先將他算出來的Nonce值結果，”廣播”到鄰近的區塊鏈節點。其他的節點則會驗證他的結果，若成功則每一個區塊鏈節點都會認同他的區塊，將挖礦獎勵讓給他，繼續計算下一個區塊。

當區塊鏈的節點越來越多，就有可能發生”同時”算出Nonce值的節點。這裡指的”同時”是，在網路延遲的情況下，有兩個以上的節點，在很短的時間內，都將自己計算的結果，廣播到區塊鏈的網路上，而全網路的節點，最後都會收到兩種區塊(但內容不同，稱為分叉)，直到下一個區塊，出現在這兩個區塊其中一個的後面，那個鏈就會成為最長的鏈，全網節點將保留最長的鏈，捨棄短的區塊。

---

*Originally published on [kiralee.eth](https://paragraph.com/@kiralee/blockchain-demo)*
