首頁 > web前端 > js教程 > 如何評估用 JavaScript 實現的區塊鏈?

如何評估用 JavaScript 實現的區塊鏈?

PHPz
發布: 2023-08-27 21:05:07
轉載
994 人瀏覽過

區塊鏈是包含資訊的區塊鏈。 2009 年,這項技術後來被中本聰採用,創造了數位加密貨幣比特幣。這對任何想要開發或分析的人完全開放。該技術有一個特點,一旦某些數據被記錄在區塊鏈中,對其進行更改就變得非常複雜。

以下是區塊鏈程式中用於評估的一些術語。

  • 區塊 - 區塊鏈中的區塊包含資料、雜湊值和前一個區塊雜湊值等資訊。

  • 資料 - 該資料完全取決於區塊的類型,例如加密貨幣具有諸如交易來自哪個人、交易給哪個人以及交易量等資訊。幣已交易。

  • 哈希 - 這是一個唯一的字串ID,就像Aadhar號碼一樣,它可以用來定位一個人的詳細信息,就像這個哈希用於識別區塊詳細資訊一樣。一旦創建了一個區塊,它的哈希值就會被創建。更改區塊哈希很容易被識別。一旦區塊哈希發生更改,它就不再是同一個區塊。

  • 前一個雜湊 - 這是前一個區塊的雜湊值,用來連接或建立區塊的鏈。

在上圖中,您可以觀察到前一個雜湊值具有前一個區塊的雜湊值。第一個區塊也稱為創世區塊,因為它不能指向前一個區塊。如果您更改哈希值,則具有先前哈希值的下一個區塊將因更改而無效。

我們將使用的套件是crypto.js。 這是一個提供加密演算法和函數的JavaScript函式庫。它可用於在 Web 瀏覽器或 Node.js 等伺服器端 JavaScript 環境中執行各種加密操作,例如雜湊、加密、解密和金鑰產生。

此程式庫廣泛應用於 Web 應用程式中,以提供安全通訊、資料保護和使用者身份驗證。例如,它可用於在透過網路發送敏感資料之前對其進行加密,或產生用於使用者身份驗證的安全密碼雜湊。

讓我們透過一個使用 Crypto.JS 函式庫進行雜湊和工作證明的程式來理解。

這裡有兩個類別 Block 和 Blockchain。

1

2

3

4

5

6

7

8

9

class Block{

   constructor(prev_hashValue, data){

      this.data=data;

      this.hash=this.calculateHash();

      this.prev_hashValue=prev_hashValue;

      this.time_stamp= new Date();

      this.pf_work=0;

   }

}

登入後複製

Block 類別有五個屬性 -

  • data - 這會將資料儲存在區塊中。

  • hash - 這將透過呼叫calculateHash方法來儲存區塊的雜湊值。

  • prev_hashValue - 這將儲存前一個區塊的雜湊值。

  • time_stamp - 時間戳記將包含建立區塊的時間。

  • pf_work - 在挖掘過程中遞增的數字。

Block 類別包含兩個方法 -

1

2

3

calculateHash(){

   return SHA256(this.pf_work + this.prev_hashValue + this.timestamp + JSON.stringify(this.data)).toString();

}

登入後複製

此函數將透過連接 pf_work、prev_hashValue time_stamp 和數據,並使用 CryptoJS 函式庫將其傳遞到 SHA256 雜湊函數來計算區塊的雜湊值。

1

2

3

4

5

6

mine(difficulty){

   while(!this.hash.startsWith("0".repeat(difficulty))){

      this.pf_work++;

      this.hash=this.calculateHash();

   }

}

登入後複製

此函數使用工作量證明來尋找以一定數量的零開頭的雜湊值。零的數量由傳遞給此方法的難度參數決定。 pf_work 屬性會遞增,直到找到有效的雜湊值。

1

2

3

4

5

6

class Blockchain{

   constructor(){

      let genesisBlock=new Block("0", {isGenesisBlock: true});

      this.chain=[genesisBlock];

   }

}

登入後複製

