JS 實現區塊鏈—工作量證明
今天我們通過 js 實現一個區塊鏈應用,幫助您更好地理解區塊鏈技術原理
建立區塊鏈
區塊鏈驗證
工作量證明防纂改
我們先建立一個 js 專案,然後建立 main.js 作為專案主檔案也是入口檔案。 區塊鏈本質是密碼學,我們需要將資訊進行加密,這裡我們用 crypto-js 提供加密演算法來進行加密,所以先載入一下 crypto-js 這個庫。

先建立 Block(塊)這個類,在其建構函式對塊的各個屬性進行初始化賦值,之所以叫做區塊鏈,那麼這條鏈是靠什麼連結的呢,看一下建構函式,可以看出答案是每個塊都擁有前一個塊的 hash 值的方式來實現一條鏈的。calculateHash 方法作用就是將所有信息進行hash演算法來加密成一個字串。

然後我們來建立 BlockChain 區塊鏈這個類,我需要在建構函式中初始化區塊鏈,建立區塊鏈的第一個塊的工作是由 createGenesisBlock 來做的。getLatesBlock 使用者獲取區塊鏈的上一個塊,addBlock 則負責新增塊。

修改建構函式,將第一個塊新增到區塊鏈中。

然後我們來實現 getLatesBlock 和 addBlock 方法,這裡內容很簡單,大家一看就會,我就不做過多解釋了。

然後我們建立一個區塊鏈,新增兩個塊。

大家注意每一個塊的 previousHash 都是上一個塊的 hash 值,這就是區塊鏈的模樣。


為了防止有人惡意篡改一個塊的資訊,我們需要對區塊鏈進行校驗,檢驗的方法很簡單,就是驗證每個區塊鏈的塊的 previoushash 值與上一個塊的 hash 是否相等。這裡我們在驗證時不需要考慮第一個塊,因為他比較特殊,沒有前一個塊。

測試一下 沒有問題,驗證通過

我們來嘗試篡改一個塊,篡改時我們不但需要修改資料,還需要重新計算他的hash 值,然後再次進行校驗,發現報錯。



大家都知道區塊鏈一般在十分左右建立一個塊,這是因為現在的計算機速度快到可以很短的時間內篡改區塊鏈上所有塊來實現篡改塊的資訊,如果是這樣,我們校驗方法也就失效了。為了防止提出POW 工作量證明的方式來解決此問題,我們通過提高計算 hash 值難度來增加建立新塊(也就是挖礦)的時間,來防止篡改。是如何增加計算難度的呢,也就是如何來要求更高計算速度的呢。我們是通過判斷計算出值是否滿足一定格式來實現。
我們通過判斷計算出的 hash 值前幾位是否為 0 來不斷提高難度的,如果我們要求前面必須是兩個 0 才有效,這樣就有一定難度,0 個數越多要求算力就越高,具體看程式碼吧。
這裡定義 mineBlock 接受一個引數來定義難度—也就是要求hash前幾位為零,difficulty 值越大,計算難度越大,要計算力也越高。

如果計算值沒有滿足我們要求,也就是 hash 值,我們需要調整值繼續計算,我們知道 index ,timestamp data 這些值是無法改變,所以我們需要新增一個變數來調整值,所以這裡我們引入 nonce 。

我們對 addBlock 方法進行修改,將對塊的賦值移到 mineBlock

在 BlockChain 我們將難度定義為 2

大家注意 hash 值前兩位為 0。並花費一定的時間。

這裡我修改為 5 時,由於等待時間過長我就放棄了

這是修改為 3 的情況,還可以接受

