Tự làm Blockchain đơn giản bằng Java
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ốiBlockchain: danh sách các khốiMain: 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
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("🔨 Đang thêm block 1...");
myBlockchain.addBlock(new Block(1, "Dữ liệu giao dịch 1", ""));
System.out.println("🔨 Đang thêm block 2...");
myBlockchain.addBlock(new Block(2, "Dữ liệu giao dịch 2", ""));
System.out.println("🔨 Đang thêm block 3...");
myBlockchain.addBlock(new Block(3, "Dữ liệu giao dịch 3", ""));
System.out.println("\n📜 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)