純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

自從區塊鏈誕生以來,顛覆了互聯網時代的瘋狂,將科技進步推向了一個巔峰。區塊鏈一時成為了比“大數據、雲計算和人工智能”還要火爆的詞,在這火爆之下像京東、騰訊、阿里等這樣的大企業都蜂擁而至,入局開始研發區塊鏈。

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

可能真正談到區塊鏈大多人想起的是比特幣,因為相對來說炒幣的人還是很多,對於比特幣的開發技術沒有多少人能夠關注。且目前區塊鏈並沒有一個很清楚的定義,只是介紹了它是比特幣的底層技術,究其底層技術是什麼又成了一個疑問。所以單從理論角度來解說區塊鏈的定義:

●區塊鏈是一個在非安全環境中的分佈式系統;

●採用密碼學方式保證區塊內已有數據的不可篡改性;

●採用了共識算法對新增數據達成共識。

綜上具備這三個基本特性的就稱之為區塊鏈。

那麼,區塊鏈技術到底是什麼樣的,下面我們用JavaScript來創建一個簡單的區塊鏈,以便大家明白它的工作原理。

步驟

○實現一個基本的區塊鏈

○POW機制的實現

○挖礦與交易獎勵

1.1實現一個基本的區塊鏈

研究實現前我們先得明白加密貨幣為什麼要基於區塊鏈實現?因為,區塊鏈是由一個個任何人不可訪問、不可篡改的區塊構成,如果期間要添加一個區塊,就必須得讓剩餘區塊失效,否則它是不會再被改變的。也就是說做完交易後你肯定不希望有人再去變更交易。

1.1.1創造一個區塊

既然說區塊鏈是由一個個區塊連接而成,那麼這種區塊的數據完整性就需要我們去考證,確保數據不被操縱、變更、因此就需要每個區塊包含一個機遇其內容而計算出來的hash,同時也包含前一區塊的hash。

如果用JavaScript來寫大致就是:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

需要解釋的是("crypto-js/sha256"),因為JavaScript中不支持hash256,所以將crypto-js庫引入。再定義一個構造函數,目的是初始化區塊的屬性。

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

表示每個區塊都被賦予index屬性,讓它告訴我們當前區塊在整個鏈上的位置。同時野生成了時間戳以及需要在區塊裡存儲的一些數據。最後一個hash是指前一個區塊的hash。

1.1.2創造一個鏈

要想將每個區塊連接起來,就需要在Blockchain類中創建,JavaScript是這樣實現的:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

在構造函數里,我們需要創建一個包含創世區塊的數組來初始化整個鏈。此時,第一個區塊比較特殊,因為它不能指向前一個區塊,所以可以調用以下方法:

●getLatestBlock()表示返回區塊鏈上最新區塊;

●add Block()表示添加新的區塊到這條鏈上。

藉此我們可以將上一個區塊的hash添加到當前最新的區塊中,這樣也就可以保證整個鏈的完整性。因為我們如果變更了新區塊中的內容,那麼就需要重新計算他當前的hash值,計算完成後,再將這個區塊放到鏈裡(也就是一個數組);最後就要創建一個

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

來確保無人篡改過區塊鏈,此時它會遍歷所有區塊檢查自己的hash是否正確。

然後通過比較

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

來檢查該區塊是否正確指向上一個區塊,如果正確它會返回true,指向錯誤會返回false,以此類推,將所有區塊檢查完畢。

1.1.3使用區塊鏈

編寫玩類就可以真正使用了。

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

創建一個區塊鏈實例,且命名為SavjeeCoin,之後就要添加一些區塊到鏈上。區塊裡可以放任何你想要的數據,以上只添加了一個帶有amount屬性的對象。

下面試一試不可變更的區塊

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

一開始通過運行

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

來驗證整個鏈的完整性。我們操作過任何區塊,所以它會返回true。之後我將鏈上的第一個(索引為1)區塊的數據進行了變更。之後我再次檢查整個鏈的完整性,發現它返回了false。我們的整個鏈不再有效了。

二、POW機制的實現

經過上面的JavaScript做簡單的區塊鏈工作原理演示,發現仍然不完整,還是能夠篡改系統數據,因此,我們就需要另一種機制來抵禦這種攻擊。下面一起走進這個防禦區一探究竟。

