木星链 木星链
Ctrl+D收藏木星链
首页 > FTX > 正文

LET:编程小白模拟简易比特币系统,手把手带你写一波

作者:

时间:1900/1/1 0:00:00

作者:VV一笑ヽ

如果有一个p2p的demo,我们要怎么才能应用到区块链当中?

今天就来一起尝试一下吧!

首先,我们需要模拟网络中的多个节点相互通讯,我们假设现在的情况是有AB两个节点整个过程如下图所示:

梳理流程

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

启动节点A。A首先创建一个创世区块创建钱包A1。调用节点A提供的API创建一个钱包,此时A1的球球币为0。A1挖矿。调用节点A提供的挖矿API,生成新的区块,同时为A1的钱包有了系统奖励的球球币。启动节点B。节点B要向A同步信息,当前的区块链,当前的交易池,当前的所有钱包的公钥。创建钱包B1、A2,调用节点A和B的API,要广播出去创建的钱包,目前节点只有两个,因此A需要告诉B,A2的钱包。B需要告诉A,B1的钱包。A1转账给B1。调用A提供的API,同时广播交易。A2挖矿记账。调用A提供的API,同时广播新生成的区块。总结一下,就是节点刚开始加入到区块链网络中,需要同步其他节点的

已经处于网络中的某个节点,在下述情况下需要通知网络中的其他节点

P2P的大致流程为下方几点,我们后边的实现会结合这个过程。

client→server发送消息,一般是请求数据server收到消息后,向client发送消息client收到消息处理数据相关代码

在实现的过程中,由于消息类型较多,封装了一个消息对象用来传输消息,对消息类型进行编码,统一处理,消息对象Message,实现了Serializable接口,使其对象可序列化:

智能合约安全分析项目Certora的形式验证服务已支持以太坊编程语言Vyper:8月15日消息,智能合约安全分析项目Certora的形式验证服务已支持以太坊编程语言Vyper,使智能合约开发人员能够在部署代码后审计之前检测错误。[2023/8/15 21:23:39]

publicclassMessageimplementsSerializable{/***消息内容,就是我们的区块链、交易池等所需要的信息,使用JSON.toString转化到的json字符串*/privateStringdata;/***消息类型*/privateinttype;}涉及到的消息类型有:

/***查询最新的区块*/privatefinalstaticintQUERY_LATEST_BLOCK=0;/***查询整个区块链*/privatefinalstaticintQUERY_BLOCK_CHAIN=1;/***查询交易集合*/privatefinalstaticintQUERY_TRANSACTION=2;/***查询已打包的交易集合*/privatefinalstaticintQUERY_PACKED_TRANSACTION=3;/***查询钱包集合*/privatefinalstaticintQUERY_WALLET=4;/***返回区块集合*/privatefinalstaticintRESPONSE_BLOCK_CHAIN=5;/***返回交易集合*/privatefinalstaticintRESPONSE_TRANSACTION=6;/***返回已打包交易集合*/privatefinalstaticintRESPONSE_PACKED_TRANSACTION=7;/***返回钱包集合*/privatefinalstaticintRESPONSE_WALLET=8;由于代码太多,就不全部粘在这里了,以client同步其他节点钱包信息为例,结合上面的p2p网络交互的三个步骤,为大家介绍下相关的实现。

具有可编程隐私的金融公链Findora联合Gitcoin推出全球黑客松活动:11月5日消息,具有可编程隐私的金融公链Findora与Gitcoin正式达成合作,主题为“Falling For DeFi on Findora”的全球黑客松大赛已在Gitcoin上启动,总奖金池高达5万美元。Findora高级顾问,图灵奖获得者Dr. Whitfield Diffie也确认加入大赛,会与其他DeFi行业领袖共同作为大赛评委,评选优质项目。\u2028本次黑客松的重点是去中心化金融(DeFi)和最近宣布的Findora的Anvil Testnet上的Ethereum虚拟机(EVM)兼容性。参与者可以从流动性赛道、工具赛道、密码学赛道三个不同的赛道中选择。\u2028此外,Findora也于近期宣布了1亿美金生态基金的成立,大赛的优质项目也将会得到生态基金的支持,帮助其更好的进一步发展,丰富Findora的生态应用。[2021/11/5 6:33:29]

1、client→server发送消息,一般是请求数据

在client节点的启动类首先创建client对象,调用client内部方法,连接server。

启动类main方法中关键代码,:

P2PClientp2PClient=newP2PClient;Stringurl="ws://localhost:"+args+"/test";p2PClient.connectToPeer(url);P2PClient中的connectToPeer方法

