譚文安,王 慧
(1.南京航空航天大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院,南京211106; 2.上海第二工業(yè)大學(xué)計算機(jī)與信息工程學(xué)院,上海201209)
(?通信作者電子郵箱wtan@foxmail.com)
近年來,互聯(lián)網(wǎng)+技術(shù)的不斷發(fā)展,促進(jìn)各種籌款捐助活動演變成各種線上模式,雖說這種方式帶給人們極大便利,讓籌款捐助跨越了空間障礙,但隨著各種數(shù)據(jù)的爆炸增長,人們難以辨別孰真孰假,不法分子利用這種弊端,通過不法手段從中牟利,置籌款捐助這一善事于尷尬境地。出現(xiàn)以下問題:1)籌款信息缺乏可信度;2)善款流向不透明;3)善款到賬不及時。區(qū)塊鏈技術(shù)和智能合約為解決上述問題提供了技術(shù)支撐,本文將區(qū)塊鏈技術(shù)和籌款捐助相結(jié)合,提出了一種可信籌款捐助方案,并基于此方案搭建了一個可信平臺,以驗證上述方案的有效性。
區(qū)塊鏈?zhǔn)菑谋忍貛诺讓蛹夹g(shù)衍生出來的新技術(shù)體系,是一種按照時間順序?qū)?shù)據(jù)區(qū)塊以鏈條的方式組合而成的特定數(shù)據(jù)結(jié)構(gòu),并以密碼學(xué)方式保證其不可篡改、不可偽造的去中心化公共總賬[1]。區(qū)塊鏈的特點主要包含以下三方面:1)開放共識:任何用戶都可以參與到區(qū)塊鏈中,參與其中的節(jié)點都可以獲得一份完整的賬本;任何用戶都可以通過公開的接口查詢區(qū)塊鏈上的數(shù)據(jù)。2)去中心化:區(qū)塊鏈?zhǔn)怯蓞⑴c節(jié)點組成的P2P(Peer to Peer)網(wǎng)絡(luò),不存在中心化的硬件或管理機(jī)構(gòu),任何節(jié)點在網(wǎng)絡(luò)中都是平等的。3)不可篡改性:區(qū)塊鏈?zhǔn)且粋€公開的賬本,區(qū)塊通過節(jié)點的驗證后會被永久存儲,區(qū)塊中含有上一個區(qū)塊的hash值,如果修改其中某一個區(qū)塊,在這之后的所有區(qū)塊都要重新計算,除非能控制系統(tǒng)中超過51%的節(jié)點,否則單個節(jié)點對數(shù)據(jù)庫的修改是無效的。基于區(qū)塊鏈的這些特性,每個節(jié)點都存有區(qū)塊鏈上的完整信息,每筆籌款申請或善款捐助信息都是公開透明的。
比特幣是區(qū)塊鏈1.0技術(shù),開創(chuàng)了數(shù)字貨幣的先河。比特幣協(xié)議使用基于堆棧的腳本語言,不能構(gòu)建更高級的應(yīng)用,以太坊[2]則對比特幣系統(tǒng)進(jìn)行了擴(kuò)展,構(gòu)建了新一代智能合約和去中心化應(yīng)用平臺,被稱作區(qū)塊鏈2.0技術(shù)。以太坊旨在為去中心化應(yīng)用實現(xiàn)一個在區(qū)塊鏈之上的圖靈完備的計算平臺,作為具有智能合約[3]功能的開源公共區(qū)塊鏈平臺,它引入以太坊虛擬機(jī)(Ethereum Virtual Machine,EVM),允許開發(fā)人員利用智能合約在其上創(chuàng)建基于任意數(shù)量彼此陌生的網(wǎng)絡(luò)節(jié)點的分布式應(yīng)用。
目前,絕大多數(shù)Web應(yīng)用模式可以認(rèn)為是“中心化”的?!叭ブ行幕瘧?yīng)用程序”(Decentralized Application,DApp)是將數(shù)據(jù)保存到“基于點對點網(wǎng)絡(luò)的時間戳服務(wù)器”,即區(qū)塊鏈,而不是由中心化的公司或組織控制其服務(wù),由這樣的“去中心化服務(wù)”來提供具體的業(yè)務(wù)數(shù)據(jù)計算應(yīng)用。DApp也可以簡單地理解為是基于智能合約進(jìn)行狀態(tài)追蹤和計算的一種應(yīng)用程序。
區(qū)塊鏈作為新興技術(shù),其去中心化、防篡改、可溯源等特點使其應(yīng)用于醫(yī)療[4]、金融[5]、物聯(lián)網(wǎng)[6]、能源[7]等諸多領(lǐng)域。文獻(xiàn)[8]將區(qū)塊鏈技術(shù)應(yīng)用于投票系統(tǒng)中實現(xiàn)匿名投票系統(tǒng),減少人工干預(yù)保證其公正公平;文獻(xiàn)[9]將區(qū)塊鏈技術(shù)應(yīng)用到數(shù)字內(nèi)容的版權(quán)保護(hù)上,利用其可溯源特點改善傳統(tǒng)模式;文獻(xiàn)[10]通過使用區(qū)塊鏈和數(shù)據(jù)交互審計平臺來完成乘客隱私信息的保護(hù)。
區(qū)塊鏈技術(shù)使社會公益慈善事業(yè)的系統(tǒng)設(shè)計有了新的方向。文獻(xiàn)[11]為慈善平臺開發(fā)提供了一種應(yīng)用模式,將布比公司開發(fā)的區(qū)塊鏈作為底層技術(shù),通過限制受助人只能在慈善機(jī)構(gòu)規(guī)定的其他機(jī)構(gòu)處使用善款來防止受助人濫用善款,但未對善款挪用或到賬不及時等問題提出有效的解決措施;國內(nèi)的螞蟻金服公司將區(qū)塊鏈技術(shù)用于記錄支付寶捐贈的具體流向,實現(xiàn)了善款使用的公開透明、可追溯和不可篡改;文獻(xiàn)[12]利用螞蟻區(qū)塊鏈平臺幫助聽障兒童重獲新生、和再障說分手等慈善項目實現(xiàn)善款籌集;文獻(xiàn)[13]提出了眾籌業(yè)務(wù)的私有區(qū)塊鏈架構(gòu)(Crowdfunding Private Block Chain,CPBC)以滿足眾籌業(yè)務(wù)需要,加強(qiáng)金融數(shù)據(jù)安全和公信力;文獻(xiàn)[14]將區(qū)塊鏈技術(shù)用于災(zāi)區(qū)援助的資金籌集,將整個平臺搭建在以太坊之上,其交易均通過智能合約進(jìn)行并存儲在區(qū)塊鏈上;文獻(xiàn)[15]探討了如何在慈善領(lǐng)域利用區(qū)塊鏈,建立以區(qū)塊鏈技術(shù)為基礎(chǔ)的比特幣慈善平臺。這些研究給區(qū)塊鏈在籌款捐助領(lǐng)域的應(yīng)用提供了啟示,本文方案保證了籌款信息真實可靠,杜絕了欺詐的籌款行為,同時結(jié)合智能合約技術(shù),有效防止了善款挪用及到賬不及時問題發(fā)生。
將區(qū)塊鏈技術(shù)引入款捐助平臺設(shè)計,基于以太坊智能合約進(jìn)行DApp研究與設(shè)計,實現(xiàn)籌款信息真實可靠以及善款去向透明化。功能包括籌款申請、籌款信息展示、捐款操作、捐款記錄查詢。為了保證籌款信息的真實性,除了各方調(diào)查監(jiān)督外,系統(tǒng)還設(shè)置了保證金罰沒機(jī)制,促使所有節(jié)點都能遵循系統(tǒng)規(guī)則,以此確保信息真實可靠,避免弄虛造假;同時,利用智能合約明確收款方地址并完成自動轉(zhuǎn)賬操作,捐款人和受助人直接聯(lián)系,避免善款挪用或久未到賬問題。
圖1展示了基于智能合約的可信籌款捐助系統(tǒng)中受助人提交數(shù)據(jù)進(jìn)行鏈上存儲以及捐款交易的業(yè)務(wù)模型。

