APP下载

基于零知识证明的智能合约投票系统设计与实现

2023-01-07殷红建郭光来

工程科学学报 2023年4期
关键词:投票者计票选票

殷红建,朱 岩,王 静,郭光来,陈 娥✉

1) 北京科技大学计算机与通信工程学院,北京 100083 2) 海信集团控股股份有限公司,青岛 266071

智能合约作为第二代区块链技术的核心,其本质是部署在区块链上的一系列可执行数字协议.智能合约兼顾区块链和合约的双重属性,具有去中心化、不可篡改、可编程和法律化等特征[1],已经被广泛应用于金融、数字资产管理等诸多领域[2-5].近年来,随着支持智能合约开发的区块链平台相继提出,例如以太坊[6]、根链(RootStock)[7]以及Hyperledger Fabric[8],开发人员可通过可编程的语言(如Solidity,Java)在这些平台上实现对智能合约的开发、部署和执行.然而,区块链平台的开放性使得部署在区块链上的智能合约是公开透明的,因此合约交易中的所有数据也都是公开可见的,这势必引起合约交易中敏感信息的泄露问题.在电子投票合约中,由于合约数据涉及用户的隐私信息且投票内容不能公开,因此合约隐私泄露问题尤为突出.

尽管现有智能合约平台支持密码机制(例如椭圆曲线密码ECC)可用来保护投票合约中选票内容的隐私,但在计票阶段仍需对选票解密后再进行统计,这将为投票内容的隐私带来威胁.此外,为了避免无效选票对系统的干扰,需在投票之前对选票内容的合法性进行验证,并且验证过程不能泄露投票内容信息.显然,现有智能合约中的密码机制不能满足智能合约投票系统对数据隐私及安全性的需求.因此,设计新的能够保护交易隐私的智能投票合约系统是十分必要的和迫切的.

1981 年,Chaum[9]首次提出了安全电子投票系统的概念,此后涌现出了一大批关于电子投票协议构造以及安全性的研究[10-13].目前为止,尽管人们对其安全性仍存在一定争论[14],但电子投票系统已在实际环境中得到广泛应用,甚至被用于国家选举[15].随着区块链技术的出现与发展,基于区块链的电子投票系统被相继开发.2015 年Zhao与Chan[16]设计了第一个基于区块链的电子投票方案,该方案能够在比特币网络中直接运行.随后,Tarasov 与Tewari[17]基于Zcash 设计了一个新的电子投票协议,协议中投票结果的正确性由可信任第三方和投票者共同保证.2017 年,McCorry等[18]设计了第一个去中心化的能够实现自动计票功能的投票协议,并在以太坊平台以合约的形式进行了实现.然而,该系统仅支持小规模候选人模式,而对于大范围投票,该协议则不再适用.Yu等[19]利用环签名技术设计了基于智能合约的可验证投票系统并在Hyperledger Fabric 平台上进行了部署实现.

此外,为防止无效选票对投票系统带来的干扰,需对选票有效性进行验证.零知识集合成员关系证明协议(Zero-knowledge set membership proof protocol,ZSMPP)[20]可为选票有效性验证提供技术支持,通过零知识证明技术,ZSMPP 协议允许在不泄露选票内容的情况下对公开候选人集验证选票.2008 年,Camenisch 等[20]提出了集合成员关系判定问题,并基于Strong Diffie-Hellman (SDH)假设在双线性群下构造了第一个ZSMPP 协议.随后,Morais 等[21]利用数字签名方案[22]对文献[20]的证明阶段进行优化,使计算开销降低到常数级别.最近,Yin 等[23]基于聚合函数构造了同时支持属于和不属于关系的ZSMPP 协议,其安全性同样依赖于SDH 假设.然而,上述协议功能复杂且执行过程中均需多次双线性配对运算,因此不宜直接移植到资源受限的智能合约投票系统中.

本文主要目标是设计并实现基于零知识证明的智能合约投票系统.通过构造轻量化ZKDMP协议来验证选票内容的有效性;通过对选票进行同态加密操作从而保障选票内容的隐私.该系统的以合约形式自动执行,无需第三方机构参与.本文主要贡献可总结如下:

