http://www.7klian.com

编程小白模仿浅易比特币系统,手把手带你写一波(附代码)

建设钱包A1。挪用节点A提供的API建设一个钱包,此时A1的球球币为0。

P2P的大抵流程为下方几点,我们后边的实现会团结这个进程。

client→server 发送动静,一般是请求数据

A2挖矿记账。挪用A提供的API,同时广播新生成的区块

server收到动静后,向client发送动静 (挪用service,处理惩罚后返回数据)

本日就来一起实验一下吧!

在client节点的启动类首先建设client工具,挪用client内部要领,毗连server。

<code> public class Message implements Serializable { /** * 动静内容,就是我们的区块链、生意业务池等所需要的信息,利用JSON.toString转化到的json字符串 */ private String data; /** * 动静范例 */ private int type; } </code>涉及到的动静范例(type)有:<code> /** * 查询最新的区块 */ private final static int QUERY_LATEST_BLOCK = 0; /** * 查询整个区块链 */ private final static int QUERY_BLOCK_CHAIN = 1; /** * 查询生意业务荟萃 */ private final static int QUERY_TRANSACTION = 2; /** * 查询已打包的生意业务荟萃 */ private final static int QUERY_PACKED_TRANSACTION = 3; /** * 查询钱包荟萃 */ private final static int QUERY_WALLET = 4; /** * 返回区块荟萃 */ private final static int RESPONSE_BLOCK_CHAIN = 5; /** * 返回生意业务荟萃 */ private final static int RESPONSE_TRANSACTION = 6; /** * 返回已打包生意业务荟萃 */ private final static int RESPONSE_PACKED_TRANSACTION = 7; /** * 返回钱包荟萃 */ private final static int RESPONSE_WALLET = 8; </code>由于代码太多,就不全部粘在这里了,以client同步其他节点钱包信息为例,团结上面的p2p网络交互的三个步调,为各人先容下相关的实现。

1、client→server 发送动静,一般是请求数据

挖矿发生新区块

生意业务信息

梳理流程

<code> /** * 收到客户端发来动静 * @param msg 动静工具 */ @OnMessage public void onMessage(Session session, String msg) { p2PService.handleMessage(session, msg); } </code>p2PService.handleMessage就是理会吸收到的动静(msg),按照范例的差异挪用其他的要领(一个巨型switch语句,这里就先容一小部门),这里我们吸收到了client传来的信息码QUERY_WALLET。<code> @Override public void handleMessage(Session session, String msg) { Message message = JSON.parseObject(msg, Message.class); switch (message.getType()){ case QUERY_WALLET: sendMsg(session, responseWallets()); break; case RESPONSE_WALLET: handleWalletResponse(message.getData()); break; ...... } </code>按照信息码是QUERY_WALLET,挪用 responseWallets()要领,获得数据。<code> private String responseWallets() { String wallets = blockService.findAllWallets(); return JSON.toJSONString(new Message(RESPONSE_WALLET, wallets)); } </code>这里我把区块链的相关操纵也封装到了一个service中,下面给出findAllWallets的详细实现,其实就是遍历钱包荟萃,统计钱包公钥,没有什么难度。<code> @Override public String findAllWallets() { List wallets = new ArrayList<>(); myWalletMap.forEach((address, wallet) ->{ wallets.add(Wallet.builder().publicKey(wallet.getPublicKey()).build()); }); otherWalletMap.forEach((address, wallet) ->{ wallets.add(wallet); }); return JSON.toJSONString(wallets); } </code>获得数据之后,返回给client:

因此我们的 responseWallets()要领中,最后一句话新建了一个message工具,并配置了信息码为RESPONSE_WALLET,在handleMessage中挪用了sendmsg要领回传给client。

Test节点,测试时作为Client。

让我们来梳理一下整个流程,明晰在p2p网络中需要做的工作。

启动节点B。节点B要向A同步信息,当前的区块链,当前的生意业务池,当前的所有钱包的公钥。

假如有一个 p2p 的 demo,我们要怎么才气应用到区块链傍边?

在实现的进程中,由于动静范例较多,封装了一个动静工具用来传输动静,对动静范例举办编码,统一处理惩罚,动静工具Message,实现了Serializable接口,使其工具可序列化:

钱包信息

首先,我们需要模仿网络中的多个节点彼此通讯,我们假设此刻的环境是有AB两个节点整个进程如下图所示:

<code> P2PClient p2PClient = new P2PClient(); String url = "ws://localhost:"+args[0]+"/test"; p2PClient.connectToPeer(url); </code>P2PClient中的connectToPeer要领<code> public void connectToPeer(String url) throws IOException, DeploymentException { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); URI uri = URI.create(url); this.session = container.connectToServer(P2PClient.class, uri); } </code>P2PClient中,WebSocketContainer.connectToServer的时候会回调onOpen函数,假设我们只查询钱包公钥信息,此时处事端会吸收到相应的请求。<code> @OnOpen public void onOpen(Session session) { this.session = session; p2PService.sendMsg(session, p2PService.queryWalletMsg()); } </code>留意:我把理会动静相关的操纵封装到了一个service 中,利便server和client的统一利用。给出相应的queryWalletMsg要领:<code> public String queryWalletMsg() { return JSON.toJSONString(new Message(QUERY_WALLET)); } </code>以及之前提到的sendMsg要领:<code> @Override public void sendMsg(Session session, String msg) { session.getAsyncRemote().sendText(msg); } </code>2、server收到动静后,向client发送动静 (挪用service,处理惩罚后返回数据)

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。