圖1 業(yè)務(wù)模型Fig.1 Businessmodel
首先受助人根據(jù)自身情況填寫籌款申請信息,同時繳納一定的保證金,暫存在籌款申請智能合約里,等待第三方調(diào)研機(jī)構(gòu)調(diào)查審核:審核通過,智能合約才自動將受助人信息存儲到區(qū)塊鏈上,并將保證金返還給受助人,同時將審核通過的籌款信息展示在捐助平臺上;若審核未通過,智能合約自動罰沒受助人保證金,不予退還。
捐助者瀏覽捐助平臺的籌款信息,選擇受助對象進(jìn)行捐款,后臺通過智能合約自動進(jìn)行交易操作,交易完成后轉(zhuǎn)賬交易信息將上鏈存儲,以便后續(xù)善款查詢跟蹤,同時更新受助者已籌善款金額。
系統(tǒng)架構(gòu)如圖2所示,包含3個部分:Web前端模塊、中間模塊、區(qū)塊鏈模塊。

圖2 系統(tǒng)架構(gòu)Fig.2 Systemarchitecture
底層區(qū)塊鏈模塊提供數(shù)據(jù)和交易的存儲功能,負(fù)責(zé)存儲智能合約代碼和執(zhí)行智能合約,并將執(zhí)行結(jié)果打包成區(qū)塊,經(jīng)過共識后寫入?yún)^(qū)塊鏈賬本?;陂_源區(qū)塊鏈系統(tǒng)以太坊進(jìn)行搭建,使用以太坊客戶端構(gòu)建一個去中心化的網(wǎng)絡(luò),用以支持智能合約交互操作和信息的存儲。
中間模塊主要由智能合約和Web3組成,智能合約為數(shù)據(jù)的存儲查詢和捐款交易提供交互接口,智能合約代碼保存在區(qū)塊鏈模塊中。當(dāng)進(jìn)行籌款申請或善款明細(xì)查詢時,數(shù)據(jù)存儲查詢智能合約自動被調(diào)用,完成相應(yīng)的區(qū)塊鏈數(shù)據(jù)存儲查詢操作;當(dāng)有捐助者進(jìn)行捐款時,捐助合約被調(diào)用,自動存儲轉(zhuǎn)賬交易信息,當(dāng)達(dá)到目標(biāo)金額時,自動完成交易操作。與傳統(tǒng)的基于Web服務(wù)的HTTP API(Application Program Interface)中間件不同,智能合約是一個部署在以太坊網(wǎng)絡(luò)上的協(xié)議,規(guī)定了用戶能夠執(zhí)行的操作以及操作規(guī)范,用戶操作全都按照合約內(nèi)容進(jìn)行。本文選擇使用Solidity語言編寫智能合約,實現(xiàn)籌款捐助系統(tǒng)的各項功能。Web3是一套和以太坊節(jié)點進(jìn)行通信的API,通過Web3來獲取節(jié)點狀態(tài)、獲取賬號信息、調(diào)用合約、監(jiān)聽合約事件等,實現(xiàn)上層應(yīng)用與智能合約和以太坊區(qū)塊鏈的溝通和連接。
應(yīng)用層Web前端模塊為用戶提供友好的互動界面,提交各參與方主體的請求,通過智能合約提供的接口與區(qū)塊鏈進(jìn)行交互,選擇要調(diào)用的智能合約,執(zhí)行具體的籌款申請和轉(zhuǎn)賬交易功能。
針對前面所提出的基于智能合約的可信籌款捐助系統(tǒng)架構(gòu),討論其功能模塊設(shè)計及其實現(xiàn),詳細(xì)介紹合約設(shè)計,討論如何使用智能合約技術(shù)實現(xiàn)籌款捐助系統(tǒng)的可信平臺。
Web前端界面主要分為籌款申請、籌款信息展示、捐款、捐款明細(xì)等四部分,采用Html+Css+Javascript進(jìn)行界面設(shè)計;通過Web.js庫與以太坊節(jié)點的RPC接口連接來調(diào)用智能合約;運行以太坊節(jié)點的仿真器軟件Ganache-cli來模擬真實的以太坊網(wǎng)絡(luò)環(huán)境;使用谷歌瀏覽器提供的MetaMask插件(以太坊輕錢包)來連接以太坊節(jié)點,生成并發(fā)送交易信息到以太坊區(qū)塊鏈網(wǎng)絡(luò),并進(jìn)行交易費用的付款和捐款的轉(zhuǎn)賬操作。
錢包在以太坊網(wǎng)絡(luò)中起著管理私鑰、地址和區(qū)塊鏈數(shù)據(jù)的作用,根據(jù)區(qū)塊鏈數(shù)據(jù)維護(hù)方式,錢包可分為全節(jié)點錢包和輕錢包兩種:全節(jié)點錢包需要同步所有區(qū)塊鏈數(shù)據(jù),對容量要求較高;輕錢包僅需同步與賬戶自身相關(guān)的數(shù)據(jù),無需下載全部的、龐大的以太坊節(jié)點數(shù)據(jù),幫助用戶方便地管理自己的以太坊數(shù)字資產(chǎn)。
系統(tǒng)應(yīng)用層基于以太坊中最受歡迎的Truffle框架開發(fā),有效實現(xiàn)從智能合約編譯、部署到發(fā)布的整個流程集約化操作,采用Bootstrap框架開發(fā)用戶頁面。
智能合約(Smart Contract)這個詞最初是由美國計算機(jī)科學(xué)博士尼克·薩博(Nick Szabo)在1994年提出來的[16]。智能合約指的是一種基于計算機(jī)技術(shù)實現(xiàn)的,可以免除人工干預(yù)而自動執(zhí)行、自動校驗、自動基于外部指令給出回應(yīng)的具有交互性或者互操作性的合約。智能合約不僅僅是一個可以自動執(zhí)行的計算機(jī)程序,更像是一個可信的第三方,可以臨時保管資產(chǎn),嚴(yán)格按照事先約定好的規(guī)則執(zhí)行操作。在以太坊中,所有的交易都按照合約定義的操作有條不紊地執(zhí)行,且改變著區(qū)塊鏈的狀態(tài)。支持多方合作,消除潛在的人為錯誤和腐敗風(fēng)險,對于每個參與用戶來說都是透明的。
3.2.1 籌款申請
籌款申請是本系統(tǒng)的主要功能之一,受助人首先需要提交籌款申請信息,受助者結(jié)構(gòu)體見表1。為了防止受助者填寫虛假的籌款信息,所有提交的信息都需經(jīng)過審核并繳納一定的保證金,結(jié)構(gòu)體中要包含審核是否通過的狀態(tài)標(biāo)志,只有審核通過,籌款信息才能在捐助平臺進(jìn)行展示;如果最后審核沒有通過,不僅無法在平臺上發(fā)布籌款,還會被罰沒保證金。以此懲罰機(jī)制來保證系統(tǒng)的可信性,讓所有節(jié)點自覺遵守智能合約規(guī)則。