(1)设计了智能合约投票系统,该系统可对投票内容的有效性进行验证,以避免无效选票对投票系统的影响.投票过程无需第三方机构参与,实现去中心化投票以及自动化计票.此外,通过Java开发工具将投票合约编译成JAR 包文件,并将投票系统以合约代码的形式部署到区块链,通过智能合约实现整个投票过程自动化执行.

(2)为了在选票内容有效性验证过程中保护投票内容的隐私,本文构造了一个新的交互式零知识集合成员关系证明协议.该协议通过两轮交互过程,实现证明者在不泄露投票内容具体信息的情况下,向验证者证明投票内容的有效性,即,投票内容是候选者集合中的一个.此外,安全性分析表明,所提协议在离散对数困难假设下具有零知识性.

1 基于零知识证明的智能合约投票系统

1.1 系统框架

本文设计的智能合约投票系统是基于支持虚拟机的区块链环境下进行开发运行的,投票过程通过合约控制实现,并通过在智能合约中引入交互式零知识证明来保证投票数据验证过程的隐私性.智能合约投票系统框架如图1 所示,整个投票系统框架主要分为实现层、技术层和合约层三部分.

图1 智能合约投票系统框架Fig.1 Framework of the smart-contract voting system

(1)实现层:实现层由区块链与基于Java 的双线性配对密码库(Java pairing based cryptography library,JPBC[24])两部分组成,其中区块链为智能合约的部署和执行提供了运行环境,JPBC 库则为基于配对的密码方案的实现提供了底层环境.

(2)技术层:技术层主要是提供了一种交互式零知识证明以及同态加密技术.零知识证明技术用于投票内容的有效性验证,确保投票过程中投票内容的隐私性.同态加密方案用于对选票加密,在计票阶段利用同态性直接对密文进行操作,避免解密运算,确保投票内容的隐私性.

(3)合约层:通过智能合约语言将投票系统以条款的形式进行描述,并通过Java 开发工具将投票合约编译成计算机可执行的合约代码形式,最终实现智能合约投票系统按照预定规则自动化执行.

1.2 系统模型

本文设计的智能合约投票系统模型如图2 所示,整个投票系统是基于支持虚拟机的区块链系统进行设计开发的,取代了以往的第三方投票机构,从而实现投票系统的去中心化.

图2 智能合约投票系统模型Fig.2 Model of the smart-contract voting system

智能合约投票系统执行流程如下:首先,投票发起者创建投票合约,并在合约中指定候选者名单,之后将合约部署到区块链中;投票者在完成注册后,可从区块链中调用投票合约来进行投票,并且在投票之前对选票内容的合法性进行验证,验证通过后将投票结果加密并按合约规定上传选票;当所有投票者完成投票后,合约开始计票并将密文状态的计票结果上传至区块链;计票结束后,投票发起者将从链上获取密文状态下的计票结果,利用自身私钥解密后,将计票结果公布到区块链上.

投票系统是通过智能合约控制实现的,投票合约在开始执行后,整个投票流程会被自动触发执行,智能合约投票的每一步都会被日志记录.投票系统可分为初始化、注册、投票和计票四个阶段.

(1)初始化阶段:系统初始化阶段首先借助JPBC 库完成对系统参数的生成,随后投票发起者制定投票智能合约并指定候选者名单,随后将投票合约以JAR 包的形式部署到区块链.

(2)注册阶段:发起者在区块链上完成合约部署之后,投票者需完成系统注册,注册完成后,投票者名单会被上传至区块链.

(3)投票阶段:在投票之初,发起者需对投票者的投票内容进行有效性验证,只有验证通过,投票才能继续进行.最后,投票者利用同态加密技术对验证通过的选票进行加密,按合约规定以交易的形式上传密文状态的投票结果.

(4)计票阶段:所有投票者完成投票后,投票合约进行计票并将结果上传至区块链.投票发起者可从区块链中获取密文状态的计票结果,利用自身私钥进行解密后以交易的形式公布到区块链上.

