作者: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接口,使其對象可序列化:
Arbitrum開發團隊Offchain Labs將為Arbitrum推出性能超越EVM的編程環境Stylus:金色財經報道,Arbitrum 開發團隊 Offchain Labs 宣布將于今年晚些時候為 Arbitrum One 和 Arbitrum Nova 推出下一代編程環境 Stylus,Stylus 通過 WebAssembly 智能合約功能,允許用戶使用他們最喜歡的編程語言(包括 Rust、C 和 C++)部署應用程序,以便與 Arbitrum 上的 EVM 程序一起運行。Stylus 的速度快了一個數量級,并且能夠降低費用,并且與以太坊虛擬機(EVM)完全互操作。Offchain Labs 將 Stylus 稱之為 EVM+,Stylus 不會取代 EVM。[2023/2/8 11:53:07]
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網絡交互的三個步驟,為大家介紹下相關的實現。
IOHK引入兩個新開發環境,將使Cardano智能合約兼容所有編程語言:Cardano區塊鏈背后的開發公司IOHK昨天宣布引入兩個新的開發環境,允許開發人員為Cardano編寫智能合約。“KEVM”devnet將允許開發人員實現Cardano上現有或未來以Solidity編寫的基于以太坊的應用程序。這意味著超過14萬份智能合約將與Cardano區塊鏈兼容。該devnet使用了一個版本的以太坊虛擬機,該虛擬機已經被一個用于創建正式驗證軟件的框架K驗證。
另一個devnet為IELE,旨在使開發人員能夠用任何編程語言編寫代碼,并將產生的功能移植到Cardano區塊鏈上。據IOHK稱,IELE將是“第一個大規模的beta測試”,使非區塊鏈開發人員無需學習區塊鏈特定的編程語言就可以在Cardano上創建智能合約。(Crypto News Flash)[2020/12/4 13:59:57]
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函數,假設我們只查詢錢包公鑰信息,此時服務端會接收到相應的請求。
動態 | 西班牙銀行將測試智能合約的可編程支付:薩巴德爾銀行、桑坦德銀行、Bankia銀行、BBVA銀行和Caixabank已經啟動概念驗證測試,以部署銀行間智能支付平臺,使區塊鏈網絡能夠執行支付。該倡議由管理西班牙支付系統(SNCE)的Iberpay公司協調,旨在促進從區塊鏈網絡中部署的智能合約啟動即時信貸轉移。Iberpay表示,利用該技術開發的任何一種商業案例都可以執行和編程自動支付——從簽訂合同到交付貨物。該測試包括一個基于部署在區塊鏈網絡中的虛擬業務案例的試點項目,該項目已經實施,每個參與者管理六個分布式節點。(Finextra)[2019/12/20]
@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。
動態 | Blockstream在主網上發布衛星消息應用程序編程接口:據bitcoinmagazine報道,Blockstream已經在主網上發布了衛星消息應用程序編程接口(API)。從本質上講,這意味著用戶現在可以通過該公司的衛星網絡廣播數據,并使用閃電支付來付款。[2019/3/14]
@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的具體實現,其實就是遍歷錢包集合,統計錢包公鑰,沒有什么難度。
@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:
美國國家網絡安全中心正推動科羅拉多州的大學教授編程語言Solidity:據華爾街日報報道,美國國家網絡安全中心(NCC)總長Vance Brown表示,該組織在科羅拉多州的中心與該地區的大學合作,推動這些大學開始教授用于向區塊鏈平臺添加智能合約的編程語言Solidity。[2018/5/26]
因此我們的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:001、脫離完美世界祖龍娛樂“單飛”赴港IPO事件:曾獲完美世界、騰訊投資的移動游戲開放商,祖龍娛樂有限公司正式向港交所遞交招股書.
1900/1/1 0:00:00來源:一財網 Libra2.0將由單一貨幣穩定幣主導,超主權貨幣LibraCoin僅是補充。 一、問題的提出 2019年6月18日,Libra第一版白皮書提出的愿景是:Libra是基于一籃子貨幣.
1900/1/1 0:00:001月25日,抖音和今日頭條的母公司字節跳動,宣布向中國紅十字基金會捐贈2億元人民幣,設立抗擊新型冠狀病感染的肺炎疫情防控醫務人員人道救助專項基金.
1900/1/1 0:00:00哪怕我們現在用手機進行支付的場合會更多,但我們的官方通行貨幣依舊是以紙幣為主的。中國在宋代的時候就開始使用紙幣交子,是世界上使用紙幣最早的國家.
1900/1/1 0:00:00雖然大家對于和平精英新皮膚的關注,一直在服裝上面,但其實有時候官方推出的一些武器皮膚,也是非常精美的。就拿M416來說,其實光子也推出過很多款皮膚了。另外,M416也是眾多玩家最喜歡的武器.
1900/1/1 0:00:00