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