publicvoidconnectToPeer(Stringurl)throwsIOException,DeploymentException{WebSocketContainercontainer=ContainerProvider.getWebSocketContainer;URIuri=URI.create(url);this.session=container.connectToServer(P2PClient.class,uri);}P2PClient中,WebSocketContainer.connectToServer的时候会回调onOpen函数,假设我们只查询钱包公钥信息,此时服务端会接收到相应的请求。

Cardano在以太坊虚拟机开发网络中增加新编程语言Glow:Cardano在以太坊虚拟机(EVM)开发网络中增加了一种新的编程语言Glow,该语言旨在简化智能合约的编写和部署。引入Glow将改善开发过程并降低其成本。(U.Today)[2021/2/26 17:56:57]

@OnOpenpublicvoidonOpen(Sessionsession){this.session=session;p2PService.sendMsg(session,p2PService.queryWalletMsg);}注意:我把解析消息相关的操作封装到了一个service中,方便server和client的统一使用。给出相应的queryWalletMsg方法:

publicStringqueryWalletMsg{returnJSON.toJSONString(newMessage(QUERY_WALLET));}以及之前提到的sendMsg方法:

@OverridepublicvoidsendMsg(Sessionsession,Stringmsg){session.getAsyncRemote.sendText(msg);}2、server收到消息后,向client发送消息

server收到消息,进入P2PServer中OnMessage方法

/***收到客户端发来消息*@parammsg消息对象*/@OnMessagepublicvoidonMessage(Sessionsession,Stringmsg){p2PService.handleMessage(session,msg);}p2PService.handleMessage就是解析接收到的消息,根据类型的不同调用其他的方法,这里我们接收到了client传来的信息码QUERY_WALLET。

现场 | Patrick Baron:Token是可编程资产 非常适合监管机构:据cointime.com现场报道,今日在2018西雅图区块链大会上,Blockchain Consulting Group LLC创始人Patrick Baron提到,token提供了将传统金融领域与新技术结合在一起的新方法,有许多新功能。 首先,代币化可编程资产对于监管机构来说是一件很棒的事情,从合规的角度来看是有用的;此外,token像一个全球分类账和稳定货币的合体,人们可以在不进入传统股票市场的情况下找到自己可从事的业务; 同时,它建立了一个开放的系统,任何人都可以参与其中,阅读具有技术可能性的数据。 Token还是不可变的,可以在新的商业模式中建立信任。[2018/8/22]

