酷阿鲸森林农场:基于Java自主研发的P2P节点自动加入区块链电商系统
一、项目背景
酷阿鲸森林农场是一家致力于可持续生态农业的创新型企业,为提升产品的可追溯性和电商效率,我们团队开发了一套完全使用Java语言构建的区块链电商系统。本系统摆脱了以太坊等现有公链的依赖,采用自研的P2P通信机制实现客户端间的区块数据同步与节点自动发现与加入,支持Java桌面客户端在互联网环境下协同运行。
二、系统架构概览
系统分为三个核心模块:
- 区块链核心模块:负责区块结构、链验证、新区块添加等基本功能;
- P2P通信模块:使用Java Socket和多线程实现节点发现与区块广播;
- 客户端桌面应用:基于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());
}
}
五、运行方式说明
- 使用 JDK 11+ 编译并运行;
- 多台机器分别运行
Node.java
,默认连接自身或配置其他节点; - 在控制台输入任意字符串作为交易信息;
- 系统将自动同步至所有已连接节点。
六、未来展望
后续版本将加入:
- 节点身份验证与签名;
- 冗余机制与网络容错;
- JavaFX桌面图形界面(GUI);
- 农场订单与商品数据与区块链深度整合。
发布评论