Logo

两小时手撕一个 Java 版本的区块链应用程序

作者

区块链技术正在席卷全球,但你是否曾想过自己动手实现一个?本文将带你用 Java 快速搭建一个简单的区块链系统,让你在实践中理解区块链的核心概念。

区块链是什么?

简单来说,区块链就是一个分布式数据库,由一系列按时间顺序相连的数据块组成。每个区块包含:

  • 交易数据
  • 时间戳
  • 前一个区块的哈希值

这种结构使得区块链具有:

  • 不可篡改性:修改任何区块都会导致后续区块失效
  • 去中心化:网络中的每个节点都保存完整的链
  • 透明性:所有交易对所有参与者可见

听起来很复杂?别担心,我们马上就用代码来实现这些概念!

用 Java 实现区块链

1. 定义区块结构

首先定义区块的基本结构:

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

    // 构造方法
    public Block(String data, String previousHash, long timeStamp) {
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = timeStamp;
        this.hash = calculateHash();
    }

    // 其他getter/setter方法
}

2. 计算区块哈希

区块的哈希值是其唯一标识,我们使用SHA-256算法计算:

public String calculateHash() {
    String dataToHash = previousHash + timeStamp + nonce + data;
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hash = digest.digest(dataToHash.getBytes(StandardCharsets.UTF_8));
    return bytesToHex(hash);
}

3. 挖矿过程

挖矿就是找到一个符合条件的哈希值,我们用一个简单的难度值来模拟:

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);
}

4. 创建区块链

现在我们可以创建一个简单的区块链了:

public class Blockchain {
    private List<Block> chain;
    private int difficulty = 5;

    public Blockchain() {
        chain = new ArrayList<>();
        // 创世区块
        chain.add(new Block("Genesis Block", "0", System.currentTimeMillis()));
    }

    public void addBlock(String data) {
        Block previousBlock = chain.get(chain.size() - 1);
        Block newBlock = new Block(data, previousBlock.getHash(), System.currentTimeMillis());
        newBlock.mineBlock(difficulty);
        chain.add(newBlock);
    }
}

就是这么简单!我们已经实现了一个基本的区块链系统。

运行我们的区块链

让我们来测试一下:

public static void main(String[] args) {
    Blockchain blockchain = new Blockchain();
    
    System.out.println("挖掘区块 1... ");
    blockchain.addBlock("第一个区块的数据");

    System.out.println("挖掘区块 2... ");
    blockchain.addBlock("第二个区块的数据");

    System.out.println("区块链是否有效: " + blockchain.isChainValid());
}

运行后,你会看到区块被成功挖掘并添加到链中。

总结

通过这个简单的实现,我们掌握了区块链的核心概念:

  1. 区块结构
  2. 哈希计算
  3. 工作量证明(挖矿)
  4. 链式结构

当然,这只是区块链技术的冰山一角。真实的区块链系统还涉及网络通信、共识机制、智能合约等复杂概念。但是通过这个入门级的实现,相信你已经对区块链有了更直观的理解。

接下来,你可以尝试添加更多功能,如交易验证、钱包管理等,来进一步扩展这个系统。记住,学习新技术最好的方式就是动手实践。祝你在区块链的世界里探索愉快!

分享内容