動態

詳情 返回 返回

酷阿鯨森林農場:Java自研區塊鏈電商系統實現P2P通信與iOS App自動加入同步機制 - 動態 詳情

一、項目背景

酷阿鯨森林農場是一家重視農產品可溯源與供應鏈透明化的生態農業企業。為實現可信電商交易體系,我們完全使用 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 前端讀取同步鏈。

Add a new 評論

Some HTML is okay.