@OverridepublicvoidhandleMessage(Sessionsession,Stringmsg){Messagemessage=JSON.parseObject(msg,Message.class);switch(message.getType){caseQUERY_WALLET:sendMsg(session,responseWallets);break;caseRESPONSE_WALLET:handleWalletResponse(message.getData);break;......}根据信息码是QUERY_WALLET,调用responseWallets方法,得到数据。

privateStringresponseWallets{Stringwallets=blockService.findAllWallets;returnJSON.toJSONString(newMessage(RESPONSE_WALLET,wallets));}这里我把区块链的相关操作也封装到了一个service中,下面给出findAllWallets的具体实现,其实就是遍历钱包集合,统计钱包公钥,没有什么难度。

美国国家网络安全中心正推动科罗拉多州的大学教授编程语言Solidity:据华尔街日报报道,美国国家网络安全中心(NCC)总长Vance Brown表示,该组织在科罗拉多州的中心与该地区的大学合作,推动这些大学开始教授用于向区块链平台添加智能合约的编程语言Solidity。[2018/5/26]

@OverridepublicStringfindAllWallets{Listwallets=newArrayList<>;myWalletMap.forEach((address,wallet)->{wallets.add(Wallet.builder.publicKey(wallet.getPublicKey).build);});otherWalletMap.forEach((address,wallet)->{wallets.add(wallet);});returnJSON.toJSONString(wallets);}得到数据之后,返回给client:

因此我们的responseWallets方法中,最后一句话新建了一个message对象,并设置了信息码为RESPONSE_WALLET,在handleMessage中调用了sendmsg方法回传给client。

caseQUERY_WALLET:sendMsg(session,responseWallets);break;3、client收到消息处理数据

client收到了请求得到的数据,进入P2PClient中的OnMessage方法

@OnMessagepublicvoidonMessage(Stringmsg){p2PService.handleMessage(this.session,msg);}同样进入我们上面提到的p2PService.handleMessage方法,此时收到的信息码为RESPONSE_WALLET,进入handleWalletResponse方法

caseRESPONSE_WALLET:handleWalletResponse(message.getData);break;handleWalletResponse的实现,解析接收到的钱包公钥信息,并存储到client节点的blockService中。

privatevoidhandleWalletResponse(Stringmsg){Listwallets="\"\"".equals(msg)?newArrayList<>:JSON.parseArray(msg,Wallet.class);wallets.forEach(wallet->{blockService.addOtherWallet(walletService.getWalletAddress(wallet.getPublicKey),wallet);});}在具体实现中,由于使用到了注入服务的方式,在向server和client中使用@Autowired注解注入Bean的时候,由于Springboot单例的特点,而websocket每次都会创建一个新的对象,所以在使用服务的时候会导致出现空指针异常,因此,我们创建了一个工具类Springtil,每次需要服务时,都从Spring容器中获取到我们所需要的bean,下面给出工具类代码。

publicclassSpringUtilimplementsApplicationContextAware{publicstaticApplicationContextapplicationContext;@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{if(SpringUtil.applicationContext!=null){SpringUtil.applicationContext=applicationContext;}}/***获取applicationContext*/publicstaticApplicationContextgetApplicationContext{returnapplicationContext;}/***通过name获取Bean.*/publicstaticObjectgetBean(Stringname){returngetApplicationContext.getBean(name);}/***通过class获取Bean.*/publicstaticTgetBean(Classclazz){returngetApplicationContext.getBean(clazz);}

/***通过name,以及Clazz返回指定的Bean*/publicstaticTgetBean(Stringname,Classclazz){returngetApplicationContext.getBean(name,clazz);}}

因此测试之前我们首先需要设定SpringUtil中的applicationContext,下面给出启动类以及相关节点的配置。

publicstaticvoidmain(Stringargs){System.out.println("Helloworld");SpringUtil.applicationContext=SpringApplication.run(Hello.class,args);if(args.length>0){P2PClientp2PClient=newP2PClient;Stringurl="ws://localhost:"+args+"/test";try{p2PClient.connectToPeer(url);}catch(Exceptione){e.printStackTrace;}}使用时,我们需要手动获取bean

//之前是这样//@Autowired//privateP2PServicep2PService;//改正后,去掉Autowired,每次使用都手动获取beanprivateP2PServicep2PService;@OnOpenpublicvoidonOpen(Sessionsession){//如果不使用那些,在这里会报空指针异常,p2PService为nullp2PService=SpringUtil.getBean(P2PService.class);//新增这句话从IVO容器中获取beanp2PService.sendMsg(session,p2PService.queryWalletMsg);}Hello节点,测试时作为server

Test节点,测试时作为Client。

到此,我们就实现了p2p网络中server节点与client节点的交互过程。建议你也可以尝试一下,然后在评论区和我们讨论哦!

标签:LETWALLETWALLET币LET价格WALLET价格WALLET币WAL币WAL价格

FTX热门资讯
CFA:救命知识点,CFA一级经济学-厂商和市场结构

“在你的一生中—从摇篮到坟墓——你都会碰到无情的经济学真理。” 文:蓝兔子读难NOTES 图:配图来源于网络 编码:0013 CFA一级的微观经济学部分一共有两个章节,第一个章节讲的是供需关系的.

1900/1/1 0:00:00
DYDX:拜占庭为防御入侵修筑的贮水池,够全城人喝一个月,还有未解之谜

土耳其是一个喜欢“向地下发展”的国家,因为战争的原因,修筑了不少地下建筑,其中最出名的便是位于卡帕多奇亚的地下城.

1900/1/1 0:00:00
ABS:川崎Ninja 1000SX日本正式上市 售价折合人民币仅9.8万

川崎Ninja1000SX将于2020年4月4日在日本正式上市,作为川崎Ninja1000的后继车型,Ninja1000SX售价为14,85,000日元,折合人民币仅9.8万元左右.

1900/1/1 0:00:00
VIP:“吃鸡”最便宜M416皮肤上线了?实际上,有2款M416可以免费获得

大家好,欢迎来到《刺激实战教室》,我是你们的老朋友刺激哥。在和粉丝闲聊的时候,有粉丝发表了一个很有趣的观点:我终于获得了最便宜的M416皮肤。在看到这个观点以后,刺激哥也是很无奈地摇了摇头.

1900/1/1 0:00:00
数字货币:又背刺,“新全球货币”更胜Libra,原伙伴抢争跳槽?

稿源:区块链达人-coinicle作者:coinicle 2019年6月中旬,社交平台巨头Facebook推出一款全球性的数字货币天秤币.

1900/1/1 0:00:00
区块链:区块链技术的起源与沿革(上篇):区块链网络与数字货币系统

作者:王翔 前言 说起当今最具代表性的数据通信技术,区块链无疑在列。作为当下最受关注的次世代分布式系统,区块链可谓众说纷纭,莫衷一是.

1900/1/1 0:00:00