表1 受助者結(jié)構(gòu)體Tab.1 Recipient structure
第三方調(diào)研機(jī)構(gòu)一旦點擊審核通過按鈕,智能合約就會自動將受助者信息存儲到區(qū)塊鏈上,以備后續(xù)查詢和交易。將受助者信息存儲到區(qū)塊鏈上的合約算法addTarget如下所述。
算法1 addTarget。
輸入 籌款申請者姓名,目標(biāo)金額,所患疾病,聯(lián)系方式,已籌金額初始化為“0”,籌款狀態(tài)初始化為“未完成”。
輸出 返回成功存儲到區(qū)塊鏈的受助者信息。
步驟1 監(jiān)聽審核通過事件;
步驟2 審核通過,觸發(fā)存儲籌款申請智能合約;
步驟3 智能合約自動將申請人信息存儲到區(qū)塊鏈上,并調(diào)用發(fā)布籌款信息合約;
步驟4 返回保證金到受助者地址;
步驟5 若審核未通過,則罰沒保證金。
3.2.2 善款捐助
捐助人瀏覽所有籌款信息展示頁面,點擊捐款按鈕后,就會調(diào)用捐款合約,記錄交易詳情。善款可暫時存放在合約里,等達(dá)到目標(biāo)金額,智能合約自動將善款轉(zhuǎn)入受助者賬戶,避免善款到賬不及時;未達(dá)到目標(biāo)金額時,受助者也可自行提取到自己的賬戶中,前提是地址需保持一致,否則智能合約拒絕轉(zhuǎn)賬,防止善款被隨意挪用。捐助者進(jìn)行善款捐助的合約算法Donate如下所述:
算法2 Donate。
輸入 捐款者地址,受助者序號,捐款金額。
輸出 返回捐款成功信息。
步驟1 獲取捐助者地址、受助人序號、捐助金額等輸入信息;
步驟2 判斷捐助對象是否存在、審核狀態(tài)是否為通過、籌款狀態(tài)是否為未完成;
步驟3 若滿足步驟2),則在捐助者結(jié)構(gòu)體里記錄下受助者序號;
步驟4 觸發(fā)捐贈事件,記錄受助對象和捐贈者地址及捐助金額;
步驟5 判斷是否達(dá)到目標(biāo)金額;
步驟6 若滿足步驟5),智能合約自動將善款轉(zhuǎn)給受助者,同時將籌款狀態(tài)設(shè)置成已完成;
步驟7 若未達(dá)到目標(biāo)金額,受助者請求提款,智能合約需判斷請求者地址是否與受助者地址相同;
步驟8 若地址一致,則同意提款,同時更新受助者目標(biāo)金額和可用金額,并記錄其已用金額。
區(qū)塊鏈本質(zhì)上可以看成是存儲信息的分布式數(shù)據(jù)庫,或者理解為在各個參與者之間執(zhí)行和共享所有交易事件的公共賬本。賬本是由不同區(qū)塊構(gòu)成的,一個區(qū)塊包含區(qū)塊頭和區(qū)塊體兩部分:區(qū)塊頭由前一個區(qū)塊的hash值、挖礦的難度及本區(qū)塊中一定數(shù)量的交易數(shù)據(jù)的默克爾(Merkle)樹、時間戳等構(gòu)造而成;區(qū)塊體則封裝了自上一區(qū)塊創(chuàng)建以來的多筆交易記錄,在區(qū)塊鏈中生成的所有記錄通過Merkle樹的哈希過程生成唯一的Merkle根,存儲在區(qū)塊鏈的頭部[17]。
Merkle樹是一個基于哈希算法的數(shù)據(jù)結(jié)構(gòu),每一個非葉子節(jié)點都是其葉子節(jié)點的哈希值[18]。一旦葉子節(jié)點的數(shù)據(jù)發(fā)生改變,父節(jié)點的哈希值會隨之改變,Merkle樹的這個特征保證了區(qū)塊中數(shù)據(jù)的不可篡改;時間戳字段可以明確表示該區(qū)塊生成的時間,無法抵賴和篡改;難度值和隨機(jī)數(shù)字段用于全網(wǎng)共識,保證全網(wǎng)數(shù)據(jù)的一致性;每個區(qū)塊都保存上一區(qū)塊的哈希值,用來實現(xiàn)區(qū)塊的連接。區(qū)塊鏈由所有參與節(jié)點共同維護(hù),區(qū)塊鏈的結(jié)構(gòu)如圖3所示。

