TopDev

Tự làm Blockchain đơn giản bằng Java

seoyttop 📖 3 phút đọc

Việc tự xây dựng một blockchain đơn giản bằng Java sẽ giúp bạn hiểu rõ cách hoạt động của blockchain từ nền tảng – từ cách tạo khối, tính toán mã băm, đến liên kết các block lại với nhau. Dưới đây là hướng dẫn từng bước để bạn xây dựng một blockchain cơ bản.



🎯 Mục tiêu#

Xây dựng một chương trình Java:

  • Tạo các khối (block)

  • Tính toán mã băm bằng SHA-256

  • Áp dụng cơ chế khai thác (Proof of Work đơn giản)

  • Kiểm tra tính toàn vẹn của chuỗi khối (Blockchain)



🧱 Cấu trúc chương trình#

📁 Dự án sẽ có các class sau:#

  • Block: đại diện cho một khối

  • Blockchain: danh sách các khối

  • Main: chương trình chính để chạy



🧩 Bước 1: Tạo class Block.java#

` import java.util.Date; import java.security.MessageDigest;

public class Block { public int index; public String previousHash; public String hash; public String data; public long timeStamp; public int nonce;

public Block(int index, String data, String previousHash) {
    this.index = index;
    this.data = data;
    this.previousHash = previousHash;
    this.timeStamp = new Date().getTime();
    this.hash = calculateHash();
}

public String calculateHash() {
    String input = index + previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data;
    return applySha256(input);
}

public void mineBlock(int difficulty) {
    String target = new String(new char[difficulty]).replace('\0', '0');
    while (!hash.substring(0, difficulty).equals(target)) {
        nonce++;
        hash = calculateHash();
    }
    System.out.println("✅ Block mined: " + hash);
}

public static String applySha256(String input) {
    try {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(input.getBytes("UTF-8"));

        StringBuilder hexString = new StringBuilder();
        for (byte b : hash)
            hexString.append(String.format("%02x", b));
        return hexString.toString();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

} `



🧩 Bước 2: Tạo class Blockchain.java#

` import java.util.ArrayList;

public class Blockchain { public ArrayList chain; public int difficulty = 4;

public Blockchain() {
    chain = new ArrayList<>();
    chain.add(createGenesisBlock());
}

private Block createGenesisBlock() {
    return new Block(0, "Genesis Block", "0");
}

public Block getLatestBlock() {
    return chain.get(chain.size() - 1);
}

public void addBlock(Block newBlock) {
    newBlock.previousHash = getLatestBlock().hash;
    newBlock.mineBlock(difficulty);
    chain.add(newBlock);
}

public boolean isChainValid() {
    for (int i = 1; i < chain.size(); i++) {
        Block current = chain.get(i);
        Block previous = chain.get(i - 1);

        if (!current.hash.equals(current.calculateHash())) {
            System.out.println("❌ Hash không đúng ở block " + i);
            return false;
        }

        if (!current.previousHash.equals(previous.hash)) {
            System.out.println("❌ previousHash sai ở block " + i);
            return false;
        }
    }
    return true;
}

} `



🧩 Bước 3: Tạo Main.java để chạy thử#

` public class Main { public static void main(String[] args) { Blockchain myBlockchain = new Blockchain();

    System.out.println("&#128296; Đang thêm block 1...");
    myBlockchain.addBlock(new Block(1, "Dữ liệu giao dịch 1", ""));

    System.out.println("&#128296; Đang thêm block 2...");
    myBlockchain.addBlock(new Block(2, "Dữ liệu giao dịch 2", ""));

    System.out.println("&#128296; Đang thêm block 3...");
    myBlockchain.addBlock(new Block(3, "Dữ liệu giao dịch 3", ""));

    System.out.println("\n&#128220; Kiểm tra tính hợp lệ của blockchain:");
    System.out.println("Hợp lệ? " + myBlockchain.isChainValid());

    // In chuỗi khối
    for (Block block : myBlockchain.chain) {
        System.out.println("\n== Block #" + block.index + " ==");
        System.out.println("Data: " + block.data);
        System.out.println("Hash: " + block.hash);
        System.out.println("Previous: " + block.previousHash);
    }
}

} `



✅ Kết quả khi chạy#

  • Mỗi block được "mine" và in ra mã băm SHA-256.

  • In ra toàn bộ chuỗi khối và kiểm tra tính toàn vẹn của nó.



🚀 Gợi ý nâng cấp#

Bạn có thể mở rộng thêm như:

  • Tạo REST API để gửi giao dịch (dùng Spring Boot)

  • Kết nối nhiều node lại với nhau qua socket

  • Thêm “giao dịch” giả lập trong block

  • Mô phỏng mạng phân tán



📦 Yêu cầu chạy:#

  • Java 8 trở lên

  • IDE bất kỳ (Eclipse, IntelliJ, VS Code)

Bài liên quan trong #Java

✓ Đã sao chép link