快速創造了區塊後將其添加到區塊鏈中,卻發現導致了下面三個問題:

●人們可以快速創建區塊,然後在我們的鏈裡塞滿垃圾。大量的區塊會導致我們區塊鏈過載並讓它無法使用。

●因為創建一個有效的區塊太容易了,人們可以篡改鏈中的某一個區塊,然後重新計算所有區塊的 hash。即使它們已經篡改了區塊,他們仍然可以以有效的區塊來作為結束。

●你可以通過結合上述兩個破綻來有效控制區塊鏈。區塊鏈由 P2P 網絡驅動,其中節點會將區塊添加到可用的最長鏈中。

所以你可以篡改區塊,然後計算所有其他的區塊,最後添加任意多你想要添加的區塊。你最後會得到一個最長的鏈,所有的其他節點都會接受它,然後往上添加自己的區塊。

此時,就需要一個合理的解決方案—pow。

關於pow

Pow首先是一項簡單技術,是通過一定數量的計算來防止濫用;其次,在第一個區塊鏈創造之前它就已經存在。

工作量是防止垃圾填充和篡改的關鍵。如果它需要大量算力,那麼垃圾的填充也就失去了意義。

以比特幣的場景為例:

比特幣要求hash以特定0的數目來實現pow,在其場景下,一個區塊含各種交易信息,那麼我們肯定是不希望為了獲取正確的hash而混淆那些數據。此時區塊鏈就添加了一個Nonce值來解決這個問題(需要說明的是Nonce是用來查找有效hash次數的)。

挖礦就是在無法預測hash函數輸出時,為滿足hash之前的條件,尋求有效hash而創建的一個新區塊。

在修改區塊類並在構造函數中添加Nonce變量,將初始化值設為0。

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

獲取新方法添加Nonce,並獲取有效hash。

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

變更

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

函數

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

它們結合後得到新的區塊類:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

在區塊鏈中增加一個新的屬性,用於追蹤整條鏈的難度,將它設為2.

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

改變 addBlock() 方法,以便在將其添加到鏈中之前確保實際挖到該區塊:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

現在pow可以作為防禦遁甲抵擋攻擊了!

三、挖礦與交易獎勵

區塊鏈創建好了,pow防護盾也有了,接下來我們需要給我們的礦工獎勵。

重構區塊類

目前我們的區塊中已經擁有了previousHash,timestamp,data,hash和nonce屬性。現在我們還需要將data改名為transactions,如下:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

更改了區塊類我們就需要同時更改它對應的calculateHash()函數

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

定義交易類,便於我們交易時鎖定它的屬性:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

由於pow在區塊鏈中可以穩定創建區塊,在比特幣的場景下,難度被設置為每10分鐘創在一個新區塊。那麼就要創建一個新的屬性,用於定義礦工勞動所獲的獎勵:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

調用addBlock()方法,並重寫,杜絕直接在鏈上添加區塊。使交易添加到下一曲快中,因此將addBlock()更名為createTransaction():

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

挖礦

將新的交易添加處理到交易列表後,還需要將其清理並移入實際區塊中。因此就要創建一個minePendingTransactions()方法,用它來挖掘所有新交易的區塊,並向採礦者發送獎勵。

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

值得注意的是,該方法採用了參數miningRewardAddress。如果你開始挖礦,你可以將你的錢包地址傳遞給此方法。一旦成功挖到礦,系統將創建一個新的交易來給你挖礦獎勵。

地址餘額檢索

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

測試

完成以上工作後,我們需要檢測代碼運行情況:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

目前交易處於待定狀態,所以我們必須挖礦並獲取挖礦所得的新地址:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

檢查賬戶餘額:

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

結果輸出0,很意外啊,仔細檢查會發現系統會創建一個交易,然後會把挖礦獎勵添加為新的待處理交易。這筆交易會包含在下一區塊中,如果繼續挖礦,會得到100的獎勵。

純乾貨!區塊鏈用JavaScript這樣寫,你就能玩轉幣圈!

現在我們可以在這個區塊鏈上的區塊中存儲交易信息,併為礦工帶來彙報。

這只是一個原理性的區塊鏈實現,因為它還欠缺很多功能和獎勵機制,今天我們只為論證區塊鏈技術的概念來做工作原理的解釋,具體的實現還需完整的編碼實現。


分享到:


相關文章: