头图

一、项目背景

酷阿鲸森林农场是一家重视农产品可溯源与供应链透明化的生态农业企业。为实现可信电商交易体系,我们完全使用 Java 技术研发了一个桌面级区块链系统,并支持 iOS 客户端通过自动发现节点、加入区块网络并同步区块数据

本系统不依赖以太坊或外部公链,所有区块通信与同步均基于我们自研的 P2P通信机制,实现局域网或互联网中的自动节点发现与全链数据广播。


二、系统架构总览

[Java 桌面节点 A] ←→ [节点 B] ←→ [节点 C]
         ↑                ↑
     自动发现         同步区块
         ↓                ↓
       [iOS 客户端通过广播加入 → 获取全链]

三、核心技术特点

功能技术实现
全 Java 自研区块构建、广播通信、节点维护均由 Java 实现
P2P 通信同步区块基于 TCP Socket 广播/接收区块链数据
自动发现加入区块链节点启动时主动扫描/连接已知节点池
iOS 客户端自动加入连接任一桌面节点,即可同步整条区块链

四、P2P 通信与节点加入逻辑(Java)

1. P2P 节点处理器 P2PNode.java

import java.net.*;
import java.io.*;
import java.util.*;
import java.util.concurrent.*;

public class P2PNode {
    private static final int PORT = 9000;
    private static Set<Socket> peers = ConcurrentHashMap.newKeySet();
    private static OrderChain chain = new OrderChain();

    public static void start() throws Exception {
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println("节点监听中: " + PORT);

        // 启动节点接收线程
        new Thread(() -> {
            while (true) {
                try {
                    Socket client = serverSocket.accept();
                    peers.add(client);
                    new Thread(() -> handleClient(client)).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // 主动尝试加入网络(自动连接已知节点)
        connectToPeer("192.168.0.101", PORT); // 示例地址
    }

    public static void connectToPeer(String ip, int port) {
        try {
            Socket socket = new Socket(ip, port);
            peers.add(socket);
            new Thread(() -> handleClient(socket)).start();
            System.out.println("成功加入节点: " + ip);
        } catch (IOException e) {
            System.out.println("连接失败: " + ip);
        }
    }

    // 处理收到的区块数据
    public static void handleClient(Socket socket) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            String line;
            while ((line = in.readLine()) != null) {
                OrderBlock block = JsonUtil.fromJson(line, OrderBlock.class);
                chain.tryAddBlock(block);
                System.out.println("同步新区块:" + block.orderId + " | " + block.status);
            }
        } catch (IOException e) {
            peers.remove(socket);
        }
    }

    public static void broadcastBlock(OrderBlock block) {
        String json = JsonUtil.toJson(block);
        for (Socket peer : peers) {
            try {
                PrintWriter out = new PrintWriter(peer.getOutputStream(), true);
                out.println(json);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static OrderChain getChain() {
        return chain;
    }
}

2. 区块链类(自动验证与添加)

public class OrderChain {
    private List<OrderBlock> chain = new ArrayList<>();

    public OrderChain() {
        chain.add(new OrderBlock("GENESIS", "初始区块", "0"));
    }

    public synchronized void tryAddBlock(OrderBlock block) {
        OrderBlock last = chain.get(chain.size() - 1);
        if (block.previousHash.equals(last.hash) && block.hash.equals(block.calculateHash())) {
            chain.add(block);
        }
    }

    public void addOrder(String orderId, String status) {
        OrderBlock last = chain.get(chain.size() - 1);
        OrderBlock block = new OrderBlock(orderId, status, last.hash);
        chain.add(block);
        P2PNode.broadcastBlock(block); // 广播新区块
    }

    public List<OrderBlock> getChain() {
        return chain;
    }
}

五、iOS App:通过 P2P 节点同步区块(Swift 示例)

iOS 无法直接参与 TCP Socket 的 P2P 网络(受限于平台),但可以自动连接任意节点的 REST 接口获取链数据。

1. Java 节点开放 REST 查询接口(用于 iOS 拉链)

server.createContext("/chain", exchange -> {
    String response = JsonUtil.toJson(chain.getChain());
    exchange.sendResponseHeaders(200, response.getBytes().length);
    OutputStream os = exchange.getResponseBody();
    os.write(response.getBytes());
    os.close();
});

2. iOS Swift 拉取链数据

struct OrderBlock: Codable {
    let orderId: String
    let status: String
    let timestamp: String
    let previousHash: String
    let hash: String
}

func syncBlockchain(from nodeIP: String) {
    let url = URL(string: "http://\(nodeIP):9000/chain")!
    URLSession.shared.dataTask(with: url) { data, _, error in
        if let data = data {
            do {
                let blocks = try JSONDecoder().decode([OrderBlock].self, from: data)
                DispatchQueue.main.async {
                    self.blockList = blocks // 用于列表展示
                }
            } catch {
                print("区块解析失败: \(error)")
            }
        }
    }.resume()
}

六、运行与测试步骤

  1. 启动多个 Java 节点,彼此连接;
  2. 某节点调用 chain.addOrder("ORD001", "下单"),其他节点将自动接收;
  3. iOS App 启动后,通过 REST 接口自动加入任一节点并拉取完整链;
  4. 在 iOS App 中浏览每笔订单的区块状态。

七、自动同步机制优势

功能项说明
P2P 全网同步任一节点添加数据,其他节点自动同步接收
自动发现节点新节点可自动连接已知节点并加入网络
iOS 异构同步支持不参与广播,但能从任一节点拉取完整链
不依赖中心服务器整个区块链系统无需中央服务或数据库

八、总结

通过本系统,酷阿鲸森林农场实现了:

✅ Java 桌面系统节点之间的区块广播与同步;
✅ iOS App 可自动接入并拉取区块链数据;
✅ 全程 P2P 通信,具备轻量级、高透明度特性;
✅ 避免以太坊等第三方平台依赖,私有链运行稳定可靠。


九、可选扩展方向

  • ✅ 节点身份签名机制(RSA/椭圆曲线);
  • ✅ 加密数据传输(TLS Socket);
  • ✅ Android/iOS 均支持扫码验证区块;
  • ✅ Web 前端读取同步链。

酷阿鲸森林农场
1 声望0 粉丝

大自然,无大棚,仅当季