酷阿鲸森林农场:基于Java自主研发的P2P节点自动加入区块链电商系统

一、项目背景

酷阿鲸森林农场是一家致力于可持续生态农业的创新型企业,为提升产品的可追溯性和电商效率,我们团队开发了一套完全使用Java语言构建的区块链电商系统。本系统摆脱了以太坊等现有公链的依赖,采用自研的P2P通信机制实现客户端间的区块数据同步节点自动发现与加入,支持Java桌面客户端在互联网环境下协同运行。

二、系统架构概览

系统分为三个核心模块:

  1. 区块链核心模块:负责区块结构、链验证、新区块添加等基本功能;
  2. P2P通信模块:使用Java Socket和多线程实现节点发现与区块广播;
  3. 客户端桌面应用:基于JavaFX或Swing,实现用户交互与本地节点功能。

架构图:

代码语言:javascript代码运行次数:0运行复制
+----------------+        +----------------+        +----------------+
|  节点 A (桌面) | <----> |  节点 B (桌面) | <----> |  节点 C (桌面) |
+----------------+        +----------------+        +----------------+
      ↑                        ↑                        ↑
      |                        |                        |
  区块同步 (P2P Socket)      节点广播与发现        自动加入与数据对齐

三、P2P节点自动加入机制详解

1. 节点发现思路

  • 初始节点列表写入配置或硬编码;
  • 新节点启动后向已知节点请求最新节点列表
  • 接收后更新本地节点池,并逐一尝试建立连接;
  • 通过“心跳包”维持连接,断开后自动重连。

2. 区块同步机制

  • 每个节点维护自己的区块链副本;
  • 当收到新节点加入或新交易时,广播最新区块;
  • 节点比对链长与校验Hash决定是否接受新区块;
  • 区块通过JSON传输,便于序列化与验证。

四、Java核心源代码

1. 区块结构类 Block.java

代码语言:javascript代码运行次数:0运行复制
import java.util.Date;

public class Block {
    public String previousHash;
    public String data;
    public long timestamp;
    public String hash;

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

    public String calculateHash() {
        return StringUtil.applySha256(previousHash + Long.toString(timestamp) + data);
    }
}

2. 工具类 StringUtil.java

代码语言:javascript代码运行次数:0运行复制
import java.security.MessageDigest;

public class StringUtil {
    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 elem : hash) {
                String hex = Integer.toHexString(0xff & elem);
                if(hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3. 节点与P2P模块 Node.java

代码语言:javascript代码运行次数:0运行复制
import java.io.*;
import java.*;
import java.util.*;
import java.util.concurrent.*;

public class Node {
    private static final int PORT = 6000;
    private static Set<Socket> peers = ConcurrentHashMap.newKeySet();
    private static List<Block> blockchain = new CopyOnWriteArrayList<>();

    public static void main(String[] args) throws IOException {
        blockchain.add(new Block("创世区块", "0")); // 初始化链

        // 监听其他节点
        ServerSocket server = new ServerSocket(PORT);
        new Thread(() -> {
            while (true) {
                try {
                    Socket client = server.accept();
                    peers.add(client);
                    new Thread(() -> handleClient(client)).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // 连接到默认节点
        connectToPeer("127.0.0.1", PORT); // 可替换为远程IP

        // 主动广播新区块
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String data = scanner.nextLine();
            Block newBlock = new Block(data, blockchain.get(blockchain.size() - 1).hash);
            blockchain.add(newBlock);
            broadcastBlock(newBlock);
        }
    }

    private static void connectToPeer(String host, int port) {
        try {
            Socket socket = new Socket(host, port);
            peers.add(socket);
            new Thread(() -> handleClient(socket)).start();
        } catch (IOException e) {
            System.out.println("无法连接到节点:" + host);
        }
    }

    private static void handleClient(Socket client) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()))) {
            String line;
            while ((line = in.readLine()) != null) {
                Block received = deserializeBlock(line);
                if (isValidNewBlock(received)) {
                    blockchain.add(received);
                    System.out.println("接收到新区块:" + received.data);
                }
            }
        } catch (IOException e) {
            System.out.println("节点断开:" + client.getInetAddress());
        }
    }

    private static void broadcastBlock(Block block) {
        for (Socket peer : peers) {
            try {
                PrintWriter out = new PrintWriter(peer.getOutputStream(), true);
                out.println(serializeBlock(block));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static String serializeBlock(Block block) {
        return block.previousHash + "|" + block.timestamp + "|" + block.data + "|" + block.hash;
    }

    private static Block deserializeBlock(String data) {
        String[] parts = data.split("\\|");
        Block b = new Block(parts[2], parts[0]);
        b.timestamp = Long.parseLong(parts[1]);
        b.hash = parts[3];
        return b;
    }

    private static boolean isValidNewBlock(Block block) {
        Block last = blockchain.get(blockchain.size() - 1);
        return block.previousHash.equals(last.hash) && block.hash.equals(block.calculateHash());
    }
}

五、运行方式说明

  1. 使用 JDK 11+ 编译并运行;
  2. 多台机器分别运行 Node.java,默认连接自身或配置其他节点;
  3. 在控制台输入任意字符串作为交易信息;
  4. 系统将自动同步至所有已连接节点。

六、未来展望

后续版本将加入:

  • 节点身份验证与签名;
  • 冗余机制与网络容错;
  • JavaFX桌面图形界面(GUI);
  • 农场订单与商品数据与区块链深度整合。