2 零知识集合成员关系证明协议

零知识证明是指证明者在不向验证者透露秘密值的前提下,使验证者相信自己确实持有该秘密.基于此,将零知识证明引入智能合约可保证合约中数据的隐私性,同时由于智能合约具有触发自动执行的特点,合约状态总是可以被保留下来,这就为交互式零知识证明的实现提供了运行平台.

2.1 提出的协议

本文基于离散对数假设构造一个新的零知识集合成员关系证明协议(ZSMPP).该协议涉及证明者和验证者两方,通过两方交互,实现证明者在不透露任何消息的情况下,向验证者证明其拥有的元素属于一个公开的集合,具体协议描述如下.

设 Zp是 阶数为p的 整数群,H为 哈希算法,g是椭圆曲线上一个随机生成元,公开集合M表示为M={m1,m2,···,mn}.证明者P 欲向验证者V 证明自己持有的元素m是 公开集中的某一个,即m∈M,但是不透露元素m本身的信息.

初始条件,证明者P 和验证者V 共享消息集M,V 拥有安全哈希算H,交互过程如图3 所示:

图3 零知识集合成员关系证明协议Fig.3 Zero-knowledge set membership proof protocol

(1)P→V:证明者P 首先选取两个随机数ω,α ∈Zp作为自己的私钥,计算Commit=(x,y),其中x=gω,y=gαgm,然后将x和y发送给验证者;

如果验证结果失败,验证者输出结果为“0”,则表示验证者V 将驳回P 的证明并且结束方案;如果检验成功,结果返回为“1”,则表示V 将接收证明者的证明.经过上述双方交互过程,P 向V 证明了自己拥有秘密m但 未向V 透露关于m任何信息.

2.2 协议安全性分析

(1)完全性.

在提出的交互式证明协议中,若证明者P 的消息m确实属于消息集M且P 能够遵守协议指令完成交互,那么V 总是能够接受P 的证明.

证明:设g是 椭圆曲线群的一个生成元,由协议中步骤(4)可知:

在步骤(3)中计算时aj规定mj∈M且mj≠m,又由于P 能够遵守协议指令完成交互,则必有m=mn,又由于y=gαgm以及 γn=ω-αµn,则有

从而可以得出步骤(6)中验证等式成立.

(2)零知识性.

证明者P 的私钥 (ω,α)仅自己持有,在交互式证明过程中,证明者将包含消息的承诺y=gαgm发送给验证者V,由于计算离散对数问题是困难的,因此在交互过程中,除了关于消息m的承诺之外,证明者无法获取其他任何信息,这保证了整个交互过程中消息m的零知识性.

3 投票智能合约

在设计和实现智能合约投票系统之前,我们首先给出具体投票合约.本节将采用智能合约规范语言SPESC[25],对投票系统的初始化、注册、投票和计票四个阶段的触发条件以及执行过程进行合约化描述.

如图4 所示,投票智能合约包括发起者(Initiator)和投票者(Voter)两个参与方.该合约包含5 个条款(Term),条款1 表示在投票发起人进行参数初始化(initParam)之后,可指定候选者名单(对应candidateForm 算法);条款2 表示在发起者指定候选者名单之后,投票者进行注册(voterRegist);条款3 描述的是在投票者注册完成之后,必须与发起者进行交互式ZSMPP 来验证选票的有效性;条款4 表示当ZSMPP 输出为“1”时投票者利用Boneh、Goh 和Nissim 提出的 加密算 法[26](简 称BGN 算法)对投票内容进行加密;条款5 表示发起人在所有投票者完成投票之后,合约进行计票(对应voteResult 算法),最终发起者对计票结果进行解密获取投票最终结果.合约中条款仅描述了投票各个阶段的触发条件以及执行的算法,具体算法描述将在下节中给出.

图4 SPESC 语言编写的投票智能合约Fig.4 Voting contracts written in SPESC language

