比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads

LET:編程小白模擬簡易比特幣系統,手把手帶你寫一波

Author:

Time: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接口,使其對象可序列化:

以太坊編程語言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網絡交互的三個步驟,為大家介紹下相關的實現。

Conflux研究總監楊光:好的編程范式可以讓智能合約更容易被形式化驗證,從而更安全:金色財經報道,6月9日,Conflux研究總監楊光做客金色財經舉辦的“Web3.0-從信息交互到萬物互聯還要走多久?”為主題的金色沙龍第63期活動。楊光表示如果將區塊鏈網絡作為Web3.0基礎設施,那么跨鏈協議是必備的,信息和資產需要在不同的區塊鏈網絡之間流動。其實跨鏈分很多個層次,信息跨鏈、資產跨鏈、智能合約的跨鏈互操作等等,難度是依次遞增的。與之配套的還有各種數據格式、接口、通訊協議等等,甚至是統一的智能合約語言和編程范式。好的編程范式可以讓智能合約更容易被形式化驗證,從而更安全;也可以讓合約在執行時候更容易實現并行化,優化性能和成本。[2021/6/9 23:24:53]

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。

動態 | 區塊鏈編程語言Voyage宣布與CoinStar幣星交易所達成合作:區塊鏈編程語言及開發工具Voyage宣布與臺灣CoinStar幣星交易所達成合作,將為后者提供區塊鏈底層技術支持。雙方將共同推出跨鏈錢包、安全智能合約等插件功能。Voyage團隊表示,與CoinStar的合作,是Voyage進入臺灣的良好開端。[2018/8/23]

@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:

央行數字貨幣研究所所長姚前對話業內專家:未來數字貨幣是可編程的智能化貨幣:12月19日,2017中國深圳FinTech(金融科技)全球峰會在深圳舉行,對金融科技創新及監管(Regtech)等前沿問題進行集中探討。大會上姚前在總結中,這樣給數字貨幣定義:“央行數字貨幣從長遠來看,從價值支撐的角度來說,是信用問題。從實現的方式來說,應該是加密問題。從操作的要求上來說,很可能是賬本的問題。從將來應用的前景來說,它應該是智能貨幣。”[2017/12/19]

因此我們的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節點的交互過程。建議你也可以嘗試一下,然后在評論區和我們討論哦!

Tags:LETWALLETWALLET幣LET價格WALLET價格WALLET幣WAL幣WAL價格

歐易交易所
CBR:中國富豪儲備多少現金?李嘉誠千億在手,馬云馬化騰囤了5000億!

文/鄢子為編輯/陳曉平 “在風和日麗的時候,假設你駕駛著以風推動的遠洋船,離開港口時,你要先想到萬一懸掛十號風球,你怎么應付。”李嘉誠一直相信,在危機來臨之前,企業應準備抵御風浪的現金.

1900/1/1 0:00:00
哈耶克:《薛兆豐經濟學講義》第6集:為什么過年過節總是買不到火車票?

各位書友大家好,歡迎繼續做客半畝塘讀書會,今天我們繼續來講這本書,薛兆豐經濟學講義。昨天我們講到了供給不足,價格就會上升,這就出現了競爭,其實人類面臨的最基本約束就是稀缺,也就是東西不夠,之前大.

1900/1/1 0:00:00
區塊鏈:貴州“汽車幣”——世界上唯一的汽車圖案流通銀幣暗藏的記號

民國時期,與其他或人像或旗幟的圖案不同,貴州省獨樹一幟,制作了一批汽車圖案的銀幣。 據說在國際上,即便是不收藏錢幣但是喜愛車輛的玩家也會收而藏之,就更不用說愛好錢幣的藏家了.

1900/1/1 0:00:00
區塊鏈:巴比特周選丨新物種“閃電貸”引發的一場DeFi危機;區塊鏈+疫情應用揭開區塊鏈社會治理的大門

社區熱議:bZx引發的DeFi危機攻擊者通過控制DeFi貸款協議bZx的方式,獲得了35萬美元的「收益」,其手法在DeFi世界引起了軒然大波,也讓「閃電貸FlashLoan」這個新物種.

1900/1/1 0:00:00
虛擬幣:傳銷的原罪有哪些?

編者按 馬克思在自己的著作里曾經寫下幾乎最全面的關于資本家為獲取利益而采取的方法論以及茫茫商業剝削的本質。那時候的資本家和目前習慣稱呼的“老板”們肯定是截然不同的.

1900/1/1 0:00:00
比特幣:比特幣遭“血洗”!超11萬人爆倉,“數字黃金”已涼涼?

比特幣昨晚遭血洗后,3月13日早間,價格再次跳水,半小時再次狂瀉近2000美元,連續兩次超大跌幅后,24小時跌幅超40%。昔日的“避險資產”已經成為完全的“高風險”資產.

1900/1/1 0:00:00
ads