基于区块链的汽车租赁方案设计
2021-01-20姚剑敏林志贤
林 畅,姚剑敏,2,林志贤,2,严 群,2+
(1.福州大学 物理与信息工程学院,福建 福州 350108;2.晋江市博感电子科技有限公司,福建 晋江 362251)
0 引 言
全国汽车租赁行业的市场规模到2020年预计将达到近千亿元。尽管汽车租赁行业的市场巨大,但仍然存在不少问题:①汽车租赁企业无法核实消费者有效身份信息;②消费者无法获取车辆准确信息;③汽车租赁企业无法准确获得消费者信用信息。将从比特币核心设计中提炼出来的区块链技术应用到汽车租赁行业,让大家看到了塑造更高效、更安全的未来商业网络的可能[1]。
为了简化权限审查,文献[2]利用区块链技术打造审计联盟服务器群和医疗机构联盟服务器群,帮助医学人员快速地进行权限认证,实现医疗大数据的共享流通。考虑到投保人骗保情况的发生,文献[3]将区块链技术应用到传统保险行业,设计出包含投保人、保险公司和政府部门三方一体的系统平台,使其不仅能够自动理赔,还能有效避免欺诈行为的发生。为了防止农产品生产商欺诈消费者行为的发生,文献[4]将传统农产品质量安全追溯系统与区块链技术结合,建成一个防欺诈、高效率的溯源系统。文献[5]将区块链技术与云技术相结合,设计了一个医疗数据记录共享的方案,在该方案中用户可以对数据进行追溯和审查,实时管控数据。
基于上述分析,本文提出一种基于区块链的汽车租赁方案,让多个参与方共同记录共享账本,促进数据的交易与流通,并可以实时地管理和追溯每一条数据,促进汽车租赁行业良好发展。
1 区块链技术
从2009年比特币网络上线至今,比特币系统已经安全稳定的运行超过了10年时间,完成了数百亿美元的交易。可以说区块链技术成就了比特币的伟大,而比特币的成功向世界宣扬了区块链技术。
区块链是由多个区块链接组成的链式数据结构和存储方式,每个区块分为区块头和区块体两个部分,区块头主要用来实现区块链接的前一区块哈希值(hash value),而区块体里的内容主要包括交易信息,如图1所示。
图1 区块链的账本
区块链技术实际上是一种由多方共同参与,持续增长的互联网共享数据库,它以密码学技术作为基础,在此之上设计出多方共享的点对点分布式账本[6]。区块链技术包含了非对称加密、数据区块、链式结构、时间戳、哈希函数、Merkle树等技术,这些技术的融合使用,使其具有独特的优势:可以追溯每一条交易信息、保证数据安全无法被篡改以及系统去中心化等[7,8]。世界上越来越多的科研机构和研究人员开始对区块链技术进行研究,它在能源、医疗以及减少金融交易成本等各个领域都有广泛的应用[9]。
2 链 码
链码(chaincode),源自智能合约的思想,并进行了进一步扩展,支持多种高级编程语言,通过可编程能力提供了对上次应用的支持。其本质上是开发者编写的能够在受保护的沙盒中安全稳定运行的应用程序。当系统调用链码时,链码实现的接口与背书节点建立连接,响应系统请求。
完成链码部署步骤大致分为两步,首先由各个参与方在线下对链码需要完成的相关业务逻辑达成共识,然后用链码实现达成共识的相关业务逻辑并将其部署在平台上。在线上部署时,系统仅对部署者权限进行检查和链码实现业务逻辑的执行,并没有在线上对共识进行审核的流程[10]。
在完成链码的部署之后,还需要对其进行实例化操作,至此链码才处于运行激活状态,之后平台就可以调用 invoke 指令来执行相关交易。在安装时候,需要指定具体安装到哪个peer节点(Endorser);实例化时候,还需要指定是在哪个通道内进行实例化。链码安装以后随时都可以进行升级。
3 基于联盟链汽车租赁方案的设计
将汽车租赁行业数据与区块链技术相结合,基于联盟链进行去中心化汽车租赁方案设计。该方案主要包括4条独立区块链:个人信息管理链、汽车信息管理链、信用信息管理链和交易记录管理链。
该方案主要功能为对个人身份信息进行核实、追溯车辆所有权及车况信息、查看个人信用信息和汽车租赁交易信息上链功能。
相较于传统互联网汽车租赁行业,所提出的方案以区块链技术为基础,通过利用区块链的去中心化、数据不可篡改以及可追踪等特点,可以在汽车租赁企业间不断更新完善骗租名单和租赁车辆信息,并协助找回被盗、被骗车辆,从而提高方案的自治化和公信力。
3.1 方案模型
基于联盟链进行去中心化汽车租赁方案模型如图2所示,该模型中存在4条独立的区块链,分别用来存储不同的信息。
图2 汽车租赁数据共享模型
(1)个人信息管理链(personal information management blockchain,PIMBC):对用户的个人信息进行确认,确保进行汽车租赁的消费者身份信息准确,没有造假。需要不定时对个人信息进行更新,此处的个人信息更新应该由相关政府部门进行维护,如公安机关等。
(2)车辆信息管理链(vehicle information management blockchain,VIMBC):对每一辆进行租赁的汽车进行信息确认,确认车辆来源是否违法,有无违章记录,是否处于抵押状态,车辆是否超出使用年限等信息。该链上信息应该由交管局等进行更新维护,确保信息来源准确可靠。
(3)信用信息管理链(credit information management blockchain,CIMBC):对进行租车的用户进行个人信用信息核实查证。确认用户是否有犯罪记录、是否拥有足够的资金以及信用记录是否良好。核实用户的信用信息可以确保后续租车服务能够收到费用,并且在很大程度上避免骗租行为的发生。该链上信息应该由征信中心以及相关汽车租赁企业等进行更新维护。
(4)交易信息管理链(transaction information management blockchain,TIMBC):将租赁合同、租金、违约金等不可篡改数据上链。由于租赁合同会涉及到PIMBC、VIMBC、CIMBC上的数据,所以它们中的部分节点将加入到TIMBC,由租赁平台向PIMBC、VIMBC、CIMBC请求相关数据,对交易内容进行核实完善后,将所有交易信息打包上链。
3.2 方案功能模块架构
方案功能模块架构如图3所示,主要包括4个部分:业务层、权限管理、共识机制、网络层。
图3 方案功能模块架构
汽车租赁方案,主要是在业务层上进行应用开发。上文提到的4条独立的区块链即位于4个通道内,是排序服务上划分的彼此隔离的原子广播渠道。交易过程实际上是平台用户调用已经成功部署在平台上的链码执行相关业务逻辑对账本状态进行的一次改变。而账本是平台参与各方进行交易,完成状态转换的所有有序、不可篡改的记录。
账本记录中的最新状态被建模为一个版本键/值存储(KVS),更准确地说是状态s被建模为一个元素映射K→(V X N), 其中K是一组键,V是一组值,N是一个无线有序的版本号集。KVS操作模型可以描述为: put(k,v), K中的k和V中的v,处理账本中状态s,将它变为状态s’,这样s’(k)=(v,next(s(k).version)), 且s’(k’)=s(k’), 可以保证所有的k’!=k;get(k), 返回s(k)。
发生交易实际上就是对一个读写集合进行接受的过程。由于通道相互独立,隔离了交易,所以每个通道都拥有对应的隔离的账本结构。
方案采用由Golang语言设计的beego框架完成前端和后端开发,实现后端接收前段界面发来的请求,将处理后的响应结果集再发送给前端界面。
3.3 方案交易流程
整个方案的交易流程如图4所示。
图4 方案交易流程
首先由客户端发出交易提案请求,作为调用链码功能的请求来完成数据到账本的读取或写入。接着由背书节点验证签名,并以交易提案凭证为输入,基于当前状态的数据库来模拟执行提案,执行生成交易结果,随后将模拟的运行结果返回给客户端,客户端对返回的结果进行审查。紧接着客户端提交包含签名背书和模拟执行结果的交易。当排序节点收到请求后,根据时间顺序,创建区块。然后将交易区块发布给通道中的所有节点验证区块中的交易是否有效。如果交易有效,则将区块加入到通道的链中并更新当前状态的数据库。
3.4 链代码数据存储设计
在业务层进行应用开发,首先要做的应该是对链代码进设计编写。方案共有4个不同的通道,用于存储不同的信息,因此需在链代码中声明对应的结构来存储相应的信息。方便后续链代码对相关数据的操作。
个人信息管理链(PIMBC)用于存储于个人身份信息认证相关的一些数据,见表1,包括承租人姓名、承租人身份证号码、承租人性别、家庭住址、手机号码和工作地址。在提出的方案中,数据应该由公安部门进行维护。
表1 个人信息相关数据定义
车辆信息管理链(VIMBC)用于存储出租车辆信息的相关数据,见表2,包括车牌号码、车辆所有者、登记日期、车辆型号、是否违章、是否抵押。用户可以通过这些
表2 车辆信息相关数据定义
信息了解到出租车辆的基本信息,保障用户权益。这些数据应该由车管所进行维护。
信用信息管理链(CIMBC)用于存储个人信用信息的相关数据,见表3,包括承租人姓名、承租人性别、承租人身份证号码、信贷记录、公共记录和信用等级。通过信用信息,企业可以直观了解到用户的信用情况,有效规避风险。这些数据应该由征信机构进行更新维护。
表3 个人信用信息相关数据定义
交易信息管理链(TIMBC)用于存储与交易相关的历史租用一些数据,见表4,包括电子合同的哈希值、订单编号、承租人信息、租金、开始日期、结束日期和备注。用户可以通过该链上信息了解到车辆的以往租金等情况,此数据应该由汽车租赁平台进行更新维护。
表4 交易信息相关数据定义
3.5 链代码算法设计
3.5.1 汽车租赁相关信息加密上传算法
平台用户(包括平台管理者)在平台上注册,系统将根据用户个人信息、注册时间以及随机数,通过SHA256加密生成唯一的用户ID,如式(1)所示
userID=SHA256(personalInfo+regTime+random)
(1)
为了确保个人身份信息、车辆所有权及车况信息、个人信用信息和汽车租赁交易信息在生成上传中不被篡改,方案中使用ECC(elliptic curve cryptography)非对称加密算法对信息进行加密生成公私钥,如式(2),式(3)所示
privateKey=SHA256(userID+timestamp+random)
(2)
publicKey=Secp256k1(privateKey)
(3)
其中,userID为唯一的用户ID;timestamp是合同生成的时间戳;random为系统临时生成的随机数;privateKey是由SHA256哈希算法生成的私钥;publicKey是由ECC椭圆曲线算法Sepc256k1生成的公钥。
因此,用户在平台上注册后将会得到初始3个数字密码,包括唯一的用户ID:userID;公钥:publicKey;私钥:privateKey;如式(4)所示
CRBCuser{userId,publicKey,privateKey}
(4)
当平台用户需要将信息上传时,将利用公钥publicKey完成对信息message的加密,得到加密文件EncryptedFile,如式(5)所示;再对加密文件使用SHA256哈希算法,得到唯一的加密文件哈希DocHash,如式(6)所示;随后将DocHash当作索引保存在区块链中,将加密文件Encrypted-File存储在云端
EncryptedFile=Encrypt(publicKey,message)
(5)
DocHash=SHA256(EncryptedFile)
(6)
汽车租赁相关信息加密上传流程如图5所示。用算法1表示完整的汽车租赁相关信息加密上传过程。
图5 汽车租赁相关信息加密上传流程
算法1: 汽车租赁相关信息加密上传
(1)Input:personalInfo,message
(2)Output:DocHash,EncryptedFiles
(3)begin
(4)while(用户user首次使用)
(5){
(6) if(用户首次注册登录)
(7) {
(8) 生成唯一用户识别ID:
(9)userID=SHA256(personalInfo+regTime+random);
(10) }else{返回, 不执行任何操作, break;}
(11) if(userID生成成功&&还未生成公私钥)
(12) {
(13) 生成私钥:
(14)privateKey=SHA256(userID+timestamp+random);
(15) 生成公钥:
(16)publicKey=Secp256k1(privateKey);
(17) } else{返回, continue;}
(18) if(公私钥生成成功&&读取上传信息成功)
(19) {
(20) 加密信息:
(21)EncryptedFile=Encrypt(publicKey,message);
(22) 得到加密文件哈希:
(23)DocHash=SHA256(EncryptedFile);
(24) returnEncryptedFile;
(25) } else{返回, continue;}
(26) if(将生成的DocHash在区块链中检查是否重复)
(27) {
(28) 将DocHash当做索引保存在区块链中;
(29) 将EncryptedFile存储在云端;
(30) }
(31) else{重复操作, 不执行;}
(32)}
(33)end
3.5.2 汽车租赁相关信息获取算法
针对汽车租赁的场景,当汽车租赁公司需要调取相关信息(如个人信息)时,需要获取DocHash,通过Doc-Hash从云端下载加密文件。下载得到相关信息的加密文件,汽车租赁公司无法解密,只能够允许在汽车租赁平台上注册过的信息上传管理者所持有的privateKey才能解密,保证了信息的安全性。同时为了确保信息不泄露,在解密之前需要对汽车租赁公司的签名Signature进行验证,验证通过并持有私钥privateKey才能得到解密文件DecryptFile。解密公式如式(7)所示
DecryptFile=Decrypt(privateKey,EncryptedFile,Signature)
(7)
获取汽车租赁相关信息流程如图6所示。
图6 获取汽车租赁相关信息流程
整个解密获取信息可用算法2表示。
算法2: 汽车租赁相关信息解密获取
(1)Input:privateKey,EncryptedFile,Signature
(2)Output:DecryptFile
(3)begin
(4)while(汽车租赁公司Signature验证通过)
(5){
(6) if(汽车租赁公司得到DocHash)
(7) {
(8) 通过DocHash从云端下载加密文件Encrypted-File;
(9) if(信息上传管理者所持有的privateKey争取)
(10) {
(11) 执行解密算法, 得到解密文件:
(12)DecryptFile=Decrypt(privateKey,Encryp-tedFile,Signature)
(13) }
(14) }else{
(15) 授权汽车租赁公司获得DocHash;
(16) }
(17)}
3.6 链代码基础功能实现
CRBC链代码需要满足查询信息、添加信息等基础功能。本节描述从部署链代码到满足基础系统功能的全过程。
部署的链代码需包含Init和Invoke两个方法。Init方法在部署链代码时候进行初始化使用并对其中的一些属性提前进行配置,Invoke方法为链代码执行交易请求的方法,Invoke方法依据传入的方法名调用指定方法实现特定功能。链码应用程序接口ChaincodeStubInterface能够对账本进行访问及修改,链码之间也可以通过它进行相互的调用,开发者使用它所提供的GetState、PutState等方法能够对区块链进行相关读写操作[11]。Init和Invoke函数的实现见表5。
表5 链码Init和Invoke方法描述
Invoke函数中调用了相关功能函数,这些功能函数主要实现将数据写入账本以及从账本中读取信息的功能。这些功能函数的实现,需要使用相同的chaincode结构体以及ChaincodeStubInterface参数,利用PutState和GetState函数实现对账本上数据读写的操作。以交易信息写入账本为例,对数据的写操作方法进行描述。数据写入账本功能函数的实现见表6。
表6 链码中写操作方法描述
在交易信息写入账本的过程中,以结构体TranInfo中的OrderID为key,结构体TranInfo中的所有内容为value,上传至账本中,因此从账本中读取数据时,必须以唯一的订单编号OrderID为key,从账本中读取数据。将写入账本的数据读取出来的功能函数实现见表7。
表7 链码中读操作方法描述
本节实现的数据读写方法均是以交易信息为例,其它通道的个人信息、车辆信息以及个人信用信息数据读写操作也都与此大致相同。
3.7 方案后端功能实现
在链代码功能实现的基础上,还需实现方案的后端功能。后端功能主要处理前端发送来的数据和请求,根据前端发送请求的不同,选择将发送来的数据处理后记录到账本或者以发送来的数据作为凭证从账本上读取信息,并将查询结果返回给前端。
方案选择以Golang语言开发的beego框架为基础,进行后端功能的开发。Beego是基于八大独立的模块构建的,是一个高度解耦的框架,同时beego还是一个典型的MVC架构。在后端的开发过程中,主要对beego框架中的models(模型)、controller(控制器)和route(路由)中的功能进行实现。
根据在上文链码提到的Invoke函数中被调用的相关功能函数,在后端功能实现的工程中,需配置beego框架中的route(路由),让后端依据所配置的route,实现对应的处理函数。
在beego框架中route配置信息见表8。
表8 后端route模块配置信息
route(路由)的配置,需要调用controller(控制器)模块中的功能函数,因此需要依据已配置好的路由,在controller中实现route中调用的函数,用于获取前端用户输入,同时调用beego框架中的models(模型)完成将数据写入账本和账本中读取数据的工作。添加和获取交易信息controller模块的实现见表9。
表9 后端controller模块实现
controller模块的完整实现,还需要调用models模块来完成,在models模块中需要调用Fabric的SDK完成最终的数据写入操作。将交易信息写入账本和从账本中读取信息的models模块实现见表10。
表10 后端models模块描述
3.8 方案前端功能实现
方案的前端界面主要分为添加车辆信息、添加征信信息、添加交易信息、车辆信息查询、征信信息查询以及交易信息查询6个入口。方案的前端功能仍是以beego框架作为基础进行实现,主要在beego框架的views模块和sta-tic 模块上进行开发。
前端功能主要负责根据前端页面传送来的请求,与后端进行交互,将数据写入账本或者从账本中读取出相关数据。
以添加交易信息为例,用户在添加交易信息页面,如图7所示,输入订单编号等信息后点击提交,系统根据route(路由)配置信息,调用controller模块中的Add_TranInfo函数。接着Add_TranInfo函数将传入的参数全部整合到一个数组,调用models模块,由models模块使用SDK将前端页面传入的数据写入账本。汽车租赁平台目录界面如图8所示。
图7 添加交易信息页面
图8 汽车租赁平台目录界面
4 安全性能分析
(1)底层区块链技术的安全性决定了汽车租赁方案的安全性,这与每轮区块的生成率(blockchain rate per round,简记为f)息息相关[12]。区块链安全性与f成反比关系,因此可以用1/f表示区块链的安全性,f与区块链中其它相关性能变量之间的关系如式(8)所示
(8)
其中,TransmissionSpeed表示区块链上交易的传播速度;BlockSize表示区块的大小;区块生成的时间间隔由BlockGenerationInterval表示。
另外,区块大小和区块生成时间间隔之间的关系如式(9)所示
BlockSize=BlockGenerationInterval×Q×M
(9)
其中,Q代表每秒上传的交易数量,M代表每个交易的平均大小。对于汽车租赁平台来说,每秒上传的交易数量Q比较大,而且需要多方授权,要求BlockGenerationInterval较低,因此区块大小BlockSize可以基本保持不变。所以为了保证汽车租赁平台的安全性,平台需要保持较高的链上交易的传播速度TransmissionSpeed。
由于汽车租赁平台需要对权限审计所需时间要求较高,为了验证汽车租赁平台的交易性能够满足上述分析中安全性能的要求,本文对汽车租赁平台在高并发的情况下进行性能测试,测试过程主要针对汽车租赁平台中读取信息请求以及写入信息请求,测试指标包括在不同并发量下单位时间内的请求响应数以及平均响应时间。
测试过程中,系统并发量从0逐渐递增至5000,每次并发量递增100。测试设备选用两台操作系统为ubuntu16.0,内存16 G,CPU为i7-7700 K的主机模拟用户和平台,进行性能测试。为了确保数据准确,性能测试共进行5次,最终结果取平均值。
从图9性能测试结果可以看出,当读取信息的请求并发量在2500以内时,系统整体表现较为平稳,没有过大波动,单位时间内的请求响应数稳定在1400~1600之间。在此并发量下,请求响应所需的时间低于2 s。
图9 读取信息请求性能测试结果
写入信息请求的性能测试结果如图10所示,当写入信息的请求并发量在2000以内时,系统整体表现较为平稳,单位时间内的请求响应数稳定在400左右,超过2000后,单位时间内的响应数随着并发量的增加逐渐减少,性能逐渐下降。当写入请求系统并发量为2000时,请求响应所需的时间为4 s左右。
图10 写入信息请求性能测试结果
比特币的BlockGenerationInterval为10 min,与其相比,CRBC的响应时间远低于比特币,交易传播速度TransmissionSpeed快,安全性能得到保障,同时,方案在信息中加入了时间戳,能够抵御攻击者发动的重放攻击。
(2)在信息加密上传和获取解密部分,方案采用了ECC非对称加密技术,在得到加密后文件后必须通过数字签名的验证,并且得到私钥privaKey,才能够解密。攻击者想在没有授权且没有获得私钥privateKey情况下,对非法获得的加密文件EncryptedFile进行解密是十分困难的。
(3)CRBC目的是对参与方的数据共享权限进行精细化管控,可以让数据安全地在多方之间流动,促进数据的交易与流通,并可以实时地管理和追溯每一条数据,解决非安全环境下的信任问题。CRBC以联盟链为基础,改善了公有链无人监管的问题,CRBC与传统汽车租赁平台以及公有链模型的对比见表11。
表11 多平台对比
5 结束语
区块链技术本质上是一种数据库,用于存储线上平台成员之间共同记录的账本,它与传统数据库之间相比最明显的优势在于分布式存储与去中心化管理[13]。方案依据区块链技术去中心化、数据不可篡改以及可追踪等特点,研究设计了基于区块链技术的汽车租赁方案,该方案采用非对称加密,让多方共同参与维护账本,保证了数据在安全的情况下进行多方共享,使数据最大利用化,保证了方案的自治化与公信力。但该方案在具体的实现过程中仍存在一定的问题与挑战需要解决,如让公安部门、车管所、征信机构等政府部门参与进来,共享海量数据,共同维护方案的运行,存在一定的难度,而且当交易量日益增大时,对方案的共识机制也是很大的挑战。解决上述问题,对方案进一步落地,具有重要意义。区块链技术作为一项新兴技术,虽有许多不足和缺点有待改进,但是众多开发者仍在不断开发完善区块链技术,促使区块链项目早日落地实施。方案对区块链技术在汽车租赁方面的应用提出了设计方案,希望能为汽车租赁行业存在的痛点提供新的解决思路,也希望能对后续区块链的应用研究有一些启发与建议。