郄九玲,胡 浩
(南京郵電大學(xué),江蘇 南京 210003)
沒有調(diào)查就沒有發(fā)言權(quán)。投票調(diào)查在生活中扮演著重要角色。但是,現(xiàn)有的線上投票系統(tǒng)依然存在一些不容忽視的問題。比如,系統(tǒng)管理者可能會(huì)為了利益而惡意修改數(shù)據(jù);系統(tǒng)可能遭受黑客的攻擊。現(xiàn)有線上投票系統(tǒng)的公正性和安全性,完全依賴網(wǎng)站本身的安全和信譽(yù)度。而區(qū)塊鏈具有去中心化、數(shù)據(jù)不可篡改、安全可信的特點(diǎn),數(shù)據(jù)一旦存入?yún)^(qū)塊鏈,就無法篡改。區(qū)塊鏈?zhǔn)遣豢纱鄹?、真?shí)可信的數(shù)據(jù)庫,因此區(qū)塊鏈技術(shù)是保證投票系統(tǒng)公正性和安全性的最佳方案。
狹義來講,區(qū)塊鏈[1]是一種按照時(shí)間順序?qū)?shù)據(jù)區(qū)塊以鏈?zhǔn)浇Y(jié)構(gòu)組合成特定數(shù)據(jù)結(jié)構(gòu),并以密碼學(xué)方式保證不可篡改和不可偽造的去中心化共享賬本,能夠安全存儲(chǔ)有先后關(guān)系的、能在系統(tǒng)內(nèi)驗(yàn)證的數(shù)據(jù)。
廣義上的區(qū)塊鏈[2]是利用加密鏈?zhǔn)絽^(qū)塊結(jié)構(gòu)來驗(yàn)證與存儲(chǔ)數(shù)據(jù)、利用分布式節(jié)點(diǎn)共識(shí)算法來生成和更新數(shù)據(jù)、利用自動(dòng)化腳本代碼(智能合約)來編程和操作數(shù)據(jù)的,一種全新的去中心化基礎(chǔ)架構(gòu)與分布式計(jì)算范式。
區(qū)塊鏈?zhǔn)遣豢纱鄹暮筒豢蓚卧斓娜ブ行幕蚕碣~本,具有去中心化、去信任化、安全可信等特點(diǎn)[3]。
(1)去中心化。區(qū)塊鏈網(wǎng)絡(luò)中的所有節(jié)點(diǎn)共同提供服務(wù),參與網(wǎng)絡(luò)中數(shù)據(jù)的驗(yàn)證、記賬、存儲(chǔ)、維護(hù)和傳輸?shù)冗^程。網(wǎng)絡(luò)中不存在擁有特殊權(quán)利的中心節(jié)點(diǎn),從而形成去中心化的分布式系統(tǒng)。
(2)去信任化。區(qū)塊鏈網(wǎng)絡(luò)中的信任由數(shù)學(xué)算法來背書。區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點(diǎn)互相交換數(shù)據(jù)時(shí),不需要了解對方的可信度,通過數(shù)學(xué)算法建立信任。網(wǎng)絡(luò)中的數(shù)據(jù)可驗(yàn)證,各節(jié)點(diǎn)欺騙不了其他節(jié)點(diǎn)。區(qū)塊鏈系統(tǒng)運(yùn)行公開透明,數(shù)據(jù)可查[4]。
(3)安全可信。區(qū)塊鏈通過數(shù)字簽名技術(shù)、基于時(shí)間戳的鏈?zhǔn)浇Y(jié)構(gòu)和分布式系統(tǒng)共識(shí)算法聚合的強(qiáng)大算力,保證區(qū)塊鏈數(shù)據(jù)的安全可信,不可篡改。區(qū)塊鏈以分布式存儲(chǔ)數(shù)據(jù),每個(gè)節(jié)點(diǎn)都存儲(chǔ)網(wǎng)絡(luò)中生成的數(shù)據(jù),相當(dāng)于數(shù)據(jù)有了很多備份。P2P網(wǎng)絡(luò)中的各個(gè)節(jié)點(diǎn)存儲(chǔ)著完全相同的數(shù)據(jù),除非攻擊者控制P2P網(wǎng)絡(luò)中超過一定比例(比特幣為51%,數(shù)學(xué)證明不可行)的節(jié)點(diǎn)[5],否則任何單個(gè)節(jié)點(diǎn)惡意修改數(shù)據(jù),都不會(huì)影響整個(gè)網(wǎng)絡(luò)數(shù)據(jù)的正確性。
2.1.1 研究目標(biāo)
為了滿足個(gè)人、企業(yè)、機(jī)構(gòu)及政府的意見調(diào)研需求,需設(shè)計(jì)一個(gè)公平、公正、透明的投票系統(tǒng)。投票系統(tǒng)有如下三個(gè)分指標(biāo):
(1)確保投票數(shù)據(jù)不能被篡改;
(2)投票數(shù)據(jù)可追溯、可驗(yàn)證;
(3)匿名投票,保證投票人隱私。
2.1.2 系統(tǒng)功能分析
系統(tǒng)用戶可以在主頁瀏覽自己感興趣的投票調(diào)查、參與投票,并在投票記錄頁面查看投票記錄。如果用戶有調(diào)查的需求,也可以發(fā)起一個(gè)投票調(diào)查,設(shè)置投票選項(xiàng)。系統(tǒng)具有注冊登錄、投票、新建投票、查詢票數(shù)和查詢記錄等功能。系統(tǒng)設(shè)計(jì)要緊密結(jié)合區(qū)塊鏈的特點(diǎn),充分發(fā)揮區(qū)塊鏈的優(yōu)勢,構(gòu)建去中心化、數(shù)據(jù)不可篡改的投票系統(tǒng)[6]。
為了滿足系統(tǒng)公平、工作和透明的需求,設(shè)計(jì)采用區(qū)塊鏈技術(shù)實(shí)現(xiàn)投票系統(tǒng)。區(qū)塊鏈?zhǔn)遣豢纱鄹摹⒄鎸?shí)可信的數(shù)據(jù)庫,本次設(shè)計(jì)將區(qū)塊鏈數(shù)據(jù)(投票數(shù)據(jù))存入?yún)^(qū)塊鏈中,普通數(shù)據(jù)(如用戶名,密碼等)存入本地?cái)?shù)據(jù)庫。系統(tǒng)架構(gòu)如圖1所示,主要包括應(yīng)用層和區(qū)塊鏈層。應(yīng)用層采用B/S架構(gòu),Web應(yīng)用層主要實(shí)現(xiàn)系統(tǒng)功能(注冊登錄、投票等)。區(qū)塊鏈層可細(xì)分為網(wǎng)絡(luò)層和存儲(chǔ)層,其將投票數(shù)據(jù)發(fā)送到區(qū)塊鏈網(wǎng)絡(luò)中,并實(shí)現(xiàn)數(shù)據(jù)在區(qū)塊鏈中的分布式存取。
圖1 系統(tǒng)架構(gòu)
Web應(yīng)用層實(shí)現(xiàn)系統(tǒng)功能,如注冊登錄、投票、新建投票及查詢票數(shù)等功能。普通數(shù)據(jù)(如用戶名,密碼等)直接存入數(shù)據(jù)庫,區(qū)塊鏈數(shù)據(jù)(投票記錄)存入?yún)^(qū)塊鏈。當(dāng)訪問普通數(shù)據(jù)時(shí),需要進(jìn)行數(shù)據(jù)庫設(shè)計(jì),編寫sql語句。當(dāng)訪問區(qū)塊鏈數(shù)據(jù)時(shí),需要調(diào)用底層區(qū)塊鏈接口,實(shí)現(xiàn)數(shù)據(jù)在區(qū)塊鏈中的存取。系統(tǒng)中區(qū)塊鏈數(shù)據(jù)存儲(chǔ)流程,如圖2所示。
應(yīng)用層獲取區(qū)塊鏈數(shù)據(jù)后,用私鑰對數(shù)據(jù)進(jìn)行簽名,將數(shù)據(jù)封裝好后發(fā)送到區(qū)塊鏈網(wǎng)絡(luò)中。區(qū)塊鏈網(wǎng)絡(luò)中的節(jié)點(diǎn)校驗(yàn)數(shù)據(jù)有效性,將有效數(shù)據(jù)存入數(shù)據(jù)池中,丟棄無效數(shù)據(jù)。節(jié)點(diǎn)的數(shù)據(jù)池滿了,通過某種共識(shí)機(jī)制決定由哪個(gè)節(jié)點(diǎn)取得記賬權(quán),即按照一定的結(jié)構(gòu)(如加入時(shí)間戳)將這些有效數(shù)據(jù)打包成一個(gè)區(qū)塊,并以鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ)到區(qū)塊鏈中。取得記賬權(quán)的節(jié)點(diǎn)向全網(wǎng)廣播本區(qū)塊,其他節(jié)點(diǎn)驗(yàn)證區(qū)塊的有效性。若有效,則將區(qū)塊存到區(qū)塊鏈中;否則,丟棄[7]。
圖2 區(qū)塊鏈數(shù)據(jù)存儲(chǔ)流程
區(qū)塊鏈網(wǎng)絡(luò)層。網(wǎng)絡(luò)層實(shí)現(xiàn)網(wǎng)絡(luò)的構(gòu)建,并加以驗(yàn)證機(jī)制和共識(shí)機(jī)制,保證數(shù)據(jù)的安全性和一致性。區(qū)塊鏈節(jié)點(diǎn)網(wǎng)絡(luò)是一個(gè)P2P網(wǎng)絡(luò)。區(qū)塊鏈網(wǎng)絡(luò)中的所有節(jié)點(diǎn)共同參與網(wǎng)絡(luò)中數(shù)據(jù)的驗(yàn)證、記賬、存儲(chǔ)、維護(hù)和傳輸?shù)冗^程。
區(qū)塊鏈存儲(chǔ)層。存儲(chǔ)層將數(shù)據(jù)以首尾相連、基于時(shí)間戳的鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)存儲(chǔ)。區(qū)塊一旦經(jīng)過節(jié)點(diǎn)驗(yàn)證保存到區(qū)塊鏈中,將無法改動(dòng)。通過“區(qū)塊十鏈?zhǔn)浇Y(jié)構(gòu)”,區(qū)塊鏈可以及時(shí)發(fā)現(xiàn)任一數(shù)據(jù)的篡改。區(qū)塊鏈提供了一個(gè)有時(shí)序、可查的記錄,可以看做是不可篡改、真實(shí)可信的數(shù)據(jù)庫。
為了達(dá)到區(qū)塊鏈去中心化、數(shù)據(jù)不可篡改、安全可信的要求,區(qū)塊鏈層將利用P2P網(wǎng)絡(luò)構(gòu)建分布式數(shù)據(jù)庫,運(yùn)用數(shù)字簽名算法及加密技術(shù)保證數(shù)據(jù)的不可篡改、共識(shí)算法來保證網(wǎng)絡(luò)中數(shù)據(jù)的一致性,并運(yùn)用時(shí)間戳技術(shù)將數(shù)據(jù)區(qū)塊以首尾相連的鏈?zhǔn)浇Y(jié)構(gòu)保存。如圖3所示,區(qū)塊鏈層分為網(wǎng)絡(luò)層和存儲(chǔ)層。網(wǎng)絡(luò)層實(shí)現(xiàn)網(wǎng)絡(luò)的構(gòu)建,并加以驗(yàn)證機(jī)制和共識(shí)機(jī)制保證數(shù)據(jù)的安全性和一致性,設(shè)計(jì)重點(diǎn)是構(gòu)建P2P網(wǎng)絡(luò),實(shí)現(xiàn)驗(yàn)證機(jī)制和共識(shí)機(jī)制。存儲(chǔ)層封裝數(shù)據(jù)區(qū)塊,將數(shù)據(jù)區(qū)塊以首尾相連的鏈?zhǔn)奖4?,設(shè)計(jì)重點(diǎn)是運(yùn)用時(shí)間戳、哈希函數(shù)、Merkle樹和非對稱加密等技術(shù),構(gòu)建數(shù)據(jù)區(qū)塊結(jié)構(gòu),實(shí)現(xiàn)區(qū)塊的鏈?zhǔn)酱鎯?chǔ)。
圖3 區(qū)塊鏈層
3.1.1 節(jié)點(diǎn)P2P網(wǎng)絡(luò)構(gòu)建
P2P網(wǎng)絡(luò)具有去中心化、可擴(kuò)展性、分散性和健壯性等優(yōu)點(diǎn),可以將參與數(shù)據(jù)校驗(yàn)和記賬的節(jié)點(diǎn)組織起來,使系統(tǒng)可以在去中心化的情況下穩(wěn)定運(yùn)行。P2P網(wǎng)絡(luò)中不存在中心節(jié)點(diǎn),節(jié)點(diǎn)之間通過扁平式拓?fù)浣Y(jié)構(gòu)互聯(lián)互通。每個(gè)節(jié)點(diǎn)具有相同的功能,提供網(wǎng)絡(luò)服務(wù)。每個(gè)節(jié)點(diǎn)具有發(fā)現(xiàn)新節(jié)點(diǎn)、同步區(qū)塊、應(yīng)用層網(wǎng)絡(luò)路由、驗(yàn)證區(qū)塊數(shù)據(jù)和傳播區(qū)塊數(shù)據(jù)等功能。
構(gòu)建P2P網(wǎng)絡(luò)是區(qū)塊鏈層的初始化過程。如果一個(gè)新節(jié)點(diǎn)首次加入P2P網(wǎng)絡(luò),需要網(wǎng)絡(luò)中其他節(jié)點(diǎn)的IP地址。DNS seed可以提供P2P網(wǎng)絡(luò)上節(jié)點(diǎn)IP地址的DNS服務(wù)器,有助于發(fā)現(xiàn)節(jié)點(diǎn)。因此,采用DNS seed方式加入P2P網(wǎng)絡(luò),采用TCP協(xié)議,使用8333端口。
加入過程如下:
(1)連接種子節(jié)點(diǎn);
(2)接收節(jié)點(diǎn)IP地址列表;
(3)連接列表中的節(jié)點(diǎn);
(4)當(dāng)建立一個(gè)或多個(gè)連接后,節(jié)點(diǎn)向其相鄰節(jié)點(diǎn)發(fā)送自身IP地址。相鄰節(jié)點(diǎn)將轉(zhuǎn)發(fā)IP地址,使更多節(jié)點(diǎn)接收IP地址,保證連接更穩(wěn)定。
3.1.2 數(shù)據(jù)驗(yàn)證機(jī)制
驗(yàn)證機(jī)制保證數(shù)據(jù)的不可篡改。P2P網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)不斷接收數(shù)據(jù),節(jié)點(diǎn)接收數(shù)據(jù)后會(huì)在第一時(shí)間驗(yàn)證數(shù)據(jù)的有效性。節(jié)點(diǎn)會(huì)驗(yàn)證數(shù)據(jù)結(jié)構(gòu)、數(shù)字簽名等,只有滿足所有條件的數(shù)據(jù)才有效。如果數(shù)據(jù)無效,則丟棄。如果數(shù)據(jù)有效,則將有效數(shù)據(jù)數(shù)存入數(shù)據(jù)池。獲得記賬權(quán)的節(jié)點(diǎn)會(huì)向全網(wǎng)廣播區(qū)塊,其他節(jié)點(diǎn)會(huì)驗(yàn)證區(qū)塊的有效性,包括區(qū)塊頭中的隨機(jī)數(shù)、時(shí)間戳和區(qū)塊體中的數(shù)據(jù)。若區(qū)塊有效,則存入?yún)^(qū)塊鏈;否則,丟棄。
本次設(shè)計(jì)采用橢圓曲線數(shù)字簽名算法(ECDSA),私鑰是d,公鑰是(E,P,n,Q)。
生成簽名過程如下:
(1)選擇一個(gè)隨機(jī)整數(shù)k,介于[1,n-1];
(2) 計(jì) 算 kp=(x1,y2)以 及 r=x1mod n。 如 果r=0,則跳到步驟(1);否則,執(zhí)行步驟(3)。
(3)計(jì)算 s=k-1{h(m)+dr}mod n(其中 h(·)是哈希算法)。若s=0,則跳到步驟(1);否則,執(zhí)行步驟(4);
(4)簽名信息m是(r,s)。
簽名驗(yàn)證過程如下:
(1)獲取公鑰(E,P,n,Q);
(2)驗(yàn)證r和s是否為整數(shù),且介于區(qū)間[1,n-1];
(3)計(jì)算w=s-1mod n以及h(m);
(4)計(jì)算u1=h(m)wmodn以及u2=rwmodn;
(5)計(jì)算u1P+u2Q=(x0,y0)以及v=x0modn;
(6)當(dāng)且僅當(dāng)v=r,簽名驗(yàn)證正確。
3.1.3 共識(shí)機(jī)制
共識(shí)機(jī)制為區(qū)塊鏈中數(shù)據(jù)的一致性提供保障,是區(qū)塊鏈能夠維持運(yùn)行的關(guān)鍵所在。區(qū)塊鏈中的共識(shí)機(jī)制具體表現(xiàn)在,當(dāng)節(jié)點(diǎn)收集到一定數(shù)量的有效數(shù)據(jù)時(shí),有多個(gè)節(jié)點(diǎn)將數(shù)據(jù)打包成區(qū)塊,在節(jié)點(diǎn)可能被攻擊的情況下,系統(tǒng)如何對記賬權(quán)歸屬哪個(gè)節(jié)點(diǎn)達(dá)成共識(shí),使區(qū)塊鏈能夠穩(wěn)定可靠地運(yùn)行。性能良好的共識(shí)算法能夠選擇合適的節(jié)點(diǎn),該節(jié)點(diǎn)將自己打包好的區(qū)塊數(shù)據(jù)廣播到全網(wǎng),經(jīng)其他節(jié)點(diǎn)驗(yàn)證有效性后,該區(qū)塊方可存入?yún)^(qū)塊鏈中。
工作量證明機(jī)制(Proof of work,Pow)算法簡單,容易實(shí)現(xiàn),容錯(cuò)性好(允許全網(wǎng)50%節(jié)點(diǎn)被攻擊)。本次設(shè)計(jì)采用工作量證明機(jī)制,在節(jié)點(diǎn)將數(shù)據(jù)打包成區(qū)塊前,需要找出一個(gè)隨機(jī)數(shù),使區(qū)塊頭各元素的哈希值不大于目標(biāo)哈希值(由特定的算法產(chǎn)生目標(biāo)哈希),提高打包區(qū)塊的門檻。第一個(gè)找到滿足條件隨機(jī)數(shù)的節(jié)點(diǎn)將獲得本區(qū)塊的記賬權(quán)并向全網(wǎng)廣播,經(jīng)大部分節(jié)點(diǎn)驗(yàn)證有效性后存入?yún)^(qū)塊鏈。計(jì)算能力越強(qiáng)的節(jié)點(diǎn),最先找到滿足條件隨機(jī)數(shù)的概率越大。
3.2.1 數(shù)據(jù)區(qū)塊
為了實(shí)現(xiàn)數(shù)據(jù)基于時(shí)間戳的鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ),并能夠快速驗(yàn)證數(shù)據(jù)的有效性,數(shù)據(jù)區(qū)塊采用如圖4所示的結(jié)構(gòu),每個(gè)數(shù)據(jù)區(qū)塊分為區(qū)塊頭(Header)和區(qū)塊體(Body)。區(qū)塊頭中包含版本號(hào)(Version)、前一區(qū)塊哈希值(Prey-block)、時(shí)間戳(Timestamp)、隨機(jī)數(shù)(Nonce)、本區(qū)塊目標(biāo)哈希值(Bits)和Merkle根(Merkle-root)。區(qū)塊創(chuàng)建過程中生成的有效數(shù)據(jù)和對應(yīng)數(shù)量則保存在區(qū)塊體中。有效數(shù)據(jù)通過Merkle樹的哈希產(chǎn)生唯一的Merkles根,存入?yún)^(qū)塊頭。
圖4 數(shù)據(jù)區(qū)塊采用的結(jié)構(gòu)
3.2.2 鏈?zhǔn)浇Y(jié)構(gòu)
為了能夠提供區(qū)塊鏈數(shù)據(jù)的追溯和驗(yàn)證功能,可以將區(qū)塊以鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ)。當(dāng)前區(qū)塊包含前一區(qū)塊的哈希值,如果節(jié)點(diǎn)不知道前一個(gè)區(qū)塊的哈希值,就能生成新的區(qū)塊。通過區(qū)塊哈希值將區(qū)塊鏈中的所有數(shù)據(jù)區(qū)塊串成一條鏈,區(qū)塊鏈中始終保存著最長的一條鏈(主鏈),即從創(chuàng)世塊到最新生成的區(qū)塊。當(dāng)新的區(qū)塊存入?yún)^(qū)塊鏈中,將會(huì)鏈接在主鏈后面。
區(qū)塊鏈將數(shù)據(jù)區(qū)塊以鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ)在區(qū)塊鏈上,數(shù)據(jù)區(qū)塊中帶有時(shí)間戳,因此增加了數(shù)據(jù)的時(shí)間維度,可以方便地追溯和驗(yàn)證數(shù)據(jù)。通過前一區(qū)塊哈希值,可以定位前一區(qū)塊并驗(yàn)證前一區(qū)塊是否修改。通過“區(qū)塊十鏈?zhǔn)浇Y(jié)構(gòu)”,區(qū)塊鏈可以及時(shí)發(fā)現(xiàn)任一數(shù)據(jù)的篡改。區(qū)塊鏈提供了一個(gè)有時(shí)序、可查的記錄,可以看做是不可篡改、真實(shí)可信的數(shù)據(jù)庫。
應(yīng)用層采用B/S架構(gòu),根據(jù)系統(tǒng)功能分析,設(shè)計(jì)完成注冊登錄模塊、主頁模塊、投票模塊、新建投票模塊、投票結(jié)果查詢模塊和投票歷史查詢模塊。Web應(yīng)用層將采用Spring+Spring Boot+Mybits的框架開發(fā),數(shù)據(jù)庫為mysql。
應(yīng)用層采用MVC(Model View Controller)設(shè)計(jì)模式,分為視圖層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,如圖5所示。為了實(shí)現(xiàn)投票結(jié)果不可篡改的特點(diǎn),投票數(shù)據(jù)是存儲(chǔ)在區(qū)塊鏈中的。每一次投票都會(huì)生成一個(gè)投票數(shù)據(jù),如圖6所示。投票數(shù)據(jù)主要包括版本號(hào)、輸入、輸出和時(shí)間。輸入中有投票者的公鑰和私鑰生成的數(shù)字簽名等信息,輸出中有選項(xiàng)對應(yīng)的區(qū)塊鏈地址。
圖5 應(yīng)用層的MVC設(shè)計(jì)模式
圖6 投票數(shù)據(jù)
區(qū)塊鏈具有去中心化、數(shù)據(jù)不可篡改、安全可信的特點(diǎn),數(shù)據(jù)一旦存入?yún)^(qū)塊鏈,就無法篡改。在分析系統(tǒng)需求和數(shù)據(jù)存儲(chǔ)特點(diǎn)的基礎(chǔ)上,將系統(tǒng)分為應(yīng)用層和區(qū)塊鏈層,重點(diǎn)設(shè)計(jì)了區(qū)塊鏈網(wǎng)絡(luò)層中P2P網(wǎng)絡(luò)的組網(wǎng)方式、數(shù)據(jù)區(qū)塊的驗(yàn)證機(jī)制、保證數(shù)據(jù)一致性的共識(shí)機(jī)制,并運(yùn)用時(shí)間戳、Merkle樹、非對稱加密等技術(shù)來設(shè)計(jì)數(shù)據(jù)區(qū)塊,然后利用鏈?zhǔn)浇Y(jié)構(gòu)存儲(chǔ)數(shù)據(jù)區(qū)塊。在此基礎(chǔ)上將區(qū)塊鏈技術(shù)應(yīng)用于投票場景,實(shí)現(xiàn)了一個(gè)數(shù)據(jù)安全的投票系統(tǒng),保證了其投票結(jié)果的公平、公正和可信。