以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads
首頁 > 比特幣 > Info

編程小白模擬簡易比特幣系統,手把手帶你寫一波_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接口,使其對象可序列化:

Sui Network發布0.28新版本文檔,包括引入可編程新型交易等:3月7日消息,公鏈Sui Network發布下一個版本0.28的文檔。具體功能更改將包括推出取代批次處理交易和普通交易的可編程新型交易、從20字節調整到32字節(在十六進制中,從40增加到64)、更改Gas預算以使用SUI而不是Gas單位等。[2023/3/7 12:46:47]

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

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]

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函數,假設我們只查詢錢包公鑰信息,此時服務端會接收到相應的請求。

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

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

聲音 | 德國銀行協會呼吁建立基于歐元的可編程數字貨幣:金色財經報道,10月30日,代表200多家私人商業銀行和11個會員協會的德國銀行協會(Bankenverband)在論文中表示:“經濟需要可編程的數字歐元”。該文件指出,貨幣體系的責任屬于主權民族國家,銀行或私人公司提供的任何貨幣都必須適合國家確定的體系。其他任何事情最終都會導致混亂和不穩定。這些銀行建議,在建立并發、通用的泛歐支付平臺的情況下建立基于密碼學的數字歐元。報告指出,為了保持歐洲的競爭力,滿足客戶的需求并降低交易成本,應考慮引入基于歐元的可編程數字貨幣。[2019/10/31]

@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的具體實現,其實就是遍歷錢包集合,統計錢包公鑰,沒有什么難度。

動態 | eToro利用編程語言在區塊鏈上進行衍生品交易:總部位于以色列的交易所平臺eToro推出了一種新的編程語言,旨在簡化衍生品交易。這種被稱為Lira的語言將降低結算金融合同所涉及的風險,并使利用以太坊區塊鏈上的資產創造新的衍生產品成為可能。eToroX Labs還推出了一個演示交易平臺,允許散戶和機構投資者開始交易衍生品。(coindesk)[2019/9/15]

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

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

比特幣
萬家營業部最新分布圖:銀河、中信建投北京稱雄,申萬宏源上海營業部最多,深圳布局最多竟是它_APP

來源:財聯社 營業網點布局是各家券商經紀業務布局考量的關鍵因素。最新數據顯示,當前證券公司共有營業網點11703家,較2018年底增加235家,增幅2.05%.

1900/1/1 0:00:00
J.K.羅琳:加密貨幣是迷人的,但我沒法理解比特幣是什么_比特幣

J.K.羅琳,《哈利·波特》魔法世界的創造者,一個在全球擁有億萬粉絲的英國著名作家,在昨日她突然關注了一個問題:什么是比特幣?隨后.

1900/1/1 0:00:00
變賣房產、強行復工的馬斯克,能否用名聲換回銷量?_馬斯克

提起埃隆·馬斯克,很多人想到的第一個詞就是鋼鐵俠,然后就是特斯拉,如果了解深一點的話,還可能知道他的SpaceX、超級高鐵和腦后插管項目.

1900/1/1 0:00:00
數學不好是一種病?_區塊鏈

特別聲明:本文為新華網客戶端新媒體平臺“新華號”賬號作者上傳并發布,僅代表作者觀點,不代表新華號的立場及觀點。新華號僅提供信息發布平臺.

1900/1/1 0:00:00
手握1300億美金的巴菲特,不抄底數字貨幣準備買域名_亞馬遜

本周一,就在早盤亞洲市場重挫和歐洲市場跟跌之后,美國開盤只用了短短四分鐘就出現了歷史上第二次熔斷:標普500快速下挫7%觸及第一層熔斷,暫停交易15分鐘.

1900/1/1 0:00:00
點贊能代表一切?Github的星數排行榜被高估了_Cortex

全文共1722字,預計學習時長6分鐘 圖源:unsplash流量時代注意力代表一切,這一條似乎在哪兒都說得通.

1900/1/1 0:00:00
ads