溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么創(chuàng)建NEO輕客戶端

發(fā)布時間:2022-01-11 16:02:22 來源:億速云 閱讀:94 作者:iii 欄目:互聯網科技

這篇文章主要介紹“怎么創(chuàng)建NEO輕客戶端”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么創(chuàng)建NEO輕客戶端”文章能幫助大家解決問題。

為什么?

對于任何項目而言,第一個問題永遠是項目的創(chuàng)建目的的是什么,neo-swift項目創(chuàng)建主要出于4個原因。

  1. 開發(fā)者想要開發(fā)分布式iOS應用,且應用廣度越來越廣。

  2. 建立一個開發(fā)者友好社區(qū),其中一個方法就是創(chuàng)建便于非區(qū)塊鏈開發(fā)者使用的SDK。

  3. 有的開發(fā)者很喜歡Swift。

  4. 移動設備的開發(fā)與部署日益重要。

以下為它的實質內容

讀取操作

首先需要實現區(qū)塊鏈的讀取操作。區(qū)塊鏈是一個公開的分布式賬本,用戶無需通過任何形式的鑒定即可自由讀取信息。實現此類讀取操作的一個途徑是在機器上運行全節(jié)點,全節(jié)點可以保存完全同步的區(qū)塊鏈備份,但移動設備上顯然還沒有足夠的空間存儲區(qū)塊鏈的全部信息備份。在這種情況下,讀取數據的方式是通過RPC與運行全節(jié)點的人進行交流。

public func getBlockBy(index: Int64, completion: @escaping (NeoClientResult<Block>) -> ()) { sendRequest(.getBlock, params: [index, 1]) { result in switch result { case .failure(let error): completion(.failure(error)) case .success(let response): let decoder = JSONDecoder() guard let data = try? JSONSerialization.data(withJSONObject: (response["result"] as! JSONDictionary), options: .prettyPrinted), let block = try? decoder.decode(Block.self, from: data) else { completion(.failure(.invalidData)) return } let result = NeoClientResult.success(block) completion(result) } } }

這一組代碼可以實現從鏈上的特定高度獲取一個區(qū)塊,寫這篇文章時的區(qū)塊高度為1,348,910,可以檢索并查看任何低于該高度的區(qū)塊。感興趣的話可以在鏈上搜索交易、區(qū)塊以及地址等信息,從而更深入了解數據結構的運作機制。https://neotracker.io/

創(chuàng)建錢包

盡管從區(qū)塊鏈讀取數據便于收集數據,但將數據寫入區(qū)塊鏈更有意思。本文將探討NEO區(qū)塊鏈目前正在使用的兩個主要的寫入操作,即發(fā)送資產與認領GAS。希望大家在通讀本文后能對目前使用頻率最高的幾個區(qū)塊鏈操作有清楚的了解。要想把信息寫入NEO區(qū)塊鏈,首先需要獲得一對有效的公私鑰授權你的寫入操作。

“錢包實際上并不存儲任何資產,它的功能只是使用私鑰將寫入需求發(fā)送給區(qū)塊鏈。”

這是錢包軟件用戶最可能出現理解誤區(qū)的一個地方。實際上,NEO資產是存儲在區(qū)塊鏈上的;錢包只是一個交互接口,用戶可以通過這個交互接口輸入私鑰并移動資產,即:將信息寫入分布式賬本。

那么如何生成這對公私鑰呢?首先得生成私鑰,私鑰是由64個字符組成的十六進制字符串,可以是0與2^256(1.15792089e77)之間的任一數字?!百~戶”的其余信息都是根據這串數字派生而來,賬戶信息包括私鑰、WIF(錢包導入格式)、公鑰與地址。

WIF

這是一個私鑰

0C28FCA386C7A227600B2FE50B7CAEEC86D3BF1FBE471BE89827E19D72AA1D

由于過于復雜,把私鑰轉變?yōu)閃IF(錢包導入格式)。

5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ

雖然仍未達到完全可讀的程度,但肯定比原字符串更易讀。WIF還有基本錯誤檢查功能,所以如果把資產發(fā)送給WIF格式地址,就更有可能檢查出錯誤。

公鑰

成功獲得私鑰和WIF后,操作才開始復雜起來。將整個客戶端搭建在Swift上很難,Swift沒有加密方法庫來實現橢圓曲線加密,而NEO需要使用secp256r1橢圓曲線來派生公鑰。

可以通過下方鏈接深入了解有關信息:

ellipticcurves – Is secp256r1 more secure than secp256k1? – Cryptography Stack Exchange

https://github.com/neo-project/neo/blob/master/neo/Cryptography/Crypto.cs

使用btckeygenie,修改后就可以導入到golang錢包生成器中,并使用gomobile編譯。未來可能能用Swift語言編寫一個成熟的ECDSA(橢圓曲線數字簽名算法)庫,但現階段還不能達到。

地址

獲取公鑰后,只要再獲取地址就可以擁有一個“完整賬戶”了。在此階段,將十六進制或WIF私鑰放入go語言程序包中,生成一個完整的賬戶。

public init?(wif: String) { var error: NSError? guard let wallet = GoNeowalletGenerateFromWIF(wif, &error) else {return nil } self.wif = wif self.publicKey = wallet.publicKey() self.privateKey = wallet.privateKey() self.address = wallet.address() self.hashedSignature = wallet.hashedSignature() //We'll discuss thislater }

完成了以上步驟,實際上也就完成了SDK開發(fā)的第一步,也是重要的一步。

發(fā)送資產與認領GAS

生成錢包后,資產可以轉入錢包地址,但同時還需要Neon錢包一類的應用來發(fā)送資產或認領GAS,當然我們還希望創(chuàng)建一個可以嵌入任何iOS移動應用的SDK。

這就需要實現sendrawtransaction RPC方法,參考文檔。

RPC方法負載如下:

"params": [ "80000001195876cb34364dc38b730077156c6bc3a7fc570044a66fbfeeea56f71327e8ab0000029b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500c65eaf440000000f9a23e06f74cf86b8827a9108ec2e0f89ad956c9b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc50092e14b5e00000030aab52ad93f6ce17ca07fa88fc191828c58cb71014140915467ecd359684b2dc358024ca750609591aa731a0b309c7fb3cab5cd0836ad3992aa0a24da431f43b68883ea5651d548feb6bd3c8e16376e6e426f91f84c58232103322f35c7819267e721335948d385fae5be66e7ba8c748ac15467dcca0693692dac"]

出處:

官方文件->NetworkProtocol · neo-project/neo Wiki · GitHub

若結果為“true”,就意味著當前交易就已經成功向全網廣播,大功告成!

若結果為“false”,就意味著當前交易未能成功廣播,導致這種情況的原因有許多,如雙重支付、簽名不完整等。在此例中,交易經確認后已經成功廣播,但是由于存在雙重支付,因此未能進行第二次廣播。

最終javascript sdk輸出的十六進制字符串終于自己的字符串會一致。

跟著javascript操作一遍后,就能為發(fā)送資產交易的完整內存配置繪制一個一目了然的示意圖,如下:

如果詳細地瀏覽每一部分,就會發(fā)現交易從高度最低的內存地址(0x00)開始,一直到最高的內存地址(0xXX),在這里XX是以十六進制表示的交易長度。

第一個元數據:包括交易的種類、版本與屬性。交易種類是轉賬/80/,版本為/00/(可能需要升級?)這里所說的交易不包含特定的屬性。 Input:Input才是真正有意思的部分。NEO或任一區(qū)塊鏈系統(tǒng)的余額不同于傳統(tǒng)服務器客戶端模型中數據庫的任何數字,在實際操作中,余額是以以下形式呈現的。

"GAS": { "balance": 29.02751232, "unspent": [ { "index": 1, "txid":"74cc80ffb1588a964fc6a656302bfe5c3465d2214c64211d8fe2f322cb342a29", "value": 28.0 }, { "index": 0, "txid":"819e00aeca6be42a436b9535b2c165670be9011bbd41afe5d475b0c858a7f6c5", "value": 1.0 }, { "index": 1, "txid":"3d96fb31185394147b237a987730fa2e4c1848744530842e468a6d9bdeec4069", "value": 0.02751232 } ] }

余額總數是某交易ID下“未消耗”數列中所有對象的總合。當我們發(fā)送GAS等資產時,就需要使用這些未消耗的Input來生成一個結果。例如,如果需要發(fā)送28個GAS,就需要一個值為28的Input,但如果需要發(fā)送29個GAS,就需要兩個Input,一個值為28,另一個值為1。你看,所有的交易都會歸納為一個任意數值。目前能進行的最大的交易就是發(fā)送30個GAS,這需要3個Input。

第二個元數據:表示Output的次數。例如,如果我們想要發(fā)送28個GAS,僅會產生一個Output,因為我們會消耗所有Output,僅留下一個Output,這個Output即為發(fā)送給接收人的新交易信息。但如果想要發(fā)送27個GAS呢,情況就會更加復雜,因為這時會產生兩個Output,一個Output是發(fā)送至接收人的27個GAS,另一個是發(fā)回給發(fā)送人的找零。所以每個交易都會產生1個或2個Output。 資產ID:NEO網絡里的每個資產都有其獨一無二的標識符,目前有兩個標識符,但未來可能會有無數個標識符。 發(fā)送資產數額:這是不言自喻的,需要乘以100000000驗證浮點數精度 接收人地址哈希值:這也是不言自喻的,代表接收人地址的哈希值 Total-Send總計:這是發(fā)回給錢包地址的找零,如果找零為0,你就不需要填寫這個字段或后面的發(fā)送人地址哈希值 發(fā)送人地址哈希值:接收找零的地址哈希值

簽名:繼續(xù)使用同一個p256橢圓曲線來為負載簽名,這就是第三個元數據塊前的所有內容。

NEO公鑰:即為普通的公鑰,但包括前綴與后綴字節(jié),我也不清楚前綴和后綴的用處,可能有檢查錯誤的功能。

關于“怎么創(chuàng)建NEO輕客戶端”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

neo
AI