chain - 這是一個 Block 物件數組,它構成了一個區塊的鏈。

區塊鏈類別有兩個方法 -

1

2

3

4

5

6

addNewBlock(data){

   let lastBlock=this.chain[this.chain.length-1];

   let newBlock=new Block(lastBlock.hash, data);

   newBlock.mine(2); //find a hash for new block

   this.chain.push(newBlock);

}

登入後複製

此方法建立一個新的Block對象,其中的資料作為參數傳遞,mines用於尋找有效的雜湊值,並將其新增至鏈數組。

1

2

3

4

5

6

7

8

9

isValid_hash(){

      for(let i=1; i<this.chain.length; i++){

      const currentBlock=this.chain[i];

      const previousBlock=this.chain[i-1];

      if(currentBlock.hash!=currentBlock.calculateHash()) return false;

      if(currentBlock.prev_hashValue!=previousBlock.hash) return false;

      }

      return true;

}

登入後複製

此方法透過迭代鏈數組中的每個區塊並驗證其雜湊屬性與計算的雜湊值匹配來檢查區塊鏈的有效性。

1

2

3

4

5

6

7

8

9

10

11

let blockchain=new Blockchain();

blockchain.addNewBlock({

   from: "joe",

   to:"Juhi",

   amount: 100,

});

blockchain.addNewBlock({

   from: "martin",

   to: "Genny",

   amount: 150,

});

登入後複製

這裡將使用兩個區塊創建一個對象,這兩個區塊將具有區塊鏈類別的屬性。

此實作可以用作建立需要安全且不可變資料儲存的更複雜區塊鏈應用程式的起點。但要注意的是,這只是一個基本的實現,一個功能齊全的區塊鏈系統還需要許多附加功能,例如交易驗證、共識機制和安全措施。

範例:完整程式碼

區塊鏈.js

#

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

const SHA256 = require('crypto-js/sha256');

class Block{

   constructor(prev_hashValue, data){

      this.data=data;

      this.hash=this.calculateHash();

      this.prev_hashValue=prev_hashValue;

      this.time_stamp= new Date();

      this.pf_work=0;

   }

 

   calculateHash(){

      return SHA256(this.pf_work + this.prev_hashValue + this.time_stamp + JSON.stringify(this.data)).toString();

   }

 

   mine(difficulty){

      while(!this.hash.startsWith("0".repeat(difficulty))){

         this.pf_work++;

         this.hash=this.calculateHash();

      }

   }

}

 

class Blockchain{

   constructor(){

      let genesisBlock=new Block("0", {isGenesisBlock: true});

      this.chain=[genesisBlock];

   }

 

   addNewBlock(data){

      let lastBlock=this.chain[this.chain.length-1];

      let newBlock=new Block(lastBlock.hash, data);

      newBlock.mine(2); //find a hash for new block

      this.chain.push(newBlock);

   }

 

   isValid_hash(){

      for(let i=1; i<this.chain.length; i++){

         const currentBlock=this.chain[i];

         const previousBlock=this.chain[i-1];

         if(currentBlock.hash!=currentBlock.calculateHash()) return false;

         if(currentBlock.prev_hashValue!=previousBlock.hash) return false;

      }

      return true;

   }

}

//test

let blockchain=new Blockchain();

 

blockchain.addNewBlock({

   from: "joe",

   to:"Juhi",

   amount: 100,

});

 

blockchain.addNewBlock({

   from: "martin",

   to: "Genny",

   amount: 150,

});

 

console.log(blockchain);

console.log("Blockchain is valid: "+blockchain.isValid_hash());

登入後複製

要編譯程序,您必須安裝node.js。使用本文(Node.js - 環境設定)來安裝 Node.js。然後使用以下指令安裝 crypto.js 函式庫。

1

npm install crypto-js

登入後複製

然後編譯JavaScript程式檔案。這裡,檔案名稱是區塊鏈。

1

node blockchain.js

登入後複製

輸出

如何评估用 JavaScript 实现的区块链?

#

以上是如何評估用 JavaScript 實現的區塊鏈?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板