如果我們看一下前幾年的趨勢,我們一直聽說過區塊鏈,但具體的了解不多。
我們都知道比特幣、以太坊、狗狗幣、Matic 等加密貨幣都依賴於區塊鏈技術。 區塊鏈在 2021 年引領了眾多行業革命性的重大事件,並為新成就鋪平了道路。
區塊鍊是一種以難以或不可能編輯、破解或欺騙的方式存儲數據的方法。 它是一個數字交易分類賬,在區塊鏈的整個計算機系統網絡中復制和傳播。
這是突破性的數據庫技術,幾乎為所有加密貨幣提供支持。 區塊鏈使得通過在整個網絡上傳播數據庫的相同副本來破解或欺騙系統變得異常困難。
雖然比特幣現在是區塊鏈最重要的用途,但該技術可以服務於非常廣泛的應用。
近年來,加密貨幣和區塊鏈越來越受歡迎,並且這種趨勢預計將持續下去。
在本教程中,我們將使用 JavaScript 創建一個簡單的區塊鏈。 它將讓您對區塊鏈的工作原理有基本的了解。
我們將其稱為 MelodyCoin 並立即開始行動!
創建一個塊
首先,我們將創建一個新的 JavaScript 文件,在其中放置所有代碼。
我們將其命名為 main.js,並首先描述區塊鍊和區塊的外觀。
創建一個 Block 類並為其指定一個函數 Object() { [native code] } 作為開始。
創建新塊時,您必須提供日期和前一個塊的哈希值:
以下是每個屬性的定義:
- 時間戳表明該塊的創建時間。 您可以使用您選擇的任何格式(在本例中為 UNIX 時間戳)。
- 您希望連接到此塊的任何形式的數據都可以包含在數據參數中。 如果您希望創建加密貨幣,您可以在此處保留交易數據,例如發送者/接收者以及轉移的金額。
- previousHash 是一個保存前一個塊的哈希值的字符串。 這將生成區塊鏈,這對於稍後提供區塊鏈的完整性至關重要。
創建哈希
每個塊都鏈接到前一個塊(因此是 previousHash 屬性)。 也就是說,每個塊都需要一個哈希值。 哈希類似於指紋。 每個塊都是不同的。
可以通過將塊的所有內容傳遞給哈希函數來計算塊的哈希值。
因此,我們首先實現一個計算當前塊的哈希值的函數。
因此,在Block類下,我們定義了calculateHash函數:
但是,JavaScript 不支持 SHA256 哈希,必須從外部庫獲取。
Crypto-js 是一個很棒的包,其中包含多種哈希算法的安全實現。
然後我們可以將其導入到我們的 main.js 代碼中。
現在我們有了calculateHash()函數,讓我們在Block的函數中使用它:
在描述了區塊的樣子之後,我們可以定義區塊鏈應該是什麼樣子。 那麼讓我們創建一個新類。
在這個場景中,區塊鍊是一個非常簡單的對象,具有屬性鏈。 這是一個包含鏈上所有塊的數組。
在添加區塊之前,我們必須首先創建所謂的“創世區塊”。 這是鏈中的第一個塊,它的獨特之處在於它不能指向先前的塊(它是第一個!)。
因此,為了構建創世塊,我將向我們的類添加一個名為 createGenesisBlock () 的函數。 回到我們的區塊鏈類的函數 Object() { [native code] } 。
現在,我們可以在構建新的區塊鏈實例時隨時包含創世塊:
區塊鏈方法
現在,讓我們向區塊鏈類添加方法,這些方法將允許我們執行添加新塊和獲取最新塊等操作。
getLatestBlock 函數是最基本的。 它只是返回鏈數組的最後一個成員:
addBlock 技術稍微複雜一些。
在我們向鏈添加新塊之前,我們必須首先適當地設置該塊的 previousHash 字段。
它必須設置為我們鏈中最近添加的塊的哈希值。 我們還需要計算新塊的哈希值:
測試
讓我們看看我們的 MelodyCoin 怎麼樣了。
創建一個區塊鏈實例來完成此任務。 讓我們再添加幾個塊:
我們在那裡建造了兩個新街區。 讓我們看一下我們的區塊鏈目前是什麼樣子。
MelodyCoin 將被字符串化並格式化為四個空格:
驗證區塊鏈的完整性
區塊鏈非常棒,因為一旦添加了一個區塊,就無法在不使鏈的其餘部分失效的情況下對其進行修改。
但是,我沒有辦法通過此實現來檢查區塊鏈的完整性。
讓我們向區塊鏈引入 isChainValid 函數。 如果鏈合法,則返回true; 否則,它將返回 false:
測試完整性
我們現在可以測試區塊鏈的完整性。 如果我們現在執行它,它將確認我們的鏈條是真實的。
現在讓我們嘗試篡改我們的區塊鏈。 讓我們更改塊 2 並覆蓋其內容(假設我們轉移了 100 個硬幣而不是 XNUMX 個)。
當我們執行此操作時,我們可以看到該軟件識別出我們篡改鏈的努力。
不過,你可以相信,我還有另外一種方法可以插手此事。 我更改了塊中的內容,但沒有重新計算哈希值。 因此,您可以嘗試聰明地重新計算同一塊的哈希值。
這就是我們小型區塊鏈設置的全部內容! 它使我們能夠添加新塊並檢測鏈內數據的篡改。
我們的小型區塊鏈有兩個問題必須解決:
- 現代計算機速度非常快,可以在幾秒鐘內向我們的鏈添加數千個區塊。 我們顯然不希望任何人向我們的區塊鏈發送垃圾郵件。
- 我們的區塊鏈仍然容易受到篡改。 您可以更新塊的內容,然後簡單地重新計算所有後續塊的哈希值(和先前的哈希值)。 即使你搞亂了它,你最終也會得到一條合法的鏈條。
為了解決這些問題,區塊鏈使用了一種稱為“工作量證明”的技術。 您必須證明您使用了大量的計算資源來使用此方法創建塊。 這也稱為 採礦.
工作量證明要求區塊的哈希值以特定數量的零開始。 但是你怎麼知道你的哈希值是否符合這個規則呢?
塊的內容決定了它的哈希值。 因此,只要我們不修改內容,我們總是會獲得相同的哈希值。
每個塊都應該添加一個隨機數值作為解決方案。 這本質上是一些我們可以更新的隨機數據,直到我們的塊的哈希值以足夠的零開始。 因為您無法更改哈希函數的輸出,所以您必須測試許多不同的組合併希望得到最好的結果。
將挖礦引入區塊鏈
讓我們首先在 Block 類中包含一個隨機數。 隨機數是塊中的單個值,我們可以修改它來影響塊的哈希值。
我們無法更改時間戳或數據。
接下來,讓我們編寫一個 mineBlock() 函數來執行塊的實際挖掘。 該函數將發送所需的難度作為參數,並將繼續執行,直到我們的塊的散列以足夠的零開始。
我剛剛做了一個基本的 while 循環,它將運行直到我們的散列以足夠的零開始。 我們使用難度來確定需要多少個零。 難度為 5 時,我們的哈希值必須以 5 個零開頭。
當我們的哈希值不包含足夠的零時,我們將隨機數加一併重新計算哈希值。 如果我們找到與難度相對應的哈希值,我們會將其記錄到控制台。
我們還需要做一件事。 我們在calculateHash方法中並沒有真正考慮nonce變量,所以這裡是:
區塊鏈課程
讓我們在區塊鏈課程中測試這種新方法,看看效果如何。
首先,我將在函數 Object() 中定義區塊鏈的難度。 我們在這裡定義它,因為我們稍後可以在其他地方使用它。
然後必須修改 addBlock 函數,以便在將塊添加到我們的鏈中之前挖掘該塊。
使用區塊鏈
現在,讓我們將新的區塊鏈與工作量證明算法一起使用。 在這裡,添加幾個 console.log 語句。
當我們執行這段代碼時,我們可以觀察到挖掘過程不再特別快。
該算法需要一些時間來生成具有以三個零開頭的哈希值的塊(根據難度配置)。
我們的基本區塊鏈設置就這樣結束了。
借助工作量證明機制,我們可以調節新區塊添加到區塊鏈的速度。
這是區塊鏈上最重要的安全功能。 既然您了解了它的工作原理,就可以開始創建自己的了!
發表評論