智能合约最终将被部署到区块链平台进行自动化执行,如图5 所示,部署过程可分成两个阶段:首先利用Java 开发工具将投票系统中的相关算法编译成Java Archive (JAR)格式的智能合约代码;随后,将JAR 包上传至区块链网络.在发起者和投票者的共同参与下,最终合约按照预定规则自动执行.

图5 智能合约部署流程Fig.5 Deployment process of smart contract

4 智能合约投票系统的设计与实现

本节将具体介绍智能合约投票系统以及实现过程,为了便于后续叙述,首先给出投票系统中涉及的部分符号及其相关说明,具体如表1 所示.

表1 符号说明表Table 1 Notation declaration

本节将基于区块链系统环境,根据投票系统所需的初始化、注册、投票以及计票四个部分,对智能合约投票系统的设计以及实现流程进行详细的阐述.

4.1 初始化阶段

初始化阶段由合约发起者执行,如图6 所示.首先需要完成系统参数生成,生成椭圆曲线乘法循环群G和整数群 Z,再根据群G产生生成元g∈G.群G和 Z的生成是基于JPBC 库实现的,其中JPBC中的椭圆曲线选取Type A 类型,如表2 中算法所示.

图6 智能合约投票系统初始化阶段Fig.6 Initialization of the smart-contract voting system

表2 initParam 算法Table 2 initParam algorithm

该算法以群G的阶数rbit和 Z的阶数qbit作为输入,通过TypeACurveGenerator()生成TypeA 生成器,利用TypeA 生成器得到双线性对参数,再通过getPairing()获取双线性对,最后由双线性对生成椭圆曲线乘法循环群和整数群,生成元g是在椭圆曲线群上随机生成的.

接下来,合约发起者需在合约中指定候选者名单,如表3 所示.该算法输入一个数组params,数组中的每个元素对应候选者wj的地址,该地址是候选者的唯一标识.假设有n个候选者,则算法newNum 返回一个整数z且满足 2z>n,第k位候选者的投票编号为 2k·z,例如,当投票者选择候选者1 时,对应的候选者的编号是 2z,算法返回候选者的候选列表candidateList,大小为n,候选列表中包括候选者的地址,编号以及所得的票数(初始化值为0),并且会在结果集resultMap 中存放所有候选者及对应的票数.

表3 candidateForm 算法Table 3 candidateForm algorithm

候选者名单指定完成后,合约发起者需将投票合约以JAR 包的形式部署到区块链上.图7 为智能合约发布的结果,其中“address”表示合约地址字段,“txid”表示合约交易id 字段.

图7 智能合约发布结果Fig.7 Results of smart contract release

图8 描述了初始化合约结果,合约部署完成且初始化后,可看到当前投票者和候选者的信息.字段“votersData”代表投票者数据,其中字段“voter-Txid”为投票者交易的id,从交易中可获取投票者名单的信息,在合约初始后,投票者名单为空.字段“candidateData”代表候选者信息,“candidateTxid”代表候选者交易id,查看交易id 可获取候选者名单信息.

图8 智能合约初始化结果Fig.8 Results of smart contract initialization

4.2 注册阶段

当投票合约在区块链上完成部署后,投票者vi若想获得投票资格,则需进行注册.如图9 所示,投票者需先进行注册并获取合约,投票者可从区块链上查询当前人员信息,包括获取到当前投票者和候选者名单.

图9 智能合约投票系统注册阶段Fig.9 Registration of the smart-contract voting system

投票者的注册过程如表4 中算法所示,算法输入为数组params,数组中存放着作为投票者的唯一标识地址,最后算法返回投票者列表voterList.注册完成之后,列表中将包含投票者地址以及投票者的投票状态(初始值为false),此时投票者可从区块链中查询候选人名单和当前投票者名单.

表4 voterRegist 算法Table 4 voterRegist algorithm

4.3 投票阶段