圖3 區(qū)塊鏈結(jié)構(gòu)Fig.3 Structure of blockchain
在Ubuntu18.04操作系統(tǒng)下設(shè)計實現(xiàn)本文構(gòu)建的基于智能合約的可信籌款捐助系統(tǒng),在該系統(tǒng)下搭建以太坊開發(fā)環(huán)境,同時安裝相關(guān)依賴包和軟件包Node.js、Truffle框架、Ganache-cli、MetaMask等。使用ganache-cli來模擬真實的以太坊網(wǎng)絡(luò)環(huán)境,通過谷歌瀏覽器的插件MetaMask來執(zhí)行以太幣的付款轉(zhuǎn)賬功能。
針對本系統(tǒng)的籌款申請、捐款、籌款信息展示、善款去向明細(xì)等重要功能進(jìn)行了實驗測試:籌款申請、捐款都對區(qū)塊鏈上的數(shù)據(jù)有所修改,產(chǎn)生交易,需要以太坊節(jié)點對交易進(jìn)行打包,從而將數(shù)據(jù)變化寫入?yún)^(qū)塊;籌款信息展示和善款去向明細(xì)無需修改數(shù)據(jù),只產(chǎn)生調(diào)用信息,無交易。
部分重要功能模塊實驗結(jié)果如圖4~5所示。圖4顯示了受助人填寫相關(guān)數(shù)據(jù)信息后提交彈出MetaMask支付交易費用及保證金;圖5顯示了捐助者填寫所要捐助的對象及捐助金額后提交彈出MetaMask支付交易費并捐款的過程。

圖4 籌款申請信息Fig.4 Fund-raisingapplication information

圖5 捐款信息Fig.5 Donation information
與傳統(tǒng)模式下的籌款捐助平臺相比,本平臺有較大優(yōu)勢,主要分析如下:
1)籌款信息真實可靠。本籌款捐助平臺轉(zhuǎn)換為后臺審核機(jī)構(gòu),負(fù)責(zé)對籌款信息進(jìn)行審核,將籌款信息上鏈存儲、籌款信息發(fā)布、轉(zhuǎn)賬交易操作等工作交由智能合約自動完成,使機(jī)構(gòu)職能專一;同時增添了保證金罰沒機(jī)制,讓籌款申請工作更為嚴(yán)謹(jǐn),能有效避免騙捐現(xiàn)象。
2)善款到賬及時。傳統(tǒng)籌款平臺中受助人需要向平臺申請撥款,等待審核后才能使用善款,人工操作有一定的時延。本文方案中當(dāng)善款達(dá)到目標(biāo)金額時,無需等待,觸發(fā)智能合約轉(zhuǎn)賬事件,智能合約自動執(zhí)行轉(zhuǎn)賬操作。
3)善款不被挪用。本文利用智能合約嚴(yán)格約束最后善款到達(dá)地址,轉(zhuǎn)賬過程由合約自動完成,其他人無法插手,一旦轉(zhuǎn)賬地址不一致,智能合約將拒絕進(jìn)行轉(zhuǎn)賬操作,使得善款無法被挪用。
4)善款流向透明。將籌款申請及捐款交易信息全部記錄在區(qū)塊鏈中,每個節(jié)點保存完整的區(qū)塊鏈信息,無論是捐款人還是受助人,都可以隨時查詢到和自己相關(guān)的善款流向。
相對于傳統(tǒng)籌款捐助平臺來說,本文將智能合約和籌款捐助相結(jié)合,解決了傳統(tǒng)平臺的信任問題,本文貢獻(xiàn)主要表現(xiàn)在:1)探究了如何將智能合約應(yīng)用于籌款捐助平臺,設(shè)計實現(xiàn)了一種新的應(yīng)用方案;2)用戶作為以太坊網(wǎng)絡(luò)中的節(jié)點進(jìn)行籌款或者捐款,通過智能合約明確善款的最后使用者,防止善款被挪用;3)通過區(qū)塊鏈的全網(wǎng)共識和保證金罰沒制度,防止欺詐的籌款行為;4)利用智能合約代替人工轉(zhuǎn)賬操作,免除善款久未到賬問題;5)通過區(qū)塊鏈的時間戳唯一標(biāo)識每筆善款交易,進(jìn)行善款跟蹤。
進(jìn)一步工作如下:
1)本文為了保證信息的真實可靠以及善款流向透明化,采用區(qū)塊鏈對信息和交易進(jìn)行存儲,區(qū)塊鏈中的數(shù)據(jù)是完全公開透明的,在某種程度上也暴露了用戶的隱私信息,后期需要考慮是否可以采取某種兩者兼顧的方法;
2)本文最初對籌款申請的審核涉及到第三方調(diào)研機(jī)構(gòu),后期考慮是否同樣也可以用智能合約替換掉第三方,利用智能合約在保證用戶隱私的前提下完成自動審核,這方面工作可能會涉及到醫(yī)院等更多主體以及更為復(fù)雜的關(guān)系;
3)共識算法對平臺效率有一定影響,后期還需針對底層共識算法進(jìn)行改進(jìn),以提高系統(tǒng)效率。