唐屹+陳家豪+吳嘉熙
摘要:區(qū)塊鏈技術(shù)是近年來(lái)興起的一類計(jì)算機(jī)應(yīng)用技術(shù),不同的基于區(qū)塊鏈的密碼貨幣的產(chǎn)生,引發(fā)了對(duì)密碼貨幣的管理問(wèn)題。現(xiàn)有的專用錢包模式要求使用多幣種的用戶下載不同錢包進(jìn)行資產(chǎn)管理。基于三層架構(gòu)思想,設(shè)計(jì)了一個(gè)通用錢包的實(shí)現(xiàn)架構(gòu),以實(shí)現(xiàn)對(duì)多種密碼貨幣的管理。通過(guò)所實(shí)現(xiàn)的通用錢包原型,驗(yàn)證了通用錢包架構(gòu)的可行性。
關(guān)鍵詞:區(qū)塊鏈;密碼貨幣;通用錢包
DOIDOI:10.11907/rjdk.172067
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):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引言
以比特幣為代表的密碼貨幣基于區(qū)塊鏈技術(shù),通過(guò)分布式系統(tǒng)的共識(shí)確認(rèn)交易信息,以明文形式記錄所有交易數(shù)據(jù)并保存于去中心化的記錄節(jié)點(diǎn)中,形成分布式賬本[1-4]。這些基于區(qū)塊鏈的密碼貨幣使用密碼技術(shù)防止交易數(shù)據(jù)的篡改和偽造,同時(shí)也支持對(duì)任意用戶交易信息的查詢。
密碼貨幣的主要特征之一是公開(kāi)所有用戶資產(chǎn),所有人都可以查找任意用戶的余額?,F(xiàn)有的密碼貨幣的操作依賴于專用錢包,由于不同密碼貨幣具有不同的運(yùn)作細(xì)節(jié)和方式,使得使用不同密碼貨幣的單個(gè)用戶需要維護(hù)多個(gè)不同的專用錢包,以管理其資產(chǎn)。因此,有必要設(shè)計(jì)一種通用錢包,以實(shí)現(xiàn)對(duì)用戶擁有的多種密碼貨幣的管理。
1密碼貨幣錢包
密碼貨幣錢包最基本的功能是查詢貨幣余額和收付貨幣即交易轉(zhuǎn)賬。一般由于效率的原因,錢包并不會(huì)下載密碼貨幣對(duì)應(yīng)的整個(gè)分布式賬本數(shù)據(jù),而是連接到一個(gè)代理系統(tǒng),讓代理系統(tǒng)處理余額查詢和交易轉(zhuǎn)賬等請(qǐng)求,并將響應(yīng)返回給用戶,從而避免了區(qū)塊鏈的規(guī)模負(fù)載,使手機(jī)客戶端等輕量級(jí)終端也可以正常進(jìn)行錢包操作。
密碼貨幣的專用錢包通過(guò)遠(yuǎn)程過(guò)程(RPC)調(diào)用實(shí)現(xiàn)用戶與密碼貨幣網(wǎng)絡(luò)的交互,其分為RPC客戶端與RPC服務(wù)器兩部分,交互時(shí)使用TLS協(xié)議加密通訊,以保證數(shù)據(jù)安全[5]。RPC服務(wù)器即為該密碼貨幣網(wǎng)絡(luò)中的任意節(jié)點(diǎn),它提供了一組特定接口,包括用戶查賬、轉(zhuǎn)賬甚至更高級(jí)的部署智能合約等,等待并響應(yīng)RPC客戶端請(qǐng)求。RPC客戶端定義了一組面向前端的函數(shù),它根據(jù)函數(shù)要實(shí)現(xiàn)的功能,向給定的RPC服務(wù)器發(fā)送相應(yīng)請(qǐng)求信息。
通用錢包支持不同類型密碼貨幣的管理,因此需要屏蔽各RPC的技術(shù)細(xì)節(jié),通過(guò)引入邏輯層,將用戶對(duì)具體貨幣的訪問(wèn)引流到給定的密碼貨幣網(wǎng)絡(luò)。
2通用錢包設(shè)計(jì)
2.1體系架構(gòu)
圖1展示了本文設(shè)計(jì)的通用錢包,其體系結(jié)構(gòu)自頂而下分為3層:①用戶界面層。完成用戶請(qǐng)求的發(fā)送以及響應(yīng)數(shù)據(jù)的顯示,為用戶提供一種交互式操作的界面。由于使用了AngularJS框架,其運(yùn)行環(huán)境可以是桌面PC,也可以是智能移動(dòng)設(shè)備;②業(yè)務(wù)邏輯層。針對(duì)具體的用戶請(qǐng)求,實(shí)現(xiàn)錢包數(shù)據(jù)的業(yè)務(wù)邏輯處理;③數(shù)據(jù)訪問(wèn)層。完成對(duì)區(qū)塊鏈系統(tǒng)記賬節(jié)點(diǎn)的請(qǐng)求訪問(wèn),實(shí)現(xiàn)對(duì)分布式賬本的訪問(wèn)操作。
需要注意的是,業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層并不要求與用戶界面層位于同一個(gè)硬件系統(tǒng),這兩層可以在另外的設(shè)備中以代理服務(wù)器的形式實(shí)現(xiàn),從而使用戶界面可以更加輕量化。
錢包所涉及的密碼貨幣網(wǎng)絡(luò)由三元組
根據(jù)錢包體系架構(gòu),錢包用戶通過(guò)用戶界面發(fā)送請(qǐng)求,請(qǐng)求可以同時(shí)發(fā)送多個(gè),邏輯層根據(jù)請(qǐng)求中的network和address生成數(shù)據(jù)訪問(wèn)層的請(qǐng)求內(nèi)容;數(shù)據(jù)訪問(wèn)層發(fā)送請(qǐng)求并接收來(lái)自密碼貨幣層的響應(yīng);收到響應(yīng)后,數(shù)據(jù)訪問(wèn)層整理并轉(zhuǎn)碼數(shù)據(jù);經(jīng)業(yè)務(wù)邏輯層傳輸,用戶界面層顯示數(shù)據(jù)給用戶。
2.2數(shù)據(jù)交換描述
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換語(yǔ)言,采用完全獨(dú)立于語(yǔ)言的文本格式,易于閱讀與編寫,同時(shí)也易于機(jī)器解析與生成。本文使用JSON格式的數(shù)據(jù)完成層次間的基本數(shù)據(jù)交換。
(1)用戶界面層。用戶界面層實(shí)現(xiàn)與業(yè)務(wù)邏輯層的數(shù)據(jù)交換,包含請(qǐng)求和響應(yīng)兩類數(shù)據(jù)。
請(qǐng)求數(shù)據(jù)格式為{“network”:“”,“method”:“params”,“address”:“”},其中network、address的內(nèi)容來(lái)自密碼貨幣網(wǎng)絡(luò)三元組,在用戶不提供address的情況下,會(huì)默認(rèn)連接到公鏈上的RPC節(jié)點(diǎn),method字段為通用錢包操作標(biāo)識(shí),params值對(duì)應(yīng)執(zhí)行操作需要用到的參數(shù)。
響應(yīng)數(shù)據(jù)格式為{“data”:“”,“error”:“”}。其中的data為來(lái)自數(shù)據(jù)訪問(wèn)層的結(jié)果,若返回結(jié)果中有錯(cuò)誤,則error描述該錯(cuò)誤。
(2)業(yè)務(wù)邏輯層。業(yè)務(wù)邏輯層完成以下基本功能:①完成對(duì)用戶請(qǐng)求的解析(包括頭部和內(nèi)容);②轉(zhuǎn)發(fā)用戶請(qǐng)求到目標(biāo)網(wǎng)絡(luò)。當(dāng)接收到界面層請(qǐng)求時(shí),首先根據(jù)界面層請(qǐng)求中的network值決定調(diào)用哪種RPC客戶端,然后查看對(duì)應(yīng)的RPC客戶端是否與節(jié)點(diǎn)address建立了連接。若已連接,則調(diào)用相應(yīng)RPC客戶端執(zhí)行用戶請(qǐng)求,否則先建立連接,在建立連接過(guò)程中發(fā)生任何錯(cuò)誤都會(huì)立刻終止執(zhí)行并返回錯(cuò)誤給用戶。同時(shí)將通用錢包的操作轉(zhuǎn)化為特定密碼貨幣網(wǎng)絡(luò)上的錢包操作。
(3)數(shù)據(jù)訪問(wèn)層。數(shù)據(jù)訪問(wèn)層主要由RPC客戶端構(gòu)成,負(fù)責(zé)與分布式賬本節(jié)點(diǎn)的RPC服務(wù)器端通信,并作一些必要的數(shù)據(jù)轉(zhuǎn)換。RPC客戶端與RPC服務(wù)器端之間可定義的通訊語(yǔ)法如下:
請(qǐng)求:{“jsonrpc”:“”,“method”:“”,“params”:“”,“id”:“”}
在請(qǐng)求字段中,jsonrpc代表rpc通信標(biāo)準(zhǔn)的版本號(hào),通常為2.0。method的值為RPC服務(wù)器提供的一組方法,它嚴(yán)格按照RPC服務(wù)器端的定義,例如同樣為查詢余額,比特幣中RPC服務(wù)器端提供的接口函數(shù)名為get_balance,而以太坊中則為getBalance。數(shù)據(jù)訪問(wèn)層請(qǐng)求中的method與用戶界面層中的method不同,這里為密碼學(xué)貨幣網(wǎng)絡(luò)中RPC服務(wù)器端定義好的,不可修改,只能按照指定字段調(diào)用。params為解析器轉(zhuǎn)換后的用戶參數(shù),它能被目標(biāo)網(wǎng)絡(luò)識(shí)別,與用戶界面層中的params類似,但沒(méi)有作為method的值而是單成為一個(gè)鍵值對(duì)。id為隨機(jī)值,用作區(qū)分響應(yīng)。
響應(yīng):{“data”:“”,“error”:“”,“id”:“”}
響應(yīng)字段中,data為遠(yuǎn)程調(diào)用的方法返回的結(jié)果,如果發(fā)生錯(cuò)誤則值為nul;error字段描述錯(cuò)誤發(fā)生時(shí)的錯(cuò)誤詳情;id為相應(yīng)請(qǐng)求的id值。
3原型實(shí)現(xiàn)
基于實(shí)驗(yàn)室環(huán)境搭建的比特幣網(wǎng)絡(luò)和以太坊平臺(tái)實(shí)現(xiàn)了一個(gè)通用錢包,支持比特幣和以太幣的管理。該通用錢包支持比特幣的余額查詢(balance)、查看未花費(fèi)輸出(utxo['unspend'])、發(fā)送簽名交易(rawtx)、查看區(qū)塊交易信息(txdata)、查看當(dāng)前區(qū)塊高度(currentBlock),同時(shí)也支持以太幣的余額查詢(balance)、發(fā)送簽名交易(rawtx)、查看區(qū)塊交易信息(txdata)、查看gas價(jià)格(estimatedGas)、查看當(dāng)前區(qū)塊高度(CurrentBlock)等操作。本文以余額查詢和轉(zhuǎn)賬操作為例說(shuō)明所實(shí)現(xiàn)的原型。
3.1余額查詢
用戶若想查看某密碼貨幣的余額,需要在用戶界面層導(dǎo)入其私鑰文件,以解鎖錢包功能。用戶界面層會(huì)依據(jù)文件格式自動(dòng)推導(dǎo)出文件對(duì)應(yīng)的密碼貨幣網(wǎng)絡(luò)以及密碼貨幣地址,例如用戶導(dǎo)入了比特幣網(wǎng)絡(luò)的wif文件,錢包則解鎖比特幣的功能并自動(dòng)推導(dǎo)出與文件相應(yīng)的地址,然后推送請(qǐng)求,邏輯層根據(jù)network字段將請(qǐng)求交給對(duì)應(yīng)的數(shù)據(jù)訪問(wèn)層處理,得到返回值,最后處理返回值并響應(yīng)用戶[6]。
假設(shè)用戶Alice同時(shí)擁有比特幣和以太幣,她想查詢對(duì)應(yīng)金額,于是把比特幣私鑰文件BSK和以太幣私鑰文件ESK導(dǎo)入錢包,用戶界面層接收導(dǎo)入的私鑰,分別調(diào)用bitcore.PrivateKey(BPK).toAddress()和ethereumjs.privateToAddress(EPK)兩個(gè)函數(shù),進(jìn)行錢包地址轉(zhuǎn)化。此處是把用戶私鑰轉(zhuǎn)換成對(duì)應(yīng)密碼貨幣網(wǎng)絡(luò)中的賬戶地址,自動(dòng)調(diào)用getBalance()顯示兩個(gè)地址各自的余額,余額數(shù)據(jù)的顯示界面如圖2所示。
依據(jù)該頁(yè)面,可以看到根據(jù)私鑰文件轉(zhuǎn)化出來(lái)的錢包地址和查詢得到的余額:比特幣地址“mgMCdTHJNPVYmBcPJvUZV8EcsUVGUQT7gw”的余額為1 200個(gè)比特幣,以太坊地址“0xdf5d17e416eff3220018227794c43639 8aba50e0”的余額約為1 902個(gè)以太幣。
3.2轉(zhuǎn)賬操作
Alice若想向以太幣網(wǎng)絡(luò)中的某個(gè)錢包地址發(fā)送以太幣,可在用戶界面層中的表單中填寫目的地址和轉(zhuǎn)賬數(shù)量,生成原始交易信息rawTx,之后用自己的私鑰簽名將交易信息和簽名信息提交給業(yè)務(wù)邏輯層處理,邏輯層根據(jù)network字段將請(qǐng)求交給以太坊的數(shù)據(jù)訪問(wèn)層處理,并得到交易已被受理的回執(zhí)rTXb,最后界面層把回執(zhí)顯示給用戶。
例如,若Alice想要給Bob發(fā)送1 000個(gè)以太幣,首先需要獲得Bob的以太坊賬戶地址,如“0xe86200961EbB72 8d1bc3f4BbBd7164815097DeB1”,填寫表單如圖3所示。
點(diǎn)擊生成交易,得到交易的摘要“0xdf5d17e416eff322 0018227794c436398aba50e0”,然后向代理服務(wù)器發(fā)送該摘要,以獲得一個(gè)分配的nonce值和所需的gas值,加上服務(wù)器返回的nonce值和gasprice值,得到完整的交易信息:
確認(rèn)無(wú)誤后Alice私鑰簽名,得到簽名信息:
向代理服務(wù)器發(fā)送簽名并得到回執(zhí)“0x59688af8c7 61db478c8652a2db1031aff4839168b1485913b4f9ef868ff0b1 b8”,至此,Alice向Bob轉(zhuǎn)賬1 000個(gè)以太幣的交易完成。得到回執(zhí)后需要等待一段時(shí)間才能查看到正確的余額,因?yàn)檗D(zhuǎn)賬需要以太幣網(wǎng)絡(luò)中的共識(shí)節(jié)點(diǎn)參與,所以會(huì)有一定延時(shí)。再次刷新余額即會(huì)發(fā)現(xiàn)賬戶余額改變,說(shuō)明交易順利完成,如圖4所示。
4結(jié)語(yǔ)
對(duì)于不同的密碼貨幣,現(xiàn)有的專用錢包模式要求使用多幣種的用戶下載不同錢包進(jìn)行資產(chǎn)管理。本文介紹了多幣種通用錢包的設(shè)計(jì)與實(shí)現(xiàn),設(shè)計(jì)了三層體系結(jié)構(gòu),完成了不同密碼貨幣錢包的整合,從而驗(yàn)證了通用錢包架構(gòu)的可行性。
參考文獻(xiàn):
[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]鄒均,張海寧,唐屹,等.區(qū)塊鏈技術(shù)指南[M].北京:機(jī)械工業(yè)出版社,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.
(責(zé)任編輯:黃?。〆ndprint