投票者从区块链上获取候选人信息后,开始进行投票.投票过程借助于区块链完成,如图10所示,在投票的前期,投票者vi生 成公私钥对<ski,pki>,公钥是椭圆曲线乘法循环群G中的元素,私钥是整数群Z 中的元素.在投票过程中,需对投票者的投票内容进行有效性验证,验证过程调用交互式零知识集合成员关系证明协议ZSMPP,协议经过两轮交互对投票内容有效性进行验证.在交互过程中,投票者相当于协议中的证明者,合约发起者相当于协议中的验证者.接下来对投票阶段的参数生成、承诺生成、两轮交互以及验证给出具体介绍.

图10 智能合约投票系统投票阶段Fig.10 Voting of the smart-contract voting system

令M={m1,m2,···,mn}投票内容(候选者)组成的集合,其中mi是候选者的编号,接下来投票者vi证 明自己的投票内容numi属于投票集合M.投票者首先利用自己的公私钥生成承诺,如表5 中算法所示,输入投票者的地址address 以及投票者的投票号num,其中地址作为投票者的身份标识,根据地址判断投票者是否在注册者名单内,若不在名单内,则算法终止;若在注册名单中,则可以开始投票.投票者生成自己的私钥 sk=(sk1,sk2)以及公钥 pk=(pk1,pk2),其中 pk1=gsk1,pk2=gsk2,根据投票者的投票号对应候选者编号,newNum 函数返回一个整数z且 满足 2z>n,例如,当投票者的投票号为2 时,对应的候选者的编号wid 为 22·z.最后,该算法生成承诺Commit=(x,y)=(pk1,pk2·gwid)并将其以交易的形式存放到区块链中.

表5 generateCommit 算法Table 5 generateCommit algorithm

合约发起者在查询区块链得到承诺后,开始执行ZSMPP 中的第一轮交互并生成对应挑战码其中 γj,µj∈Zp.如图11 所示,在智能合约输入中,generateChallenge1 为函数,输入参数为合约发起者的地址,在合约输出字段中,“userResult”表示第一轮挑战码,其中R={γ1,γ2,···γn-1},U={µ1,µ2,···µn-1}.挑战码生成后将发布到区块链中.

图11 第一轮挑战码对应的交易Fig.11 Transaction of the first challenge

如表6 中算法所示,算法generateChallenge2 计算集合A中 所有元素与x的和,利用哈希函数对和求哈希,最后返回第二轮的挑战码miuN,然后发布交易到区块链.投票者从区块链中获取第二轮的挑战码之后,利用自身私钥 sk=(sk1,sk2)计 算γn=sk1-sk2µn并 生成第二轮挑战码gamaN(γn).如图12所示,在合约输入中,generateResponse2 为函数,输入参数是投票者的地址,合约将输出第二轮的响应码gamaN.最后,合约发起者收到第二轮响应码之后,会验证等式

表6 generateChallenge2 算法Table 6 generateChallenge2 algorithm

图12 第二轮响应码对应的交易Fig.12 Transaction of the second response

对投票者投票内容的有效性进行验证.若验证失败,则终止投票;否则,投票者对投票内容进行加密并将投票状态改为true.

4.4 计票阶段

当选票有效性通过验证后,投票者将通过BGN 同态加密算法[26]对其进行加密处理.如图13所示,BGN(wj)表示第i位投票者对第j位候选者投票结果对应的密文.当所有投票者完成投票后,合约将执行计票程序.

图13 智能合约投票系统计票阶段Fig.13 Vote-counting of the smart-contract voting system

表7 中算法描述了投票者对投票内容加密以及合约计票过程.其中BGN 算法满足加法同态性,即BGN(w1)+BGN(w2)=BGN(w1+w2).合约统计所有候选者wj的 最终投票结果表示为result(wj)=BGN1(wj)+BGN2(wj)+···+BGNs(wj)并上传到区块链上.

表7 voteResult 算法Table 7 voteResult algorithm

5 投票协议安全特性与性能分析

5.1 安全特性分析

接下来将对本文提出的基于零知识证明的智能合约投票系统安全特性进行分析,具体如下:

(1)选票有效性.

