BLOCKCHAIN 区块链的去中心化P2P服务的JAVA代码的实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BLOCKCHAIN 区块链的去中心化P2P服务的JAVA代码的实现相关的知识,希望对你有一定的参考价值。
为什么要用去中心化?
借贷关系证明举例
中心化借贷关系证明带来的问题:
- 机器挂了,公司倒闭了,被黑客黑了,借贷关系就不存在了
- 借贷关系涉及到个人隐私,中心化的机构会拿去做大数据分析。例如各大电子商务公司,会根据购物习惯,分析个人喜好,继而指导利益可图的商业行为,但这本身是侵犯隐私的。
去中心化可以解决上述的问题:
- 去中心化的一个节点挂了,对数据丢失影响很小,节点越多,黑客越难攻击。
- 使用复杂的密码学,保证隐私
区块链中的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编程相对简单
- Websocket是html5提出的一个协议规范,参考rfc6455。
-
区块链中的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代码的实现的主要内容,如果未能解决你的问题,请参考以下文章