比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads
首頁 > USDT > Info

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

Bitfinex與Penguin Academy將合作提供巴拉圭女性編程訓練營:4月27日消息,Bitfinex宣布與Penguin Academy合作,將為巴拉圭女性提供為期三周的入門編碼課程。訓練營將于2023年5月3日至24日在巴拉圭的埃斯特城舉行。課程課程包括Python編碼基礎知識以及區塊鏈、物聯網和機器人技術。(Coinjournal)[2023/4/27 14:30:16]

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

觀點:穩定幣必須可編程:金色財經報道,在提供穩定價值方面,穩定幣和中央銀行數字貨幣(CBDC)似乎服務于同一枚硬幣的兩面。然而,加密穩定資產可以提供完全不同的用例,而CBDC根本無法與之競爭。關鍵是可編程性,智能合約可以自動化并為貨幣添加新功能。可編程性允許資產支持和去中心化,這在當前的CBDC設計中是不可能的。開發人員應該利用穩定資產提供的可編程機會,而不是試圖與CBDC競爭。

穩定資產發行人明確表示,他們可以改善當前的貨幣體系,主要通過三種方式。首先,穩定資產有助于降低傳統金融活動的成本,例如通過去中心化金融(DeFi)和匯款進行去中心化借貸。其次,在經歷惡性通貨膨脹的國家中,人們使用穩定資產作為保護收入和穩定支付的手段,例如通過委內瑞拉的儲備協議。第三,穩定幣可用于更注重隱私的支付,例如MobileCoin(MOB)。穩定資產的這三個目的屬于當今金融體系的框架。因此,值得注意的是,理論上CBDC也可以解決穩定幣解決的問題。[2023/4/25 14:24:34]

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

可編程保險市場Tidal Finance在Polygon上線主網:可編程保險市場Tidal Finance在二層擴容網絡Polygon上線主網,其初始客戶包括StaFi、XendFinance、Marlin、EasyFi和bZx。Tidal Finance表示將向公開市場推出儲備池挖礦計劃,提供100%的APY以激勵初始流動性提供者,并將使得儲備池中資產達到100萬美元。[2021/7/28 1:19:16]

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

Cardano在以太坊虛擬機開發網絡中增加新編程語言Glow:Cardano在以太坊虛擬機(EVM)開發網絡中增加了一種新的編程語言Glow,該語言旨在簡化智能合約的編寫和部署。引入Glow將改善開發過程并降低其成本。(U.Today)[2021/2/26 17:56:57]

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

動態 | eToroX 實驗室將對 Libra 編程語言 Move 進行試驗:全球多資產交易平臺 eToro 旗下加密貨幣交易所 eToroX 的區塊鏈實驗室團隊宣布將對 Facebook 區塊鏈 Libra 使用的編程語言 Move 進行試驗,使用部署在以太坊區塊鏈上的 eToken 實施,測試代幣如何在 Libra 上運行。eToroX 團隊表示 Move 類似編程語言 Rust,但 Move 以不同的方式定義資源:Move 不允許移動或復制資源,目的是防止意外重復和丟失;Move 會阻止代表其他用戶發布數據,因此用戶需要確認所發布的所有內容,使他們能夠完全控制選擇共享的信息。[2019/6/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價格

USDT
ETH:應美國邀請,李蘭娟院士網上給美國醫療專家上課全程漢語愛誰誰_ETHER

李蘭娟院士給美國專家上課,全程漢語,彰顯了漢語言的魅力,特別是杭州口音!21世紀是中國的世紀,學習漢語對外國人很有必要;言猶在耳,李蘭娟院士講課就是一個鮮明的例子.

1900/1/1 0:00:00
MSN:導圖秀周回顧:HRE早分享的延申思考01~_MSN價格NBA幣

本周在HRE微信群里聽了幾次音頻分享,相關主題啟發良多,畫的導圖有幾張主題都和HRE群分享有關。 139《結交貴人的準備》我現在微信里好友4000+,能稱得上“貴人”的,也許十中有一就很不錯了.

1900/1/1 0:00:00
區塊鏈:區塊鏈的相關名詞你知道哪些_MAC價格

私鏈 私鏈,又稱無代幣區塊鏈完全私有的區塊鏈,是指寫入權限僅在一個組織手里的區塊鏈。讀取權限或對外開放或任意程度進行限制。比方說管理、審計、甚至一家企業.

1900/1/1 0:00:00
ETH:琥珀中發現史上最小的恐龍化石_USDT

來自緬甸的一個壯觀的新琥珀化石擁有迄今為止發現的最小的史前恐龍的頭骨:一種生活在9900萬年前的類鳥生物,并不比今天活著的最小的鳥大.

1900/1/1 0:00:00
CEO:昔日千億巨頭閱文集團再異動!股價兩日暴漲20% 只因騰訊一個動作_WIFI價格

來源:東方財富網 原標題:昔日千億巨頭閱文集團再異動!股價兩日暴漲20%,只因騰訊一個動作 昨日下午3點50分到4點,港股收盤的最后10分鐘,閱文集團股價異動,大漲近6%.

1900/1/1 0:00:00
CNN:預訓練模型ProphetNet:根據未來文本信息進行自然語言生成_BAR

作者|劉大一恒、齊煒禎、晏宇、宮葉云、段楠、周明編者按:微軟亞洲研究院提出新的預訓練模型ProphetNet,提出了一種新的自監督學習目標——同時預測多個未來字符.

1900/1/1 0:00:00
ads