作者: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接口,使其對象可序列化:
以太坊編程語言Vyper發布v0.3.10候選版本:9月7日消息,以太坊編程語言 Vyper 發布 v0.3.10 候選版本,添加了代碼大小優化模式、特定于 vyper 的新 #pragma 指令、對一些編譯器生成的代碼使用 Cancun 的 MCOPY 操作碼,并生成現在具有 O(1) 性能的選擇器表。
金色財經此前報道,Vyper 編譯器發布漏洞事件分析報告,漏洞于 v0.3.1 修復并測試。[2023/9/7 13:23:02]
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網絡交互的三個步驟,為大家介紹下相關的實現。
央行:數字人民幣可通過智能合約實現可編程性:7月16日消息,中國人民銀行發布《中國數字人民幣的研發進展》白皮書,其中提到,“數字人民幣通過加載不影響貨幣功能的智能合約實現可編程性,使數字人民幣在確保安全與合規的前提下,可根據交易雙方商定的條件、規則進行自動支付交易,促進業務模式創新。”
央行還表示,利用智能合約技術,賦予數字人民幣可編程特性,提升擴展能力,促進與應用場景的深度融合。[2021/7/16 0:58:02]
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函數,假設我們只查詢錢包公鑰信息,此時服務端會接收到相應的請求。
@OnOpenpublicvoidonOpen(Sessionsession){this.session=session;p2PService.sendMsg(session,p2PService.queryWalletMsg);}注意:我把解析消息相關的操作封裝到了一個service中,方便server和client的統一使用。給出相應的queryWalletMsg方法:
ConsenSys Academy正提供捐款幫助伊朗女性學習編程:2月13日消息,以太坊創業孵化器的教育分支ConsenSys Academy正在以提供獎學金的方式,幫助伊朗女性學習在以太坊上編程。已有7名伊朗女程序員獲得了獎學金,并順利從ConsenSys Academy畢業。據悉,該項目為ConsenSys全球項目的一部分,旨在幫助開發者在以太坊區塊鏈上編程,并為伊朗大部分與國際科技社區隔絕的人提供額外的機會。(CoinDesk)[2021/2/13 19:41:46]
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。
@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方法,得到數據。
徐坤:DeFi開啟了可編程金融,多抵押品推動DeFi快速增長:8月5日15:00,2020年紛智云端峰會第三場直播正式開啟,本場云會議由元界DNA總冠名,螞蟻節點聯盟、金色財經聯合主辦,主題為“DeFi領航數字金融最前沿”。
OKEx首席戰略官徐坤在會上發表了以《DeFi:公鏈的角斗場》為主題的演講,她表示:DeFi開啟了可編程金融,多抵押品推動DeFi快速增長,以太坊DeFi生態繁榮,得益與強大的開發社區,以太坊在DeFi領域處于領先地位,DeFi的浪潮也帶動以太坊生態的繁榮,鏈上數據增長顯著。DeFi有非常大的想象空間,但DeFi的用戶體量仍處于初級階段,如何實現用戶規模量級式突破是下一階段的重要課題。[2020/8/5]
privateStringresponseWallets{Stringwallets=blockService.findAllWallets;returnJSON.toJSONString(newMessage(RESPONSE_WALLET,wallets));}這里我把區塊鏈的相關操作也封裝到了一個service中,下面給出findAllWallets的具體實現,其實就是遍歷錢包集合,統計錢包公鑰,沒有什么難度。
@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:
報告:當前的財政和貨幣環境將加速比特幣這樣可編程貨幣的崛起:數字資產管理機構Electric Capital近日發布報告稱,當前的財政和貨幣環境將加速可編程貨幣的崛起,例如比特幣。在過去三年的大部分時間里,比特幣一直與主流金融資產緊密相關。然而過去幾個月,比特幣走出了獨立行情。相對于美元而言,比特幣目前還不算是價值存儲,但它已經顯示出這種潛力。此外,目前政府、媒體、金融市場等現有系統的信任崩潰,像比特幣這樣的加密系統可以彌補這種信任缺失。(Beincrypto)[2020/5/21]
因此我們的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節點的交互過程。建議你也可以嘗試一下,然后在評論區和我們討論哦!
投資數字資產是一個騙局!該行業的參與者只是在嘗試預測價格的波動,而不是使用基本分析來確定代幣或代幣可能升或降的原因。沒有內在價值。這是基于技術分析的純粹推測。這是徹底的賭博.
1900/1/1 0:00:00一、堅持發展自主核心技術特斯拉在自動駕駛方面的進展顯而易見,自研芯片擁有最強大的算力,特斯拉仍擁有包括高速自動變道和并線等在內的最先進的智能駕駛解決方案.
1900/1/1 0:00:00前言: 比特幣誕生以后,一方面讓區塊鏈行業參與者獲得了豐厚的行業紅利,另外一方面,也向世界傳達了一個信號,那就是科技改變世界的魅力依然在.
1900/1/1 0:00:00開一輛什么樣的車在如今這個時代,仍然會成為讓大多數人另眼相看的一個標準,所以在資金并不是很充裕的情況下,購買二手車是時下很熱門的選擇.
1900/1/1 0:00:00EOS從2017年7月發行至今,各種依托“柚子幣”的傳銷騙局就層出不窮。例如有“柚子魔方”、“柚子投票”、“柚子生態”等.
1900/1/1 0:00:00寫在前面:本周的比特幣技術周報,我們會重點關注一個影響閃電網絡支付的安全問題,隨著比特幣鏈上交易費用增高,其安全隱患也會隨之暴露,而目前的解決方案仍存在著較大的權衡.
1900/1/1 0:00:00