指选票内容是候选者集合中的一员,通过执行零知识集合成员证明协议,判定选票内容有效性,若选票内容不属于候选者集合,则终止投票活动.

(2)选票隐私性.

主要考虑所选候选人的隐私.在有效性验证阶段,ZSMPP 协议的零知识性可以保证验证过程不泄露选票信息.此外,计票是对密文状态下的选票进行同态运算,选票的隐私性基于安全的BGN同态加密算法实现.

(3)唯一性.

每个注册投票者初始投票状态都是false,在完成投票之后该状态变成true,整个过程都以交易的形式被记录在区块链中,由区块链的不可篡改性保证了每个投票者只能参与一次投票.

(4)无监督性.

投票协议以智能合约的形式被部署到区块链平台并按照预定规则自动执行,由于区块链的不可篡改性和共识机制保证预定规则不变性和规则执行的正确性,从而确保投票合约中仅需发起者和投票者两个实体,无需可信监票人参与.

(5)自计票性.

协议计票过程由智能合约按照事先制定的规则自动化执行,当触发计票条件,即所有投票者完成投票后,合约自动执行voteResult 算法对密文状态的选票进行同态运算并将密态计票结果上传至区块链.

表8 展示了本文提出的投票协议与现有4 个投票方案之间关于安全特性的对比,从结果中不难发现,仅有文献[10]和本文提出的方案能够实现对投票内容的有效性验证,然而该文投票过程需要在可信监票人的参与下完成.文献[11]提出的投票方案虽然能够追踪到实施重复投票的攻击者,但牺牲了投票的唯一性特征.此外,本文计票过程由智能合约程序自动完成,而文献[10~12]则需要投票发起者或监票人参与才能实现.

表8 不同方案之间安全特性对比Table 8 Comparison of security features

5.2 性能分析

本节将通过仿真实验对提出的智能合约投票协议的性能进行分析,实验运行在2.6 GHz 英特尔CPU 和8 GB 内存的64 位Ubuntu 16.04 操作系统上.基于交互式零知识证明的的智能合约投票系统运算效率主要取决于投票阶段和计票阶段,本节将从以下两方面来对投票系统进行性能评估,一是针对不同的投票者数量,对投票系统的投票和计票阶段进行耗时对比;二是针对不同的候选人数量,对投票系统的投票和计票阶段进行耗时对比.

图14 展示的是当候选者数量为5 时,对不同数量投票者在投票阶段和计票阶段的耗时对比图,从图中可以发现,当投票者数量达到500 时,投票和计票过程均能在8000~9000 ms 之间完成.图15 展示的是当投票者数量为100 时,针对不同数量的候选者,投票阶段和计票阶段的耗时对比图,当候选者数目为20 时,投票和计票时间分别是7784 ms 和9218 ms.实验结果表明,随着投票者或候选者数量的增加,投票与计票阶段的耗时均呈线性增长,智能合约投票系统能够高效实施.

图14 不同数量投票者耗时对比Fig.14 Time cost of different numbers of voters

图15 不同数量候选者耗时对比Fig.15 Time cost of different numbers of candidates

6 结论

本文设计了基于交互式零知识证明的智能合约投票系统,实现投票过程的去中心化以及计票过程的自动化.基于离散对数困难假设,本文构造了一个新的交互式零知识集合成员关系证明协议,通过将该协议引入到投票合约的设计中,实现投票者在不透露投票内容的前提下向发起者证明投票内容的有效性.此外,通过将投票合约编译成JAR 包,实现智能合约投票系统在区块链中的部署和自动化执行,保证了投票数据的有效性和隐私性.实验结果表明,本文提出的智能合约投票系统在投票和计票阶段均可高效实施.

猜你喜欢

投票者计票选票
奥斯卡奖的偏好投票制
微信投票乱局与治道变革
英国人家有空房少拿养老金
中国戏剧家协会第七届理事会理事选举计票人名单
中国戏剧家协会第七届主席、副主席选举计票人名单
塔利班割鼻惩罚投票者
美国现在的选举投票方式比以往任何时候都脆弱