顏春輝,游 林
(杭州電子科技大學(xué) 通信工程學(xué)院,浙江 杭州 310018)
隨著互聯(lián)網(wǎng)、通信技術(shù)以及現(xiàn)代密碼學(xué)技術(shù)的發(fā)展,電子投票成為一種新的投票方式,逐漸得到了社會(huì)的關(guān)注。自從Chaum[1]在1981年提出第一個(gè)電子投票協(xié)議以來,許多密碼學(xué)研究者提出了不同密碼體制的電子投票方案,目的是在互聯(lián)網(wǎng)環(huán)境下實(shí)現(xiàn)安全、方便、高效的公平投票機(jī)制。這些成熟的解決方案也被應(yīng)用到了政府選舉、企業(yè)董事會(huì)投票以及重要決策投票中。
目前,電子投票方案主要有三類:基于盲簽名、環(huán)簽名的電子投票方案[2-3]、基于全同態(tài)加密的電子投票方案[4-5]和基于混合網(wǎng)絡(luò)的電子投票方案[6-7]。這三類投票方案都存在各自的不足?;诿ず灻?、環(huán)簽名的電子投票方案一般需要假設(shè)匿名信道和可信的簽名機(jī)構(gòu);基于混合網(wǎng)絡(luò)的電子投票方案從理論上可以實(shí)現(xiàn)解密計(jì)票的公開可驗(yàn)證性,但算法過于復(fù)雜,效率較低;基于同態(tài)加密的電子投票方案雖然可以實(shí)現(xiàn)密文計(jì)算保護(hù)選票的隱私性,但當(dāng)前全同態(tài)加密的計(jì)算復(fù)雜度太高,并不能有效實(shí)用。
近年來,隨著比特幣等數(shù)字貨幣的逐漸流行,其底層賬本技術(shù)——區(qū)塊鏈技術(shù)也受到許多研究學(xué)者的關(guān)注。區(qū)塊鏈的本質(zhì)是一個(gè)公開透明的數(shù)據(jù)庫(kù)賬本,記錄所有的交易記錄。它的特點(diǎn)是沒有第三方中介機(jī)構(gòu)的情況下,可以提供去中心化、不可篡改、公開透明的安全特性。目前,已提出不少結(jié)合區(qū)塊鏈技術(shù)的電子投票方案,如2015年Zhao和Chan等人[8]提出了一種結(jié)合比特幣的電子投票協(xié)議,該協(xié)議對(duì)選民的投票行為引入了獎(jiǎng)罰制度。盡管該協(xié)議有一些限制,但這是第一個(gè)嘗試將電子投票與區(qū)塊鏈相結(jié)合的方法。2016年,Lee、James、Ejeta和Kim等人[9]提出了另一種電子投票協(xié)議。該協(xié)議提出在區(qū)塊鏈電子投票協(xié)議中利用TTP(可信第三方)來保護(hù)投票者的選票。2017年,Cruz等人[10]提出了一種利用盲簽名技術(shù)結(jié)合區(qū)塊鏈的電子投票方案。該方案是將盲化的選票內(nèi)容寫入比特幣交易中附加了80 Byte信息中。另外,該方案還引入第三方計(jì)票機(jī)構(gòu)來統(tǒng)計(jì)選票結(jié)果。
上述的方案都存在TTP來執(zhí)行投票過程中計(jì)票與監(jiān)督的職責(zé),要求投票參與者都信任這個(gè)TTP。但是,無法排除第三方計(jì)票機(jī)構(gòu)與管理者發(fā)生共謀攻擊,導(dǎo)致投票過程中投票者的選票和投票結(jié)果發(fā)生篡改,還有計(jì)票機(jī)構(gòu)提前泄露投票結(jié)果控制整個(gè)投票結(jié)果發(fā)生改變。另外,在比特幣交易中附加信息空間的限制,也使該方案具有一定的缺陷性。
McCorry等人[11]使用區(qū)塊鏈實(shí)現(xiàn)了一種分布式且具有自我計(jì)票功能的互聯(lián)網(wǎng)電子投票方案,并最大化地保護(hù)選民的隱私。通過以太坊智能合約編寫投票協(xié)議,有效取代了第三方計(jì)票機(jī)構(gòu),在投票過程中通過兩輪零知識(shí)證明(ZKP)的方式保護(hù)投票者的選票隱私信息。但是,該投票方案只允許投票者選擇兩個(gè)候選者(yes/no),無法滿足一次投票過程中出現(xiàn)多候選者的情況。
除了這些基于區(qū)塊鏈電子投票協(xié)議外,目前也有不少在區(qū)塊鏈上的電子投票應(yīng)用被推廣使用,如區(qū)塊鏈投票機(jī)(Blockchain Voting Machine)[12]和Follow My Vote[13]。這些應(yīng)用基本都是使用區(qū)塊鏈作為一個(gè)投票箱,因此需要依賴第三方組織來保護(hù)投票者的隱私。
本文針對(duì)目前投票系統(tǒng)中的一些缺陷,提出了一種結(jié)合區(qū)塊鏈的多候選者投票方案,通過智能合約實(shí)現(xiàn)本方案使其具有自我計(jì)票功能。其次,通過Node.js的Electron前端框架設(shè)計(jì)了本方案的投票系統(tǒng)web界面,使用web3.js提供JavaScript API來調(diào)用部署在智能合約中投票方案的方法實(shí)現(xiàn)與合約交互。最后,從本方案的安全性分析和實(shí)驗(yàn)結(jié)果分析中說明本方案結(jié)合區(qū)塊鏈智能合約具有可行性,具有多候選者投票、保護(hù)投票者的隱私、具備自我計(jì)票的功能等特點(diǎn)。
區(qū)塊鏈?zhǔn)请S著比特幣等[14]數(shù)字加密貨幣而興起的一種全新技術(shù),本質(zhì)是一個(gè)點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)(peerto-peer)的分布式賬本數(shù)據(jù)庫(kù),通過建立一個(gè)共同維護(hù)且不可篡改的數(shù)據(jù)庫(kù)來記錄過去的所有交易幾輪和歷史數(shù)據(jù)。所有的數(shù)據(jù)都是分布式存儲(chǔ)且公開透明的。這種技術(shù)下,任何互不相識(shí)的網(wǎng)絡(luò)用戶都可以通過合約、點(diǎn)對(duì)點(diǎn)記賬、數(shù)字加密等方式達(dá)成信用共識(shí),而不需要任何中央信任機(jī)構(gòu)。
區(qū)塊鏈分為公共鏈(Public Blockchain)、聯(lián)盟鏈(Consortium Blockchain)和私有鏈(Private Blockchain)。而隨著區(qū)塊鏈技術(shù)的演進(jìn),依據(jù)不同架構(gòu),區(qū)塊鏈可分為三個(gè)階段:
(1)區(qū)塊鏈1.0架構(gòu):比特幣區(qū)塊鏈;
(2)區(qū)塊鏈2.0架構(gòu):以太坊區(qū)塊鏈;
(3)區(qū)塊鏈3.0架構(gòu):超越貨幣、金融范圍的區(qū)塊鏈應(yīng)用。
區(qū)塊鏈1.0的典型應(yīng)用是比特幣應(yīng)用,也是現(xiàn)在最受歡迎的數(shù)字貨幣,設(shè)計(jì)目的是允許兩個(gè)區(qū)塊鏈地址賬戶進(jìn)行點(diǎn)對(duì)點(diǎn)的交易,而不通過第三方可信機(jī)構(gòu)。2013年,比特幣的協(xié)議中引進(jìn)了一項(xiàng)功能,即創(chuàng)建一種名為OP_RETURN的交易[15],允許用戶在一筆交易中嵌入40 Byte的數(shù)據(jù)(目前是80 Byte),因此可以向比特幣的區(qū)塊鏈中寫入任意信息。不少研究人員利用此特點(diǎn)相繼提出了不少結(jié)合區(qū)塊鏈的應(yīng)用[16-17]。這些方案有很多弊端,一方面在一筆交易中寫入的信息量有限,另一方面隨著比特幣的交易數(shù)量增大,區(qū)塊鏈的數(shù)據(jù)也會(huì)變得越來越龐大,交易確認(rèn)時(shí)間也會(huì)變得越來越慢。
比特幣的區(qū)塊鏈架構(gòu)主要圍繞支持虛擬貨幣的實(shí)現(xiàn),雖然具有一定的靈活性,但用來支持虛擬貨幣意外的應(yīng)用存在局限性。區(qū)塊鏈2.0架構(gòu)的以太坊則提供了一套新的協(xié)議,核心是采用圖靈完備的計(jì)算環(huán)境——以太坊虛擬機(jī)(EVM),可以實(shí)行任意復(fù)雜算法的編程,把區(qū)塊鏈作為一個(gè)可編程的去中心化應(yīng)用平臺(tái)支撐智能合約應(yīng)用。另外,以太坊區(qū)塊鏈上寫入的數(shù)據(jù)沒有限制且交易確認(rèn)相對(duì)較快。
以太坊有兩種類型的賬戶:
(1)外部所有賬戶(EOA),一般意義上的用戶賬戶,由用戶的私鑰控制;
(2)合約(Contract)賬戶,一種特殊的可編程賬戶。合約是代碼(功能)和數(shù)據(jù)(狀態(tài))的集合,受代碼控制,并由外部賬戶激活。
智能合約(Smart Contract)是一個(gè)由計(jì)算機(jī)處理的、可執(zhí)行合約條款的交易協(xié)議[18]。以太坊的智能合約是一段可被以太坊虛擬機(jī)執(zhí)行的代碼。以以太坊特有二進(jìn)制形式存儲(chǔ)在區(qū)塊鏈上,并由以太坊虛擬機(jī)解釋,被稱為以太坊虛擬機(jī)碼(Bytecode)。智能合約像一個(gè)可以被信任的人,可以臨時(shí)保管資產(chǎn),總是按照事先的規(guī)則執(zhí)行操作。它對(duì)接收的信息進(jìn)行回應(yīng),可以接收和存儲(chǔ)價(jià)值,也可以向外發(fā)送信息價(jià)值。目前,主要使用一種類似JavaScript語(yǔ)言的Solidity語(yǔ)言進(jìn)行智能合約開發(fā)。智能合約部署和調(diào)用流程如圖1所示。
圖1 以太坊智能合約的部署和調(diào)用流程
文獻(xiàn)[11]提出,只允許投票者選擇兩個(gè)候選者,即“yes/no”。本文針對(duì)多候選者投票場(chǎng)景,提出一種應(yīng)用于小規(guī)模的董事會(huì)投票場(chǎng)景的“1-outof-m”(即投票人可以從m位候選項(xiàng)中選擇1個(gè))類型的投票方案。第一輪中,所有選民向管理者注冊(cè)后擁有投票資格,投票前還需要進(jìn)行身份驗(yàn)證;第二輪中,合格的投票者選擇投票意向后向系統(tǒng)廣播自己的選票內(nèi)容。使用區(qū)塊鏈作為一個(gè)投票者認(rèn)證的安全信道,通過運(yùn)行在區(qū)塊鏈上的智能合約實(shí)現(xiàn)整個(gè)投票流程和自我計(jì)票功能,通過多方共識(shí)后將投票數(shù)據(jù)寫入?yún)^(qū)塊鏈,可以讓任何人都能驗(yàn)證投票的數(shù)據(jù)及結(jié)果。對(duì)于投票者隱私保護(hù),在方案中采用了兩輪零知識(shí)證明向系統(tǒng)證明自己的秘密信息和投票意向但不泄露任何信息。
本投票方案的參與者主要包括n位合格投票者(V1,V2,…,Vn)和一個(gè)投票管理機(jī)構(gòu),對(duì)多位候選者(C1,C2,…,Ck)進(jìn)行多選一形式表決投票,其中兩輪零知識(shí)證明協(xié)議詳細(xì)步驟如下。
2.1.1 第一輪零知識(shí)證明協(xié)議
(1)所有投票者一致同意選取滿足安全要求的大素?cái)?shù)p,Z*p為p階有限乘法循環(huán)群,g為Z*p的生成元。每位投票者Vi選擇一個(gè)隨機(jī)數(shù)xi∈Zp作為他們的私鑰,然后在本地計(jì)算得到gxi作為公鑰并公開。
(2)每位投票者Vi廣播他們的gxi,然后向系統(tǒng)的智能合約進(jìn)行離散對(duì)數(shù)知識(shí)證明協(xié)議DKPP(xi)用于驗(yàn)證投票者的私鑰有效性,即gxi的指數(shù)xi是否正確。投票者Vi發(fā)送(gv,r=v-xic),其中v∈RZp,c=H(g||gv||gxi||Ai)。智能合約驗(yàn)證 gv與 grgc·xi是否相等,如果相等則證明投票者知道g的指數(shù)xi正確合法性,從而相信投票者的身份。然后,投票者Vi從系統(tǒng)中得到重構(gòu)的投票公鑰:
2.1.2 第二輪零知識(shí)證明協(xié)議
(1)假定n位投票者,系統(tǒng)選取一個(gè)最小的正整數(shù)m,滿足2m>n。然后,對(duì)k位候選項(xiàng)分別進(jìn)行編碼表示。投票者選擇其中一個(gè)選項(xiàng)vi∈{20,2m2(k-1)m}進(jìn)行投票表決,具體如下:
(2)投票者在本地表決完后發(fā)送自己的選票內(nèi)容vi,并向智能合約進(jìn)行一輪選票的合法性知識(shí)證明協(xié)議VKPP(vi)來證明自己選票的合法性。
關(guān)于加密選票的合法性知識(shí)證明協(xié)議具體執(zhí)行過程如表1所示。實(shí)際執(zhí)行過程中,先將選票內(nèi)容vi轉(zhuǎn)換成EIGamal密碼體制的形式,即(x,y)=(gxi,(gyi)xi·gvi)=(gxi,hxi·ei), 其 中 ei∈ {g20,g2m,…,g2(k-1)m}。 例如:當(dāng)選票內(nèi)容為vi=20時(shí),代表投票者選擇第一個(gè)候選者,投票者的選票的EIGamal加密形式表示為(x,y)=(gxi,(gyi)xi·g20)。投票者在根據(jù)VKPP協(xié)議計(jì)算得到如下參數(shù):(ai,bi)、c=H(Ai,g,x,y,ai,bi)、di和ri。其中,H為安全的哈希函數(shù),Ai為投票者的賬號(hào)索引值。之后,將(x,y,ai,bi,di,ri)作為驗(yàn)證條件發(fā)送到智能合約上進(jìn)行驗(yàn)證,而智能合約驗(yàn)證H(Ai,g,x,y,ai,bi)=d1+d2+,…,dn是否成立來判斷投票者選票內(nèi)容的合法性,從而決定是否接受投票者的選票內(nèi)容。此協(xié)議是為了表明投票者發(fā)送的加密選票gxiyigvi是對(duì)候選人列表{20,2m,…,2(k-1)m}其中之一的選擇進(jìn)行加密而不泄露具體的信息,也是實(shí)現(xiàn)“1-out-of-m”類型投票的關(guān)鍵所在。另一個(gè)目的,是防止破壞者進(jìn)行重復(fù)投票的行為。此外,利用EIGamal加密體制的同態(tài)屬性,配合智能合約的自動(dòng)執(zhí)行操作可以依據(jù)設(shè)計(jì)好的規(guī)則實(shí)現(xiàn)自我計(jì)票,有效取代第三方計(jì)票機(jī)構(gòu),使投票系統(tǒng)更具安全性。
(3)智能合約自動(dòng)判斷投票者加密選票的合法性知識(shí)證明協(xié)議過程,驗(yàn)證判斷每一位投票者的選票內(nèi)容是否正確、合法。如果正確,則接受投票者提交的選票內(nèi)容;否則,放棄。當(dāng)最后一位投票者提交選票后,計(jì)算所有選票的統(tǒng)計(jì)結(jié)果:
這里g∑ivi為離散對(duì)數(shù)。式(4)的值可以通過小步大步算法(Baby-step Giant-step)和指數(shù)積分法(Index Calculus)得到,表示為投票統(tǒng)計(jì)的結(jié)果,其中系數(shù)(c1,c2,…,ck)分別是k位候選者相對(duì)應(yīng)票數(shù)。
對(duì)于 ∑ixiyi=0具體證明過程如下。
由上述重構(gòu)密鑰:
可得:
最終,可得:
本文設(shè)計(jì)的投票方案采用EIGamal加密體制和兩輪零知識(shí)證明協(xié)議,并運(yùn)行在以太坊區(qū)塊鏈上,通過以太坊智能合約取代傳統(tǒng)可信第三方計(jì)票機(jī)構(gòu)(TTP)實(shí)現(xiàn)自我計(jì)票功能。通過區(qū)塊鏈的共識(shí)機(jī)制將投票過程的數(shù)據(jù)寫入?yún)^(qū)塊鏈賬本中,能夠滿足用戶的信任需求。通過EIGamal密碼體制保護(hù)投票數(shù)據(jù)的隱私,經(jīng)過兩輪零知識(shí)證明協(xié)議一方面可以有效防止惡意攻擊者的仿造冒充有效投票者進(jìn)行假投票,另一方面投票者向系統(tǒng)驗(yàn)證自己的有效加密選票的正確性而不泄露具體內(nèi)容,保護(hù)了投票者的隱私。本投票方案總共分為5個(gè)過程,由投票發(fā)起者、智能合約和投票者三部分組成。圖2展示了整個(gè)投票方案的流程。
圖2 投票方案的流程時(shí)序
表1 選票內(nèi)容的合法性知識(shí)證明協(xié)議流程
具體的實(shí)施過程如下。
(1)登錄賬戶
步驟1:投票發(fā)起者和每位投票者登錄投票系統(tǒng)的賬號(hào)都是自己的以太坊賬號(hào)和密碼;
步驟2:要保證每一個(gè)投票者賬戶里至少有少部分代幣用于投票時(shí)所需的花費(fèi),如果投票者賬戶余額不足,可以向系統(tǒng)索要。
(2)系統(tǒng)設(shè)置
步驟1:投票發(fā)起者設(shè)置投票項(xiàng)目的名稱、問題的數(shù)量及內(nèi)容;
步驟2:投票發(fā)起者設(shè)置計(jì)時(shí)器,設(shè)置投票各個(gè)環(huán)節(jié)的起止時(shí)間,確保投票能順利進(jìn)行,具體時(shí)間參數(shù)如下:
TfinishRegistration:表示所有投票者一定要在這個(gè)時(shí)間點(diǎn)前完成注冊(cè);
TbeginVote:表示投票發(fā)起者通知系統(tǒng)在這個(gè)時(shí)間開始進(jìn)行投票;
TfinishVote:表示所有投票者一定要在這個(gè)時(shí)間前投出他們的選票內(nèi)容;
Tπ:最小的時(shí)間間隔,投票期間讓投票者有足夠時(shí)間進(jìn)行投票,保證合約正常運(yùn)行并寫入?yún)^(qū)塊鏈。
步驟3:投票發(fā)起者設(shè)置完上述參數(shù)后,通知系統(tǒng)開始進(jìn)入注冊(cè)階段,并更新智能合約。
(3)注冊(cè)
步驟1:投票發(fā)起者為每一位登記的投票者生成唯一的注冊(cè)ID并發(fā)送給投票者;
步驟2:投票者向投票發(fā)起者發(fā)送注冊(cè)ID來發(fā)起注冊(cè)請(qǐng)求,投票發(fā)起者通過智能合約驗(yàn)證投票者的注冊(cè)ID是否匹配,通過認(rèn)證的合格投票者名單被寫入投票合約中;
步驟3:如果匹配通過,投票者需要生成隨機(jī)數(shù)xi作為私鑰,然后計(jì)算他們的投票公鑰gxi,通過智能合約進(jìn)行DKPP(xi)(離散對(duì)數(shù)知識(shí)證明協(xié)議)來驗(yàn)證投票者私鑰xi的有效性;
步驟4:投票者從系統(tǒng)中得到計(jì)算后的重構(gòu)密鑰gyi。
投票發(fā)起者認(rèn)證每一個(gè)投票者的賬號(hào),只有通過認(rèn)證的合格投票者名單寫入投票合約中。注冊(cè)階段,應(yīng)該在規(guī)定的注冊(cè)時(shí)間TfinishRegistration內(nèi)完成,否則系統(tǒng)不接受任何人的注冊(cè)。同時(shí),投票發(fā)起者確認(rèn)后通知智能合約進(jìn)入投票階段。
(4)投票
投票階段,投票者在投票界面中選擇自己選項(xiàng),然后生成自己的正式選票,通過系統(tǒng)的智能合約的投票方法發(fā)送他們的加密后選票內(nèi)容,具體步驟如下:
步驟1:投票者將投票內(nèi)容轉(zhuǎn)化為加密后的形式gxiyigvi;
步驟2:投票者需執(zhí)行VKPP(vi)(選票內(nèi)容合法性知識(shí)證明協(xié)議)向系統(tǒng)的智能合約證明自己的投票內(nèi)容合法,即vi∈{20,2m,…,2(k-1)m},且選票內(nèi)容的加密形式是正確的;
步驟3:如果有人選擇投棄權(quán)票,系統(tǒng)也會(huì)將此票作為棄權(quán)選票并統(tǒng)計(jì)到最終投票結(jié)果中。
投票工作必須在系統(tǒng)規(guī)定的投票時(shí)間TfinishVote內(nèi)完成,當(dāng)最后一個(gè)投票者提交選票后,投票發(fā)起者通知智能合約進(jìn)入計(jì)票階段。
(5)計(jì)票
系統(tǒng)調(diào)用智能合約中寫好的統(tǒng)計(jì)投票結(jié)果的方法,無需任何第三方計(jì)票機(jī)構(gòu)對(duì)選票進(jìn)行統(tǒng)計(jì)。智能合約會(huì)驗(yàn)證每一張選票的有效性,然后統(tǒng)計(jì)所有選票包括棄權(quán)票生成最終的投票結(jié)果,寫入?yún)^(qū)塊鏈賬本并在投票系統(tǒng)上公布。
步驟1:系統(tǒng)調(diào)用智能合約中計(jì)票的方法,統(tǒng)計(jì)所有有效的選票內(nèi)容,即執(zhí)行:
步驟2:要得到投票的最終結(jié)果就是計(jì)算得到統(tǒng)計(jì)結(jié)果的離散對(duì)數(shù)的值:
這里(c1,c2,…ck)分別代表相對(duì)應(yīng)候選者的投票數(shù)量。另外,對(duì)棄權(quán)票進(jìn)行單獨(dú)統(tǒng)計(jì)并計(jì)入投票結(jié)果中。
步驟3:系統(tǒng)公布每一個(gè)候選者對(duì)應(yīng)的統(tǒng)計(jì)結(jié)果和棄權(quán)票的結(jié)果,任何人都可以驗(yàn)證投票結(jié)果的正確性。
投票流程結(jié)束。
本文提出的投票方案實(shí)現(xiàn)方法基于以太坊智能合約,通過Web3.js庫(kù)的JavaScript API接口調(diào)用部署在區(qū)塊鏈上智能合約的相應(yīng)方法,實(shí)現(xiàn)了整個(gè)投票過程。對(duì)于智能合約開發(fā),使用目前應(yīng)用最廣泛的編程語(yǔ)言——Solidity語(yǔ)言。Solidity是一種語(yǔ)法與JavaScript相似的高級(jí)語(yǔ)言,為以太坊虛擬機(jī)編譯代碼而設(shè)計(jì)。另外,設(shè)計(jì)了基于Nodejs的Electron前端框架開發(fā)了投票系統(tǒng)的DApp,用于展示整個(gè)投票系統(tǒng)的交互過程。圖3為投票系統(tǒng)架構(gòu)圖。
圖3 投票系統(tǒng)架構(gòu)
將整個(gè)投票方案設(shè)計(jì)成三個(gè)智能合約,分別為 LocalCrypt.sol、Vote.sol和 VoteContractRegistery.sol。這三個(gè)合約的功能介紹如表2所示。
表2 智能合約功能介紹
基于區(qū)塊鏈的多候選人投票系統(tǒng)DApp整體實(shí)現(xiàn)是通過web前端頁(yè)面使用Web3.js庫(kù)提供的JavaScript API接口調(diào)用部署在區(qū)塊鏈上智能合約的相應(yīng)方法,實(shí)現(xiàn)了投票交互的整個(gè)過程。該設(shè)計(jì)開發(fā)實(shí)現(xiàn)了管理員和投票者兩個(gè)客戶端,圖4展示了投票系統(tǒng)DApp的界面功能和投票過程。
投票發(fā)起者客戶端(admin.html):管理員管理、控制、監(jiān)督整個(gè)投票過程,包括部署投票項(xiàng)目智能合約、認(rèn)證投票者、建立合格投票者列表、發(fā)起投票問題、設(shè)置注冊(cè)環(huán)節(jié)的起止時(shí)間、設(shè)置投票環(huán)節(jié)的起止時(shí)間、啟動(dòng)計(jì)票環(huán)節(jié)和強(qiáng)制關(guān)閉投票項(xiàng)目等功能。
投票者客戶端(voter.html):選民登錄注冊(cè)成為合格投票者進(jìn)行投票,包括登錄注冊(cè)、參與投票、提交選票和查詢投票結(jié)果等功能。
圖4 投票系統(tǒng)界面
本文實(shí)驗(yàn)平臺(tái)使用Intel Core i5-3470 3.2GHz的CPU,8 GB內(nèi)存,運(yùn)行64位Windows10操作系統(tǒng);采用以太坊作為區(qū)塊鏈的框架,通過創(chuàng)世區(qū)塊文件在本地搭建以太坊私鏈環(huán)境,以太坊geth客戶端為1.7.2版本,以太坊錢包為win64-0.8.10版本。將以太坊錢包連接到本地私有鏈網(wǎng)絡(luò)后,通過錢包將投票方案的智能合約部署在本地私鏈上,獲取LocalCrypto.sol和Vote.sol的合約地址address和二進(jìn)制文件ABI,把它們發(fā)送到主合約VoteContractRegistry.sol上,實(shí)現(xiàn)調(diào)用這兩份合約的方法。另外,通過Web3.js庫(kù)提供的JavaScript API接口與合約互動(dòng),設(shè)計(jì)了前端頁(yè)面,實(shí)現(xiàn)整個(gè)投票的交互過程。
表3為一次投票過程中統(tǒng)計(jì)每項(xiàng)操作所需消耗的Gas和消耗的Gas總量。此次投票過程中包含40位投票者進(jìn)行模擬投票,投票過程中產(chǎn)生的費(fèi)用是由GasUsed(消耗量)和GasPrice(價(jià)格)兩個(gè)因素決定,即Cost=GasPrice*GasUsed。其中GasUsed由交易(或執(zhí)行合約代碼)的計(jì)算量來決定,而GasPrice由交易的發(fā)起者來設(shè)置。
將投票方案的智能合約分成三份,一方面是為了區(qū)分彼此之間功能關(guān)系,如LocalCrypto. Sol主要涉及基本的加密解密方法和零知識(shí)證明協(xié)議的運(yùn)行,這樣模塊化設(shè)計(jì)可以提高代碼的重復(fù)使用。另一方面,考慮到以太坊上部署智能合約受GasLimit限制,無法將整個(gè)投票方案的合約代碼通過一份合約上執(zhí)行。采取的方案是通過主合約VoteContractRegistery.sol調(diào)用另外兩個(gè)合約中的方法。通過表3中統(tǒng)計(jì)的Gas消耗顯示,部署這三個(gè)智能合約都是在以太坊公鏈中單筆交易Gas最大限制值(8 000 000 Gas)之內(nèi),證明投票方案可以在本地私鏈中運(yùn)行,同樣可以讓其在公鏈中正常運(yùn)行。
表3 投票中每項(xiàng)操作所需Gas消耗統(tǒng)計(jì)表
表4列出了投票方案中一些方法計(jì)算所需的平均時(shí)間。投票協(xié)議合約Vote.sol主要包括注冊(cè)投票、計(jì)算重構(gòu)公鑰、提交選票和計(jì)票這幾個(gè)主要步驟。使用Web3框架提供的接口方法讓W(xué)eb瀏覽器和以太坊守護(hù)進(jìn)程之間進(jìn)行通信,所有智能合約中可執(zhí)行的方法都可用.Call()來調(diào)用執(zhí)行而不會(huì)產(chǎn)生Gas消耗,可以在本地的守護(hù)進(jìn)程中測(cè)量代碼執(zhí)行時(shí)所需的計(jì)算時(shí)間。其中,加密合約LocalCrypto.Sol主要包括創(chuàng)建和認(rèn)證零知識(shí)證明的兩個(gè)步驟。在投票注冊(cè)過程中,創(chuàng)建零知識(shí)協(xié)議所耗時(shí)為81 ms,驗(yàn)證零知識(shí)協(xié)議所耗時(shí)為180 ms;投票過程中,提交選票時(shí)創(chuàng)建選票合法性知識(shí)證明協(xié)議所耗時(shí)為356 ms,驗(yàn)證選票合法性知識(shí)證明協(xié)議耗時(shí)為548 ms。
表4 投票方案不同方法執(zhí)行消耗平均時(shí)間
整個(gè)投票方案的執(zhí)行流程都是按照智能合約的執(zhí)行順序進(jìn)行。實(shí)驗(yàn)結(jié)果表明,整個(gè)投票方案最耗時(shí)的地方是零知識(shí)證明協(xié)議和統(tǒng)計(jì)投票結(jié)果,涉及驗(yàn)證選票的合法性知識(shí)證明協(xié)議和離散對(duì)數(shù)知識(shí)證明協(xié)議兩個(gè)步驟。此外,還有計(jì)算投票結(jié)果的離散對(duì)數(shù)運(yùn)算,主要是因?yàn)槟壳耙蕴恢悄芎霞s缺乏公鑰加密體制的原生支持。
本文改進(jìn)的具有自我計(jì)票的多候選投票方案是通過區(qū)塊鏈上的智能合約實(shí)現(xiàn)的,投票者使用以太坊賬號(hào)進(jìn)行認(rèn)證,在投票過程將自己加密后的選票提交到區(qū)塊鏈上,投票系統(tǒng)調(diào)用智能合約計(jì)票方法實(shí)現(xiàn)自動(dòng)計(jì)票并計(jì)算出投票結(jié)果,可以做到無需第三方計(jì)票機(jī)構(gòu)。本方案的投票系統(tǒng)基于區(qū)塊鏈的安全性,可以實(shí)現(xiàn)投票過程的公開可驗(yàn)證、數(shù)據(jù)防篡改特點(diǎn)。下面對(duì)投票系統(tǒng)進(jìn)行以下幾個(gè)方面的安全性分析。
4.2.1 選票完全保密性
本文設(shè)計(jì)的投票系統(tǒng)中,每一位投票者投出的選票內(nèi)容gxiyigvi都是經(jīng)過加密的,且投票者向系統(tǒng)發(fā)送兩輪零知識(shí)證明協(xié)議驗(yàn)證選票內(nèi)容的正確性。第一輪中,投票者發(fā)送自己的投票密鑰gxi;第二輪中,投票者發(fā)送自己的選擇內(nèi)容vi。投票者的密鑰xi是一個(gè)隨機(jī)數(shù),而yi也是一個(gè)隨機(jī)值,所以對(duì)于攻擊者來說無法確定。根據(jù)Diffie-Hellman假設(shè),任何人無法區(qū)分gxiyi在群中所對(duì)應(yīng)的階數(shù),其中間環(huán)節(jié)投票者沒有透露一點(diǎn)關(guān)于自己投票的詳細(xì)信息,所以任何人無法區(qū)分加密選票gxiyigvi所選擇的投票內(nèi)容vi,最大化保護(hù)選票的保密性。
智能合約的本質(zhì)是運(yùn)行在區(qū)塊鏈上的具有特定業(yè)務(wù)邏輯的一段代碼。智能合約的狀態(tài)和內(nèi)容是公開的,鏈上的用戶可以對(duì)代碼進(jìn)行審查,從而判斷合約的功能。智能合約的運(yùn)行結(jié)果會(huì)寫入賬本并公開可驗(yàn)證,不會(huì)發(fā)生合約創(chuàng)建者規(guī)定之外的行為。區(qū)塊鏈本身具有匿名性,即使攻擊者獲取投票者的數(shù)據(jù),也無法確定投票者的身份和投票信息。
4.2.2 公平性
統(tǒng)計(jì)選票階段,只有在規(guī)定投票時(shí)間內(nèi),當(dāng)最后一位投票者廣播了自己的投票結(jié)果vi后,系統(tǒng)的智能合約才能被管理者執(zhí)行統(tǒng)計(jì)投票結(jié)果的方法并得到計(jì)票結(jié)果。所以,只要存在未在正確時(shí)間內(nèi)廣播選票的投票者,投票結(jié)果將無法被預(yù)先計(jì)算。因此,該方案具有公平性。
4.2.3 無爭(zhēng)議性
本文方案中以區(qū)塊鏈作為身份認(rèn)證的通道,對(duì)于投票者的以太坊賬號(hào)進(jìn)行有效性驗(yàn)證,任何無效的賬號(hào)都不能在投票系統(tǒng)中進(jìn)行投票。此外,限定一人投一票,每一張選票選擇一個(gè)候選者,保證了投票結(jié)果的準(zhǔn)確性,投票方案是無爭(zhēng)議的。
4.2.4 可驗(yàn)證性
投票者在提交選票后在系統(tǒng)統(tǒng)計(jì)投票結(jié)果前,可以在自己的客戶端查詢確認(rèn)選票是否被篡改?;趨^(qū)塊鏈上的數(shù)據(jù)具有公開性可驗(yàn)證。在統(tǒng)計(jì)結(jié)果出來后,每一位投票者也獲取到所有投票者的選票gxiyigvi去驗(yàn)證計(jì)算的值與系統(tǒng)給出的結(jié)果是否一致。本方案具有投票結(jié)果的可驗(yàn)證性。
4.2.5 合格性
方案中,投票者都在管理員那里進(jìn)行登記注冊(cè)。管理員會(huì)在投票智能合約中建立一份有效的投票者名單,確保登錄到投票系統(tǒng)中的投票者都是合法的。之后在投票過程中,投票者還需要驗(yàn)證由管理者發(fā)送的唯一驗(yàn)證碼進(jìn)行雙重驗(yàn)證,確保每一位投票者都是合格的,每一張選票都是合格有效的。
4.2.6 抗重播攻擊
所有的投票密鑰gxi和零知識(shí)證明DKPP(xi)被公開發(fā)送到以太坊區(qū)塊鏈。因此,另外的合格投票者可能會(huì)嘗試使用另一組gxi和DKPP(xi)來獲得再一次的投票權(quán)。而在零知識(shí)證明過程中,要求投票者在哈希函數(shù)中包含msg.sender(即投票者的以太坊賬號(hào))。如果msg.sender與調(diào)用合約的賬戶不匹配,智能合約將不接受DKPP(xi)的驗(yàn)證。因此,在沒有共謀的情況下,攻擊者想重播攻擊另一位投票者的投票密鑰gxi來獲得另一次投票是不可能的。同樣,在對(duì)選票的零知識(shí)證明VKPP(vi)驗(yàn)證過程也是不能通過。
本文介紹了一種基于以太坊區(qū)塊鏈的多候選人的電子投票方案,用特定業(yè)務(wù)邏輯的智能合約實(shí)現(xiàn)自我計(jì)票功能而取代了傳統(tǒng)的第三方計(jì)票機(jī)構(gòu)。同時(shí),在投票方案的智能合約引入了兩輪零知識(shí)證明,有效保護(hù)了投票者的隱私問題。從對(duì)投票方案的安全性分析中證明,投票方案是安全可靠的。另外,在本地的私有鏈節(jié)點(diǎn)上部署智能合約,模擬了40位投票者進(jìn)行投票。從實(shí)驗(yàn)的數(shù)據(jù)中可知,投票系統(tǒng)在保護(hù)投票者隱私的前提下能做到公開可驗(yàn)證,可適用于小規(guī)模的董事會(huì)投票場(chǎng)景。