以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > 幣贏 > Info

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

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

Circle為企業提供新的可編程Web3錢包:金色財經報道,USDC穩定幣發行商Circle周二發布一個新的可編程web3錢包平臺,該公司表示,該平臺可以幫助企業向客戶提供數字資產支付。

根據一份新聞稿,開發者和商家可以將Circle所謂的可編程錢包集成并個性化到他們的應用程序中,并在其上構建服務,讓消費者發送、接收和存儲加密貨幣,包括Circle的USDC和NFT。

Circle表示,該服務在以太坊、Avalanche和Polygon網絡上提供公開測試版,供開發人員使用,并計劃在今年晚些時候擴展到其他區塊鏈。[2023/8/8 21:32:35]

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

Starkware開源Cairo編程語言的最新版本:金色財經報道,區塊鏈開發公司 Starkware 開源了其編程語言 Cairo 的新版本,Cairo 支持 Starkware 的Layer 2網絡 StarkNet 和 StarkEx。根據一份聲明,這是該語言自創建以來的第一個主要版本,新版本將很快被引入 StarkNet。[2022/11/25 8:06:15]

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方法:

StarkWare總裁:要獲得最大的可擴展性需使用能釋放其潛力的編程語言:9月22日消息,在由萬向區塊鏈實驗室主辦的第八屆區塊鏈全球峰會上,以太坊擴容解決方案StarkWare聯合創始人兼總裁Eli Ben-Sasson表示,STARK數學技術能夠讓人們相信,即使沒有監管,也不需要監督計算的每一步,合約都會保證正確的執行。一臺性能有限的計算機,可以監督并聲明大量計算集群的可靠性,并且無需重新執行計算,這就是這項技術為什么會和區塊鏈有關系。

Ben-Sasson稱,StarkWare采用的方法是基于數學的證明,也就是有效性證明的方式,StarkWare要實現的目標是能夠讓任何人運行非常龐大的計算機,并且處理相關的事情,然而做執行的一切事情都必須向L1進行證明。如果想要獲得最大的可擴展性,實際上需要使用能夠釋放其潛力的編程語言。[2022/9/22 7:14:17]

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。

Halborn 發現 Flow 編程語言 Cadence 中的高危漏洞,目前已修復:7月11日消息,區塊鏈安全機構 Halborn 在 Twitter 上表示,在審計 Cadence 語言期間發現 Flow 編程語言 Cadence 中的高危漏洞,該漏洞使得 Cadence 可以允許訪問被銷毀的資源。該漏洞產生的原因是由于當資源被銷毀時,解釋器不會使對資源的引用無效,從而使得可以調用被銷毀資源上的函數。目前 Cadence 解釋器已更新,以便在創建對可選項的引用時檢查內部值的類型。[2022/7/11 2:06:06]

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

動態 | 公鏈項目Solana已支持Libra的編程語言Move虛擬機:公鏈項目Solana宣布已支持Facebook為Libra項目推出的全新編程語言Move的虛擬機(VM)。[2019/8/28]

因此我們的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價格

幣贏
HARL:紅樓夢:細細來扒一扒每人的月收入,折合多少人民幣?

賈政,榮國府的當家人。 他每日只看書下棋,同一幫清客閑聊,從不管府中的大小事務,一切委托侄媳婦王熙鳳來料理,倒也落了個清閑。這里,筆者就以賈政為主線,來扒一扒賈府各人的每月薪水.

1900/1/1 0:00:00
比特幣:Ripple的瑞波幣(XRP)遲遲不能突破0.3美元的三個原因

瑞波的XRP代幣本月初表現良好,上漲了20%,隨后進行了調整。然而現在,它反彈已經停滯,多頭幾經努力發現很難突破0.30美元。希望被全球采用的代幣XRP也引發了人們對它將進入更高一級市場的期待.

1900/1/1 0:00:00
USD:1997 年香港的禽流感,和 1918 年的大流感有什么聯系?

《1918年之疫:被流感改變的世界》 內容簡介 1918年1月,第一次世界大戰尚未停歇,一種可怕的新型病卻開始在全球范圍內散播.

1900/1/1 0:00:00
RON:孫宇晨“圓夢”巴菲特晚餐:吃3小時共花500美元 巴菲特態度變了?

來源:時間財經 作者:刁艷艷 2月6日晚,波場幣TRON創始人孫宇晨表示,已于1月23日同巴菲特共進晚餐,并送給巴菲特一個比特幣.

1900/1/1 0:00:00
胡蘿卜:物聯網與區塊鏈結合:小米的區塊鏈野心不小

“站在風口上,豬都能飛起來”這幾年來,雷布斯的這句至理名言一直被人奉為創業寶典,影響了一代又一代的創業者。而在這個創新的時代,區塊鏈的風口愈演愈烈,頗有席卷全球之勢.

1900/1/1 0:00:00
比特幣:越來越多的機構投資者進場比特幣,散戶應該如何操作?

越來越多的機構投資者看好數字貨幣。 灰度的持倉有新披露,他們已經購入2020年近一半已開采的ETH.

1900/1/1 0:00:00
ads