区块链上的通用钱包设计与实现
2018-02-01唐屹陈家豪吴嘉熙
唐屹+陈家豪+吴嘉熙
摘要:区块链技术是近年来兴起的一类计算机应用技术,不同的基于区块链的密码货币的产生,引发了对密码货币的管理问题。现有的专用钱包模式要求使用多币种的用户下载不同钱包进行资产管理。基于三层架构思想,设计了一个通用钱包的实现架构,以实现对多种密码货币的管理。通过所实现的通用钱包原型,验证了通用钱包架构的可行性。
关键词:区块链;密码货币;通用钱包
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