1. 程式人生 > >BLOCKCHAIN 區塊鏈的去中心化P2P服務的JAVA代碼的實現

BLOCKCHAIN 區塊鏈的去中心化P2P服務的JAVA代碼的實現

區塊鏈 BLOCKCHAIN P2P JAVA區塊鏈 websocket

為什麽要用去中心化?

借貸關系證明舉例

中心化借貸關系證明帶來的問題:

  1. 機器掛了,公司倒閉了,被黑客黑了,借貸關系就不存在了
  2. 借貸關系涉及到個人隱私,中心化的機構會拿去做大數據分析。例如各大電子商務公司,會根據購物習慣,分析個人喜好,繼而指導利益可圖的商業行為,但這本身是侵犯隱私的。

技術分享圖片

去中心化可以解決上述的問題:

  1. 去中心化的一個節點掛了,對數據丟失影響很小,節點越多,黑客越難攻擊。
  2. 使用復雜的密碼學,保證隱私
    技術分享圖片

區塊鏈中的P2P概念

P2P(Peer to Peer)對等計算機或對等網絡,一種計算機和計算機之間的通信協議。
p2p的核心:
P2P的核心是數據存儲在客戶本地,通過存儲信息(名稱、地址、分塊)的查詢,讓終端之間直接數據傳遞。P2P網絡讓網絡上的數據流量分散化,同時管理點不僅沒有服務容量的壓力,而且只存儲數據的索引與鏈接,不對數據本身負責,避免了版權與管理的麻煩。IPFS文件系統是基於p2p的(目標是替代現有的http),可以百度搜索相關網址。

p2p網絡實現的思想:
P2P網絡實際上是一種“無中央政府的”、“部落式的”網絡,加入的方式就是客戶端的登錄,多數不需要認證,離開更不受限制,別人“取”你的東西是自願,你拿別人的資源也不用付費,“P2P世界是和諧的”。為了激勵大家在獲取的同時多奉獻,,因為只有奉獻的越多,可供共享的也越多,開發者在你下載的同時,利用文件分塊的技術,把你剛擁有的部分馬上給別人分享,當然這種共享不必再經過你的允許,並且根據你的表現積分,鼓勵“好”人,獎勵奉獻,你幫了別人,別人就來幫你。由於很多P2P網絡的協議是公開的,所以加入的方式也很寬泛,不同的P2P網絡還可以互通,為信息的進一步共享提供了基礎。

  • java網絡編程:socket編程、netty編程、websoket編程(html5興起後的一種技術)

    • 網絡編程,socket編程和netty編程是傳統的網絡編程,(服務端和客戶端)

      • socket 編程是基於BIO的
      • netty 是基於NIO的
    • websocket編程
      • Websocket是html5提出的一個協議規範,參考rfc6455。
        websocket約定了一個通信的規範,通過一個握手的機制,客戶端(瀏覽器)和服務器(webserver)之間能建立一個類似tcp的連接,從而方便c-s之間的通信。在websocket出現之前,web交互一般是基於http協議的短連接或者長連接。
        WebSocket是為解決客戶端與服務端實時通信而產生的技術。websocket協議本質上是一個基於tcp的協議,是先通過HTTP/HTTPS協議發起一條特殊的http請求進行握手後創建一個用於交換數據的TCP連接,此後服務端與客戶端通過此TCP連接進行實時通信。
      • websocket編程相對簡單

區塊鏈中的P2P服務端的代碼實現

  • 初始化websoket 服務端(接收客戶端的請求並返回消息)
  • 整個流程梳理
    • 服務開啟onStart()
    • 連接打開onOpen()
    • 處理接收到的消息onMesage()
    • 連接關閉onClose()
    • 異常處理onError()
  /**
     * 初始化websoket服務
     * @author cn.wenwuyi
     * @param port
     */
    public void initP2PServer(int port) {
        /**
         * webSoketServer 初始化
         */
        final WebSocketServer socket = new WebSocketServer(new InetSocketAddress(port)) {
             /**
              * 連接打開
              */
             public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
                 write(webSocket, queryChainLatestMsg());
                 sockets.add(webSocket);
             }
             /**
              * 連接關閉
              */
             public void onClose(WebSocket webSocket, int i, String s, boolean b) {
                 System.out.println("connection failed to peer:" + webSocket.getRemoteSocketAddress());
                 sockets.remove(webSocket);
             }
             /**
              * 連接消息
              */
             public void onMessage(WebSocket webSocket, String s) {
                 handleMessage(webSocket, s);
             }
             /**
              * 容錯
              */
             public void onError(WebSocket webSocket, Exception e) {
                 System.out.println("connection failed to peer:" + webSocket.getRemoteSocketAddress());
                 sockets.remove(webSocket);
             }
             /**
              * 連接開始
              */
             public void onStart() {

             }
        };
        //soket啟動
        socket.start();
        System.out.println("listening websocket p2p port on: " + port);
    }
  • 初始化websocket客戶端(發送給服務端消息,同時接收服務端發回的消息)
    • 連接打開onOpen()
    • 處理接收到的消息onMesage()
    • 連接關閉onClose()
    • 異常處理onError()
  • 每個節點既是服務端也是客戶端 WebsoketServer WebSocketClient
 /**
     * 初始化websoket服務
     * @author cn.wenwuyi
     * @param port
     */
  public void connectToPeer(String peer) {
        try {
            final WebSocketClient socket = new WebSocketClient(new URI(peer)) {
                @Override
                public void onOpen(ServerHandshake serverHandshake) {
                    write(this, queryChainLatestMsg());
                    sockets.add(this);
                }

                @Override
                public void onMessage(String s) {
                    handleMessage(this, s);
                }

                @Override
                public void onClose(int i, String s, boolean b) {
                    System.out.println("connection failed");
                    sockets.remove(this);
                }

                @Override
                public void onError(Exception e) {
                    System.out.println("connection failed");
                    sockets.remove(this);
                }
            };
            socket.connect();
        } catch (URISyntaxException e) {
            System.out.println("p2p connect is error:" + e.getMessage());
        }
    }

    private void write(WebSocket ws, String message) {
        ws.send(message);
    }

註意:每個節點(區塊鏈中的服務器)既是服務端也是客戶端,用來同步各個節點的數據

BLOCKCHAIN 區塊鏈的去中心化P2P服務的JAVA代碼的實現