基於Java編寫第一個區塊鏈項目

前言

區塊鏈是數字加密貨幣比特幣的核心技術。

區塊鏈是一個稱為塊的記錄列表,這些記錄使用鏈表鏈接在一起並使用加密技術。

每個數據塊都包含自己的數字指紋(稱為散列)、前一個數據塊的散列、時間戳和所做事務的數據,使其在任何類型的數據泄露時都更加安全。

因此,如果一個塊的數據被改變,那麼它的散列也會改變。如果散列被更改,那麼它的散列將不同於下一個塊,下一個塊包含前一個塊的散列,影響它之後的所有塊的散列。更改哈希值,然後將其與其他塊進行比較,這允許我們檢查區塊鏈。

區塊鏈實施:以下是區塊鏈實施中使用的功能。

1. 創建塊:要創建塊,將實現塊類。在類塊中:

  • hash哈希將包含塊的哈希和
  • previousHash將包含上一個塊的哈希。
  • 字符串數據用於存儲塊的數據和
  • long timeStamp用於存儲塊的時間戳。這裡,long數據類型用於存儲毫秒數。
  • calculateHash()生成散列

下面是類塊的實現:

// Java implementation for creating
// a block in a Blockchain
  
import java.util.Date;
  
public class Block {
  
    // Every block contains
    // a hash, previous hash and
    // data of the transaction made
    public String hash;
    public String previousHash;
    private String data;
    private long timeStamp;
  
    // Constructor for the block
    public Block(String data,
                 String previousHash)
    {
        this.data = data;
        this.previousHash
            = previousHash;
        this.timeStamp
            = new Date().getTime();
        this.hash
            = calculateHash();
    }
  
    // Function to calculate the hash
    public String calculateHash()
    {
        // Calling the "crypt" class
        // to calculate the hash
        // by using the previous hash,
        // timestamp and the data
        String calculatedhash
            = crypt.sha256(
                previousHash
                + Long.toString(timeStamp)
                + data);
  
        return calculatedhash;
    }
}

2. 生成哈希:要生成哈希,使用SHA256算法。

下面是算法的實現。

// Java program for Generating Hashes
  
import java.security.MessageDigest;
  
public class crypt {
  
    // Function that takes the string input
    // and returns the hashed string.
    public static String sha256(String input)
    {
        try {
            MessageDigest sha
                = MessageDigest
                      .getInstance(
                          "SHA-256");
            int i = 0;
  
            byte[] hash
                = sha.digest(
                    input.getBytes("UTF-8"));
  
            // hexHash will contain
            // the Hexadecimal hash
            StringBuffer hexHash
                = new StringBuffer();
  
            while (i < hash.length) {
                String hex
                    = Integer.toHexString(
                        0xff & hash[i]);
                if (hex.length() == 1)
                    hexHash.append('0');
                hexHash.append(hex);
                i++;
            }
  
            return hexHash.toString();
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3. 存儲塊:現在,讓我們通過調用Block類的構造函數將塊及其哈希值存儲在Block類型的ArrayList中。

// Java implementation to store
// blocks in an ArrayList
  
import java.util.ArrayList;
  
public class GFG {
  
    // ArrayList to store the blocks
    public static ArrayList<Block> blockchain
        = new ArrayList<Block>();
  
    // Driver code
    public static void main(String[] args)
    {
        // Adding the data to the ArrayList
        blockchain.add(new Block(
            "First block", "0"));
        blockchain.add(new Block(
            "Second block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));
  
        blockchain.add(new Block(
            "Third block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));
  
        blockchain.add(new Block(
            "Fourth block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));
  
        blockchain.add(new Block(
            "Fifth block",
            blockchain
                .get(blockchain.size() - 1)
                .hash));
    }
}

4. 區塊鏈有效性:最後,我們需要通過創建佈爾方法來檢查區塊鏈的有效性。此方法將在“Main”類中實現,並檢查散列是否等於計算的散列。如果所有哈希值都等於計算的哈希值,則該塊有效。

以下是有效性的實施情況:

// Java implementation to check
// validity of the blockchain
  
// Function to check
// validity of the blockchain
public static Boolean isChainValid()
{
    Block currentBlock;
    Block previousBlock;
  
    // Iterating through
    // all the blocks
    for (int i = 1;
         i < blockchain.size();
         i++) {
  
        // Storing the current block
        // and the previous block
        currentBlock = blockchain.get(i);
        previousBlock = blockchain.get(i - 1);
  
        // Checking if the current hash
        // is equal to the
        // calculated hash or not
        if (!currentBlock.hash
                 .equals(
                     currentBlock
                         .calculateHash())) {
            System.out.println(
                "Hashes are not equal");
            return false;
        }
  
        // Checking of the previous hash
        // is equal to the calculated
        // previous hash or not
        if (!previousBlock
                 .hash
                 .equals(
                     currentBlock
                         .previousHash)) {
            System.out.println(
                "Previous Hashes are not equal");
            return false;
        }
    }
  
    // If all the hashes are equal
    // to the calculated hashes,
    // then the blockchain is valid
    return true;
}

區塊鏈的優勢

  • Blokchain是一個分佈式系統網絡。因此,數據泄露很難實施。
  • 由於區塊鏈生成瞭每個區塊的散列,因此很難進行惡意攻擊。
  • 數據篡改將改變每個塊的哈希值,從而使區塊鏈無效

區塊鏈如何工作?

區塊鏈的基本單位是塊。一個塊能封裝多個事務或者其它有價值的數據:

我們用哈希值表示一個塊。生成塊的哈希值叫做“挖掘”塊。挖掘塊通常在計算上很昂貴,因為它可以作為“工作證明”。

塊的哈希值通常由以下數據組成:

  • 首先,塊的哈希值由封裝的事務組成。
  • 哈希也由塊創建的時間戳組成
  • 它還包括一個 nonce,一個在密碼學中使用的任意數字
  • 最後,當前塊的哈希也包括前一個塊的哈希

網絡中的多個節點可以同時對數據塊進行挖掘。除瞭生成哈希外,節點還必須驗證添加到塊中的事務是否合法。先挖一個街區,就贏瞭比賽!

總結

到此這篇關於Java實現區塊鏈的文章就介紹到這瞭,更多相關Java實現區塊鏈內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: