您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么創建NEO輕客戶端”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么創建NEO輕客戶端”文章能幫助大家解決問題。
為什么?
對于任何項目而言,第一個問題永遠是項目的創建目的的是什么,neo-swift項目創建主要出于4個原因。
開發者想要開發分布式iOS應用,且應用廣度越來越廣。
建立一個開發者友好社區,其中一個方法就是創建便于非區塊鏈開發者使用的SDK。
有的開發者很喜歡Swift。
移動設備的開發與部署日益重要。
以下為它的實質內容
讀取操作
首先需要實現區塊鏈的讀取操作。區塊鏈是一個公開的分布式賬本,用戶無需通過任何形式的鑒定即可自由讀取信息。實現此類讀取操作的一個途徑是在機器上運行全節點,全節點可以保存完全同步的區塊鏈備份,但移動設備上顯然還沒有足夠的空間存儲區塊鏈的全部信息備份。在這種情況下,讀取數據的方式是通過RPC與運行全節點的人進行交流。
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) } } }
這一組代碼可以實現從鏈上的特定高度獲取一個區塊,寫這篇文章時的區塊高度為1,348,910,可以檢索并查看任何低于該高度的區塊。感興趣的話可以在鏈上搜索交易、區塊以及地址等信息,從而更深入了解數據結構的運作機制。https://neotracker.io/
創建錢包
盡管從區塊鏈讀取數據便于收集數據,但將數據寫入區塊鏈更有意思。本文將探討NEO區塊鏈目前正在使用的兩個主要的寫入操作,即發送資產與認領GAS。希望大家在通讀本文后能對目前使用頻率最高的幾個區塊鏈操作有清楚的了解。要想把信息寫入NEO區塊鏈,首先需要獲得一對有效的公私鑰授權你的寫入操作。
“錢包實際上并不存儲任何資產,它的功能只是使用私鑰將寫入需求發送給區塊鏈。”
這是錢包軟件用戶最可能出現理解誤區的一個地方。實際上,NEO資產是存儲在區塊鏈上的;錢包只是一個交互接口,用戶可以通過這個交互接口輸入私鑰并移動資產,即:將信息寫入分布式賬本。
那么如何生成這對公私鑰呢?首先得生成私鑰,私鑰是由64個字符組成的十六進制字符串,可以是0與2^256(1.15792089e77)之間的任一數字。“賬戶”的其余信息都是根據這串數字派生而來,賬戶信息包括私鑰、WIF(錢包導入格式)、公鑰與地址。
WIF
這是一個私鑰
0C28FCA386C7A227600B2FE50B7CAEEC86D3BF1FBE471BE89827E19D72AA1D
由于過于復雜,把私鑰轉變為WIF(錢包導入格式)。
5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ
雖然仍未達到完全可讀的程度,但肯定比原字符串更易讀。WIF還有基本錯誤檢查功能,所以如果把資產發送給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開發的第一步,也是重要的一步。
發送資產與認領GAS
生成錢包后,資產可以轉入錢包地址,但同時還需要Neon錢包一類的應用來發送資產或認領GAS,當然我們還希望創建一個可以嵌入任何iOS移動應用的SDK。
這就需要實現sendrawtransaction RPC方法,參考文檔。
RPC方法負載如下:
"params": [ "80000001195876cb34364dc38b730077156c6bc3a7fc570044a66fbfeeea56f71327e8ab0000029b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc500c65eaf440000000f9a23e06f74cf86b8827a9108ec2e0f89ad956c9b7cffdaa674beae0f930ebe6085af9093e5fe56b34a5c220ccdcf6efc336fc50092e14b5e00000030aab52ad93f6ce17ca07fa88fc191828c58cb71014140915467ecd359684b2dc358024ca750609591aa731a0b309c7fb3cab5cd0836ad3992aa0a24da431f43b68883ea5651d548feb6bd3c8e16376e6e426f91f84c58232103322f35c7819267e721335948d385fae5be66e7ba8c748ac15467dcca0693692dac"]
出處:
官方文件->NetworkProtocol · neo-project/neo Wiki · GitHub
若結果為“true”,就意味著當前交易就已經成功向全網廣播,大功告成!
若結果為“false”,就意味著當前交易未能成功廣播,導致這種情況的原因有許多,如雙重支付、簽名不完整等。在此例中,交易經確認后已經成功廣播,但是由于存在雙重支付,因此未能進行第二次廣播。
最終javascript sdk輸出的十六進制字符串終于自己的字符串會一致。
跟著javascript操作一遍后,就能為發送資產交易的完整內存配置繪制一個一目了然的示意圖,如下:
如果詳細地瀏覽每一部分,就會發現交易從高度最低的內存地址(0x00)開始,一直到最高的內存地址(0xXX),在這里XX是以十六進制表示的交易長度。
第一個元數據:包括交易的種類、版本與屬性。交易種類是轉賬/80/,版本為/00/(可能需要升級?)這里所說的交易不包含特定的屬性。 Input:Input才是真正有意思的部分。NEO或任一區塊鏈系統的余額不同于傳統服務器客戶端模型中數據庫的任何數字,在實際操作中,余額是以以下形式呈現的。
"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下“未消耗”數列中所有對象的總合。當我們發送GAS等資產時,就需要使用這些未消耗的Input來生成一個結果。例如,如果需要發送28個GAS,就需要一個值為28的Input,但如果需要發送29個GAS,就需要兩個Input,一個值為28,另一個值為1。你看,所有的交易都會歸納為一個任意數值。目前能進行的最大的交易就是發送30個GAS,這需要3個Input。
第二個元數據:表示Output的次數。例如,如果我們想要發送28個GAS,僅會產生一個Output,因為我們會消耗所有Output,僅留下一個Output,這個Output即為發送給接收人的新交易信息。但如果想要發送27個GAS呢,情況就會更加復雜,因為這時會產生兩個Output,一個Output是發送至接收人的27個GAS,另一個是發回給發送人的找零。所以每個交易都會產生1個或2個Output。 資產ID:NEO網絡里的每個資產都有其獨一無二的標識符,目前有兩個標識符,但未來可能會有無數個標識符。 發送資產數額:這是不言自喻的,需要乘以100000000驗證浮點數精度 接收人地址哈希值:這也是不言自喻的,代表接收人地址的哈希值 Total-Send總計:這是發回給錢包地址的找零,如果找零為0,你就不需要填寫這個字段或后面的發送人地址哈希值 發送人地址哈希值:接收找零的地址哈希值
簽名:繼續使用同一個p256橢圓曲線來為負載簽名,這就是第三個元數據塊前的所有內容。
NEO公鑰:即為普通的公鑰,但包括前綴與后綴字節,我也不清楚前綴和后綴的用處,可能有檢查錯誤的功能。
關于“怎么創建NEO輕客戶端”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。