唐屹+陳家豪+吳嘉熙


摘要:區塊鏈技術是近年來興起的一類計算機應用技術,不同的基于區塊鏈的密碼貨幣的產生,引發了對密碼貨幣的管理問題。現有的專用錢包模式要求使用多幣種的用戶下載不同錢包進行資產管理。基于三層架構思想,設計了一個通用錢包的實現架構,以實現對多種密碼貨幣的管理。通過所實現的通用錢包原型,驗證了通用錢包架構的可行性。
關鍵詞:區塊鏈;密碼貨幣;通用錢包
DOIDOI:10.11907/rjdk.172067
中圖分類號:TP319
文獻標識碼:A文章編號文章編號:1672-7800(2018)001-0205-03
Abstract:The blockchain is the emerging application technique in recent years. The occurrences of various blockchain based cryptocurrencies introduce the cryptocurrency management. Cryptocurrency users need to maintain different special wallets to manage their different cryptocurrencies. Based on three-tier architecture, the structure of a general wallet, which can be used tomanages different cryptocurrencies in a single system, is proposed. We have implemented a general wallet prototype and validated the proposed structure.
Key Words:blockchain; cryptocurrency; general wallet
0引言
以比特幣為代表的密碼貨幣基于區塊鏈技術,通過分布式系統的共識確認交易信息,以明文形式記錄所有交易數據并保存于去中心化的記錄節點中,形成分布式賬本[1-4]。這些基于區塊鏈的密碼貨幣使用密碼技術防止交易數據的篡改和偽造,同時也支持對任意用戶交易信息的查詢。
密碼貨幣的主要特征之一是公開所有用戶資產,所有人都可以查找任意用戶的余額。現有的密碼貨幣的操作依賴于專用錢包,由于不同密碼貨幣具有不同的運作細節和方式,使得使用不同密碼貨幣的單個用戶需要維護多個不同的專用錢包,以管理其資產。因此,有必要設計一種通用錢包,以實現對用戶擁有的多種密碼貨幣的管理。
1密碼貨幣錢包
密碼貨幣錢包最基本的功能是查詢貨幣余額和收付貨幣即交易轉賬。一般由于效率的原因,錢包并不會下載密碼貨幣對應的整個分布式賬本數據,而是連接到一個代理系統,讓代理系統處理余額查詢和交易轉賬等請求,并將響應返回給用戶,從而避免了區塊鏈的規模負載,使手機客戶端等輕量級終端也可以正常進行錢包操作。
密碼貨幣的專用錢包通過遠程過程(RPC)調用實現用戶與密碼貨幣網絡的交互,其分為RPC客戶端與RPC服務器兩部分,交互時使用TLS協議加密通訊,以保證數據安全[5]。RPC服務器即為該密碼貨幣網絡中的任意節點,它提供了一組特定接口,包括用戶查賬、轉賬甚至更高級的部署智能合約等,等待并響應RPC客戶端請求。RPC客戶端定義了一組面向前端的函數,它根據函數要實現的功能,向給定的RPC服務器發送相應請求信息。
通用錢包支持不同類型密碼貨幣的管理,因此需要屏蔽各RPC的技術細節,通過引入邏輯層,將用戶對具體貨幣的訪問引流到給定的密碼貨幣網絡。
2通用錢包設計
2.1體系架構
圖1展示了本文設計的通用錢包,其體系結構自頂而下分為3層:①用戶界面層。完成用戶請求的發送以及響應數據的顯示,為用戶提供一種交互式操作的界面。由于使用了AngularJS框架,其運行環境可以是桌面PC,也可以是智能移動設備;②業務邏輯層。針對具體的用戶請求,實現錢包數據的業務邏輯處理;③數據訪問層。完成對區塊鏈系統記賬節點的請求訪問,實現對分布式賬本的訪問操作。
需要注意的是,業務邏輯層和數據訪問層并不要求與用戶界面層位于同一個硬件系統,這兩層可以在另外的設備中以代理服務器的形式實現,從而使用戶界面可以更加輕量化。
錢包所涉及的密碼貨幣網絡由三元組
根據錢包體系架構,錢包用戶通過用戶界面發送請求,請求可以同時發送多個,邏輯層根據請求中的network和address生成數據訪問層的請求內容;數據訪問層發送請求并接收來自密碼貨幣層的響應;收到響應后,數據訪問層整理并轉碼數據;經業務邏輯層傳輸,用戶界面層顯示數據給用戶。
2.2數據交換描述
JSON(JavaScript Object Notation)是一種輕量級的數據交換語言,采用完全獨立于語言的文本格式,易于閱讀與編寫,同時也易于機器解析與生成。本文使用JSON格式的數據完成層次間的基本數據交換。
(1)用戶界面層。用戶界面層實現與業務邏輯層的數據交換,包含請求和響應兩類數據。
請求數據格式為{“network”:“”,“method”:“params”,“address”:“”},其中network、address的內容來自密碼貨幣網絡三元組,在用戶不提供address的情況下,會默認連接到公鏈上的RPC節點,method字段為通用錢包操作標識,params值對應執行操作需要用到的參數。
響應數據格式為{“data”:“”,“error”:“”}。其中的data為來自數據訪問層的結果,若返回結果中有錯誤,則error描述該錯誤。
(2)業務邏輯層。業務邏輯層完成以下基本功能:①完成對用戶請求的解析(包括頭部和內容);②轉發用戶請求到目標網絡。當接收到界面層請求時,首先根據界面層請求中的network值決定調用哪種RPC客戶端,然后查看對應的RPC客戶端是否與節點address建立了連接。若已連接,則調用相應RPC客戶端執行用戶請求,否則先建立連接,在建立連接過程中發生任何錯誤都會立刻終止執行并返回錯誤給用戶。同時將通用錢包的操作轉化為特定密碼貨幣網絡上的錢包操作。
(3)數據訪問層。數據訪問層主要由RPC客戶端構成,負責與分布式賬本節點的RPC服務器端通信,并作一些必要的數據轉換。RPC客戶端與RPC服務器端之間可定義的通訊語法如下:
請求:{“jsonrpc”:“”,“method”:“”,“params”:“”,“id”:“”}
在請求字段中,jsonrpc代表rpc通信標準的版本號,通常為2.0。method的值為RPC服務器提供的一組方法,它嚴格按照RPC服務器端的定義,例如同樣為查詢余額,比特幣中RPC服務器端提供的接口函數名為get_balance,而以太坊中則為getBalance。數據訪問層請求中的method與用戶界面層中的method不同,這里為密碼學貨幣網絡中RPC服務器端定義好的,不可修改,只能按照指定字段調用。params為解析器轉換后的用戶參數,它能被目標網絡識別,與用戶界面層中的params類似,但沒有作為method的值而是單成為一個鍵值對。id為隨機值,用作區分響應。
響應:{“data”:“”,“error”:“”,“id”:“”}
響應字段中,data為遠程調用的方法返回的結果,如果發生錯誤則值為nul;error字段描述錯誤發生時的錯誤詳情;id為相應請求的id值。
3原型實現
基于實驗室環境搭建的比特幣網絡和以太坊平臺實現了一個通用錢包,支持比特幣和以太幣的管理。該通用錢包支持比特幣的余額查詢(balance)、查看未花費輸出(utxo['unspend'])、發送簽名交易(rawtx)、查看區塊交易信息(txdata)、查看當前區塊高度(currentBlock),同時也支持以太幣的余額查詢(balance)、發送簽名交易(rawtx)、查看區塊交易信息(txdata)、查看gas價格(estimatedGas)、查看當前區塊高度(CurrentBlock)等操作。本文以余額查詢和轉賬操作為例說明所實現的原型。
3.1余額查詢
用戶若想查看某密碼貨幣的余額,需要在用戶界面層導入其私鑰文件,以解鎖錢包功能。用戶界面層會依據文件格式自動推導出文件對應的密碼貨幣網絡以及密碼貨幣地址,例如用戶導入了比特幣網絡的wif文件,錢包則解鎖比特幣的功能并自動推導出與文件相應的地址,然后推送請求,邏輯層根據network字段將請求交給對應的數據訪問層處理,得到返回值,最后處理返回值并響應用戶[6]。
假設用戶Alice同時擁有比特幣和以太幣,她想查詢對應金額,于是把比特幣私鑰文件BSK和以太幣私鑰文件ESK導入錢包,用戶界面層接收導入的私鑰,分別調用bitcore.PrivateKey(BPK).toAddress()和ethereumjs.privateToAddress(EPK)兩個函數,進行錢包地址轉化。此處是把用戶私鑰轉換成對應密碼貨幣網絡中的賬戶地址,自動調用getBalance()顯示兩個地址各自的余額,余額數據的顯示界面如圖2所示。
依據該頁面,可以看到根據私鑰文件轉化出來的錢包地址和查詢得到的余額:比特幣地址“mgMCdTHJNPVYmBcPJvUZV8EcsUVGUQT7gw”的余額為1 200個比特幣,以太坊地址“0xdf5d17e416eff3220018227794c43639 8aba50e0”的余額約為1 902個以太幣。
3.2轉賬操作
Alice若想向以太幣網絡中的某個錢包地址發送以太幣,可在用戶界面層中的表單中填寫目的地址和轉賬數量,生成原始交易信息rawTx,之后用自己的私鑰簽名將交易信息和簽名信息提交給業務邏輯層處理,邏輯層根據network字段將請求交給以太坊的數據訪問層處理,并得到交易已被受理的回執rTXb,最后界面層把回執顯示給用戶。
例如,若Alice想要給Bob發送1 000個以太幣,首先需要獲得Bob的以太坊賬戶地址,如“0xe86200961EbB72 8d1bc3f4BbBd7164815097DeB1”,填寫表單如圖3所示。
點擊生成交易,得到交易的摘要“0xdf5d17e416eff322 0018227794c436398aba50e0”,然后向代理服務器發送該摘要,以獲得一個分配的nonce值和所需的gas值,加上服務器返回的nonce值和gasprice值,得到完整的交易信息:
確認無誤后Alice私鑰簽名,得到簽名信息:
向代理服務器發送簽名并得到回執“0x59688af8c7 61db478c8652a2db1031aff4839168b1485913b4f9ef868ff0b1 b8”,至此,Alice向Bob轉賬1 000個以太幣的交易完成。得到回執后需要等待一段時間才能查看到正確的余額,因為轉賬需要以太幣網絡中的共識節點參與,所以會有一定延時。再次刷新余額即會發現賬戶余額改變,說明交易順利完成,如圖4所示。
4結語
對于不同的密碼貨幣,現有的專用錢包模式要求使用多幣種的用戶下載不同錢包進行資產管理。本文介紹了多幣種通用錢包的設計與實現,設計了三層體系結構,完成了不同密碼貨幣錢包的整合,從而驗證了通用錢包架構的可行性。
參考文獻:
[1]SATOSHI. Bitcoin: a peer-to-peer electronic cash system[EB/OL]. https://bitcoin.org/bitcoin.pdf.
[2]VITALIK BUTERIN. Ethereum project[EB/OL].https://www.ethereum.org/.
[3]鄒均,張海寧,唐屹,等.區塊鏈技術指南[M].北京:機械工業出版社,2016.
[4]A NARAYANAN, J BONNEAU, E FELTEN, et al. Bitcoin and cryptocurrency technologies: a comprehensive introduction[M]. Princeton :Princeton University Press,2016.
[5]TBERNERSLEE. The TLS protocol version 1.0[J].Journal of Biological Chemistry,1999,276(35):32567-32574.
[6]MISKO HEVERY. AngularJS[EB/OL]. https://docs.angularjs.org/.
[7]ANDREAS M ANTONOPOULOS. Mastering bitcoin[M]. Chicago: OReilly Media,2014.
(責任編輯:黃健)endprint