于金剛, 王海汀, 趙培培, 李 姝
1(中國科學(xué)院大學(xué), 北京 100049)
2(中國科學(xué)院 沈陽計算技術(shù)研究所, 沈陽 110168)
3(沈陽理工大學(xué) 裝備工程學(xué)院, 沈陽 110159)
如今我國的慈善事業(yè)的總體進(jìn)度以及發(fā)展情況較之世界上先進(jìn)國家的水平有較大的差距, 如今我們經(jīng)常會在新聞中見到詐捐、貪污善款等丑聞的發(fā)生, 這樣對于慈善領(lǐng)域的發(fā)展可以說是一種打擊[1,2].在爆發(fā)一系列事件之后, 國內(nèi)慈善事業(yè)也經(jīng)歷了前所未有的信任危機(jī).許多慈善基金會、機(jī)構(gòu)在一時間流失了許多捐贈, 部分慈善人士更是選擇繞過機(jī)構(gòu), 向受助群體直接提供“一對一”幫助.雖然那些頂著“慈善”旗號的不法組織、個人最后受到了法律制裁, 但這依舊難以重拾國人對于慈善事業(yè)的信心[3].
在慈善領(lǐng)域公信力的問題上, 傳統(tǒng)的慈善組織會因?yàn)橥该鞫炔桓咔冶O(jiān)管難以到位[4], 無論多么詳細(xì)的賬目報表, 都是中心化的產(chǎn)物, 都是(慈善)機(jī)構(gòu)的一家之言, 自然缺乏信任度.這樣就導(dǎo)致這些組織的公信力不足, 群眾無法得知善款的具體用處, 對這些組織缺少信任.現(xiàn)在的捐款的主流方式是通過網(wǎng)上募捐, 區(qū)塊鏈作為比特幣的底層技術(shù), 因?yàn)槠渚哂械牟豢纱鄹暮涂勺匪莸奶匦远蝗怂? 于是, 將區(qū)塊鏈技術(shù)應(yīng)用在慈善領(lǐng)域, 通過網(wǎng)上募捐, 記錄善款的流動方向, 隨時可以查詢善款的去向, 針對應(yīng)用在慈善領(lǐng)域的區(qū)塊鏈系統(tǒng)可以做到善款追蹤, 公開慈善賬目, 提升慈善組織的透明度, 提升公眾的信任感.
近年來, 國內(nèi)外學(xué)者也提出了一些基于區(qū)塊鏈技術(shù)的慈善系統(tǒng), 如文獻(xiàn)[5], 本文與傳統(tǒng)的基于區(qū)塊鏈的系統(tǒng)的區(qū)別在于, 傳統(tǒng)的區(qū)塊鏈系統(tǒng)應(yīng)用主要使用的是在系統(tǒng)內(nèi)設(shè)計專屬于系統(tǒng)的token或者以積分的形式供使用者使用, 并且系統(tǒng)要上傳到區(qū)塊鏈網(wǎng)絡(luò)中的內(nèi)容大多會采用全部上傳的方式; 而本文所設(shè)計的慈善系統(tǒng)采用了具有監(jiān)管職能的第三方監(jiān)管機(jī)構(gòu)身份——監(jiān)督者, 系統(tǒng)會將收集到的信息自動地識別和分類, 監(jiān)督者在審核通過后, 會將提取出的信息憑證上傳到區(qū)塊鏈網(wǎng)絡(luò)中, 從而節(jié)省出區(qū)塊的使用空間, 節(jié)約成本.
傳統(tǒng)的慈善系統(tǒng)更多的是采取本地存儲的方式,通過系統(tǒng)內(nèi)部鏈接的數(shù)據(jù)庫進(jìn)行信息的存儲, 其中涉及到的交易記錄也大多由系統(tǒng)的所屬方來保存, 這樣的中心化管理就不可避免的涉及到信息是否公開透明的問題, 尤其是對于交易數(shù)據(jù)來說, 捐助者無法確定自己所捐助的款項(xiàng)是否被使用在自己所期待的方向上,無法做到實(shí)時的監(jiān)控, 可能會造成一些貪污的問題, 這些就需要用到區(qū)塊鏈交易數(shù)據(jù)可溯源、不可篡改的特性[6].
區(qū)塊鏈技術(shù)源自于比特幣的創(chuàng)造, 區(qū)塊鏈作為一個新興技術(shù), 具備去中心化、防篡改、可追溯等特性,這些特性在金融領(lǐng)域中都具有非常突出的效果, 它可以適應(yīng)多種情況下的金融交易, 同時也為金融交易提供了一個具備公信力的合理的平臺, 區(qū)塊鏈技術(shù)是開放的, 同時也是一個能高效地分配資源的技術(shù), 為金融交易提供了新的手段, 區(qū)塊鏈技術(shù)為商業(yè)領(lǐng)域的快速發(fā)展, 帶來了更多的成長空間.與分布式結(jié)構(gòu)相比較而言, 傳統(tǒng)的中心化結(jié)構(gòu)有兩點(diǎn)比較突出的問題: 一是因?yàn)槿缃竦慕灰追绞綍菇灰纂p方產(chǎn)生信息不對稱的問題; 二是在交易的時候難免會產(chǎn)生資金安全的問題.區(qū)塊鏈技術(shù)可應(yīng)用于優(yōu)化支付體系和構(gòu)建高效安全的金融科技.其中, 根據(jù)區(qū)塊鏈技術(shù)的發(fā)展, 演化出了很多區(qū)塊鏈技術(shù)的底層平臺, 其中的以太坊平臺是最為人熟知的平臺之一, 以太坊平臺具有完備的圖靈機(jī)制, 對于實(shí)現(xiàn)智能合約的目的來說已經(jīng)具備很成熟的環(huán)境.
對于以太坊來說, 可以看作是區(qū)塊鏈技術(shù)與智能合約的結(jié)合, 以太坊是區(qū)塊鏈2.0的產(chǎn)物, 以太坊對于智能合約來說具有更加成熟的環(huán)境, 可以幫助智能合約更穩(wěn)定的運(yùn)行.以太坊可以看作是一個為交易服務(wù)的狀態(tài)機(jī), 他通過讀取一系列的輸入, 通過這些輸出產(chǎn)生一個新的狀態(tài), 其中, 對于如何執(zhí)行某種功能或者某種需要的狀態(tài), 我們需要根據(jù)具體的要求來編寫符合規(guī)定的智能合約, 實(shí)現(xiàn)不可篡改可追溯的功能.
為了滿足慈善系統(tǒng)對數(shù)據(jù)的安全性、存儲量、不可篡改等方面的需求, 采用了區(qū)塊鏈技術(shù)與慈善相結(jié)合的方式, 滿足了數(shù)據(jù)的可追溯、不可篡改的要求, 本系統(tǒng)的重點(diǎn)放在了區(qū)塊鏈的信息存儲能力的問題上,因?yàn)閰^(qū)塊的存儲能力有限, 所以為了節(jié)省上鏈存儲的成本, 本系統(tǒng)設(shè)計了一種新型的結(jié)合了區(qū)塊鏈的存儲模型.通過信息的重要程度對等級的信息進(jìn)行篩選, 從而將所需的特定信息進(jìn)行加密上鏈, 將非必要信息進(jìn)行本地存儲, 從而減輕區(qū)塊所要保存的任務(wù)量.系統(tǒng)通過4個層次進(jìn)行設(shè)計[7], 具體結(jié)構(gòu)如圖1所示.
圖1 慈善系統(tǒng)模型設(shè)計圖
具體步驟如下:
(1) 搭建以太坊平臺環(huán)境, 可以正常編寫、運(yùn)行智能合約, 同時按照所需的需求來設(shè)計智能合約應(yīng)當(dāng)遵守的規(guī)則.
(2) 慈善系統(tǒng)中, 最主要的是智能合約層的設(shè)計,智能合約層主要設(shè)計了3種角色, 分別應(yīng)該具備以下能力:
受助人: 提供受助信息, 提交受助計劃, 包括所需的款項(xiàng)或者所需的物資等.
捐款人: 提供資金以及待捐贈項(xiàng)目所需的物資等,將其信息提交至監(jiān)督者, 在得到確認(rèn)的信息后, 可以得到反饋信息.
監(jiān)督者: 審核受助信息以及捐助信息, 查詢善款動態(tài).
在設(shè)計慈善系統(tǒng)的同時, 重點(diǎn)設(shè)計對于鏈上信息進(jìn)行加密保存的存儲模型.
(3)對智能合約進(jìn)行打包封裝, 通過Web3來設(shè)計系統(tǒng)的前端界面, Truffle框架實(shí)現(xiàn)前后端的交互功能.
首先根據(jù)搜索的資料以及相關(guān)方向上的一些實(shí)際的慈善系統(tǒng)的調(diào)研情況, 來總結(jié)出在慈善領(lǐng)域使用區(qū)塊鏈技術(shù)的突出優(yōu)勢, 在這些優(yōu)勢方向上加以設(shè)計, 提出創(chuàng)新, 從而將理論中的設(shè)計在現(xiàn)實(shí)中得以實(shí)現(xiàn)[8].
在設(shè)計系統(tǒng)的整體架構(gòu)上, 要趨于簡潔明了, 將系統(tǒng)按照設(shè)定的思路為其中的使用者設(shè)計為3個角色:捐款者、受助者以及監(jiān)督者.這3個模塊互相獨(dú)立, 但在某些功能上又會有相互照應(yīng)的關(guān)系, 具體代碼設(shè)計如下:
function numberOfCampaigns() public returns(uint numCampaigns){
return numCampaigns;
}
function Beneficiary(uint campaignID)view public returns(string memory bname){
return campaigns[campaignID].bname;
}
function ProjectDescription(uint campaignID)view public returns(string memory description){
return campaigns[campaignID].description;
}
function FundingGoal(uint campaignID) view public returns(uint fundingGoal){
return campaigns[campaignID].fundingGoal;
}
function NumberOfFunders(uint campaignID)view public returns(uint numFunders){
return campaigns[campaignID].numFunders;
}
function AmountRaised(uint campaignID)view public returns(uint amount){
return campaigns[campaignID].amount;
}
其中, 捐款者需要有可以捐款以及查詢屬于自己的捐款的流向動態(tài)的功能; 受助者需要有提交受助信息, 選擇受助計劃的功能; 監(jiān)督者當(dāng)然要履行監(jiān)督的職能, 需要有監(jiān)督受助信息, 同時可以監(jiān)督捐款流向的功能.所有的功能都圍繞著系統(tǒng)為上傳至系統(tǒng)內(nèi)的項(xiàng)目所分配的ID而進(jìn)行, 通過ID, 使用者可以進(jìn)行查詢、登記、增加或者修改等操作, 具體功能設(shè)計如圖2所示.
圖2 智能合約功能圖
2.2.1 合約內(nèi)角色屬性分配
慈善項(xiàng)目登記功能是這個慈善系統(tǒng)最核心的部分,其各項(xiàng)屬性信息如表1, 其內(nèi)部的每一個屬性通過登記者輸入, 或是經(jīng)過不同的計算方式錄入到系統(tǒng)中, 系統(tǒng)會自動收集當(dāng)前賬戶的地址信息, 在登記項(xiàng)目信息的時候, 會將當(dāng)前提取的使用者地址自動設(shè)置為受益地址, 當(dāng)監(jiān)督者使用合約的摧毀機(jī)制時, 會將所籌集的善款打向指定賬戶.
表1 項(xiàng)目登記合約屬性
2.2.2 功能模塊設(shè)計
(1) 受助者模塊
對于受助人來說, 受助人首先需要注冊自己的信息, 因?yàn)橐嗟纳婕暗浇M織與組織之間的聯(lián)系, 所以對于受助者模塊的設(shè)計時, 要更多的貼近針對組織的特性來進(jìn)行設(shè)計, 受助人分為很多種類, 比如針對孤寡老人、貧困學(xué)生、重病患者、留守兒童等; 這些不同的對象所要登記提交的信息有些許不同, 以后可以設(shè)計為多個入口, 從不同的入口進(jìn)行信息的登記; 同時可以設(shè)計一個閾值, 當(dāng)受助金額達(dá)到這個閾值的時候, 會將籌集到的善款轉(zhuǎn)向填寫的地址.
(2)捐助者模塊
首先, 對于捐助者來說, 這個身份可以查看所有的受助者的信息, 通過查找不同的分類, 查詢到受助者所需的金額, 以及捐助人本身的地址信息(交易地址)的登記, 同時擁有選擇是否進(jìn)行匿名捐助的功能, 捐助者當(dāng)然還要查看自己的善款的流向以及使用記錄.
(3)監(jiān)督者模塊
基于區(qū)塊鏈本身的特性, 對于鏈上的信息是不可進(jìn)行篡改的, 所以監(jiān)督者更多的監(jiān)督是對于信息的審核功能, 因?yàn)樾枰碌綄?shí)地去考察資料是否符合真實(shí)情況, 對于資料正確性的審核, 以及其本身要具有發(fā)布合約的功能, 由監(jiān)督者來判斷合約的使用期限.
以太坊平臺環(huán)境的搭建: 以太坊作為區(qū)塊鏈2.0時代最突出的代表之一, 它可以平穩(wěn)的運(yùn)行智能合約以及足夠的空間來為節(jié)點(diǎn)提供投票等功能, 使用智能合約的目的是確保系統(tǒng)在運(yùn)行中保證嚴(yán)格按照代碼所描述的功能來運(yùn)行, 而不會因?yàn)楹罄m(xù)的修改對系統(tǒng)的結(jié)果造成影響.
在慈善領(lǐng)域的數(shù)據(jù)存儲過程中, 可能會涉及到項(xiàng)目的資料過于隱私, 不方便公開, 同時要注意數(shù)據(jù)資料保存的完整性, 不能丟棄數(shù)據(jù), 會導(dǎo)致原始的存儲模式無法實(shí)現(xiàn)這樣的目的, 所以根據(jù)以上需求, 設(shè)計采用了新的數(shù)據(jù)存儲以及訪問模型[9,10], 如圖3所示.
圖3 新型存儲模型
整個數(shù)據(jù)存儲模型包含3個部分: 數(shù)據(jù)錄入, 數(shù)據(jù)還原, 鏈上存儲; 首先信息記錄者會進(jìn)入項(xiàng)目登記界面,按照項(xiàng)目需求填寫有關(guān)信息, 同時系統(tǒng)會為該項(xiàng)目生成唯一的ID, 將每一個項(xiàng)目所對應(yīng)的數(shù)據(jù)進(jìn)行加密計算, 得到屬于這個項(xiàng)目的密鑰.我們會在鏈上存儲根據(jù)加密計算得到的項(xiàng)目密鑰L, 這樣可以在不暴露登記資料的情況下, 進(jìn)行數(shù)據(jù)的鏈上存儲.在數(shù)據(jù)還原部分,我們會根據(jù)項(xiàng)目名稱查詢項(xiàng)目所對應(yīng)的密鑰L, 在得到了密鑰L之后, 根據(jù)解密算法對已加密的數(shù)據(jù)密鑰L進(jìn)行解密, 得到我們所需的數(shù)據(jù), 之后再根據(jù)計劃由解密方對上傳方進(jìn)行捐贈.
具體的步驟為:
(1)輸入數(shù)據(jù)S;
(2)對每個項(xiàng)目進(jìn)行標(biāo)記, 生成唯一的ID;
(3)對每一個輸入的數(shù)據(jù)S與ID共同進(jìn)行加密計算, 生成對應(yīng)的密鑰L:L←Encrypt(S,ID);
(4)將密鑰L和對應(yīng)的ID標(biāo)記存在鏈上;
(5)當(dāng)進(jìn)行讀取數(shù)據(jù)操作時, 首先通過項(xiàng)目名稱進(jìn)行密鑰查找:L= SearchFrom(Name);
(6)得到密鑰L后, 通過解密算法對密鑰L進(jìn)行解密, 得到所需的數(shù)據(jù)S:S←Decrypt(L);
(7)最后根據(jù)數(shù)據(jù)還原得到的項(xiàng)目ID進(jìn)行捐款等一系列操作.
系統(tǒng)采用了Web3來進(jìn)行智能合約與底層功能的交互, 主要是根據(jù)不同的功能設(shè)計了不同的頁面, 實(shí)現(xiàn)了功能和界面的鏈接交互, 構(gòu)成了完整的系統(tǒng)架構(gòu).
該系統(tǒng)基于以太坊平臺來搭建智能合約, 在Windows 10系統(tǒng)下進(jìn)行測試, 在智能合約的編寫上使用Solidity語言, 采用的Solidity v0.5.12版本, 同時使用Ganache v2.0.1可視化客戶端搭建私有鏈, 默認(rèn)將系統(tǒng)搭建在7545端口, 可以通過客戶端提供的私鑰公鑰對系統(tǒng)進(jìn)行操作測試, 首先進(jìn)行Truffle的部署, 之后再運(yùn)行程序, 通過Ganache客戶端提供的私鑰, 將賬戶導(dǎo)入到Metamask錢包中, 從而實(shí)現(xiàn)實(shí)驗(yàn)環(huán)境的搭建;
受助者首先需要在指定的頁面進(jìn)行項(xiàng)目登記, 如圖4所示, 涉及到的信息包括要登記的項(xiàng)目名稱, 項(xiàng)目的具體描述以及項(xiàng)目所要籌集的金額; 系統(tǒng)會根據(jù)當(dāng)前登錄的地址自動提取受益賬戶地址, 將發(fā)布項(xiàng)目的地址設(shè)置為最后善款發(fā)放的接收方.
圖4 項(xiàng)目登記界面
在輸入項(xiàng)目的基本信息的同時, 會為這個項(xiàng)目分配獨(dú)屬于項(xiàng)目本身的ID, 這個ID用于后續(xù)的項(xiàng)目查詢以及捐款的過程.系統(tǒng)會提取項(xiàng)目的ID以及地址信息進(jìn)行加密操作, 生成用于存放于區(qū)塊鏈網(wǎng)絡(luò)的密鑰.得到密鑰后, 會將密鑰代替項(xiàng)目信息存放于區(qū)塊鏈網(wǎng)絡(luò)中, 從而節(jié)省了區(qū)塊鏈存儲的空間, 提高了區(qū)塊的空間使用率.
當(dāng)以捐助者的身份登錄時, 可以根據(jù)已知的項(xiàng)目名稱進(jìn)行項(xiàng)目查詢, 系統(tǒng)會根據(jù)輸入的項(xiàng)目名稱, 在區(qū)塊鏈網(wǎng)絡(luò)上查找符合條件的項(xiàng)目ID, 再通過特定的數(shù)據(jù)還原算法, 將密鑰進(jìn)行解密, 從而獲得項(xiàng)目的完整信息.具體查詢界面如圖5所示.
圖5 項(xiàng)目查詢界面
其他功能界面和項(xiàng)目查詢界面類似, 分別通過項(xiàng)目ID或者項(xiàng)目所對應(yīng)的受益方地址來進(jìn)行查詢或者交易操作.
系統(tǒng)為需要隱私保護(hù)的用戶設(shè)置了專門的私密信息加密功能, 會將用戶上傳的信息設(shè)置為項(xiàng)目捐助者以及監(jiān)督者才可以查看.我們采用了Ganache客戶端通過廉價Metamask的方式模擬節(jié)點(diǎn)來發(fā)起交易, 數(shù)據(jù)查詢結(jié)果如圖6所示, 顯示了在不同權(quán)限的情況下查詢數(shù)據(jù)的結(jié)果.
圖6 數(shù)據(jù)查詢測試
為了節(jié)約在區(qū)塊上的存儲空間, 我們采用了新型存儲模型來進(jìn)行數(shù)據(jù)的存儲, 以每個區(qū)塊可以存儲2 MB數(shù)據(jù)為例, 我們測試對于小、中、大型數(shù)據(jù)規(guī)模的存儲過程中, 新型存儲模型與傳統(tǒng)存儲模型性能上的區(qū)別; 傳統(tǒng)存儲需要將所有的項(xiàng)目信息打包保存, 實(shí)現(xiàn)全部信息上鏈的存儲方式, 其中我們得到了3種規(guī)模下的信息大小: 178 B、496 B、1022 B; 而在新型存儲模型中, 我們只需要通過對特定信息的分離, 對分離出的信息進(jìn)行加密上鏈即可, 這樣得到的3種規(guī)模的數(shù)據(jù)都只需要128 B, 那么在同一區(qū)塊下的存儲數(shù)量形成了明顯的對比.
區(qū)別于傳統(tǒng)的中心化管理的慈善系統(tǒng), 采用了區(qū)塊鏈技術(shù)的新型慈善系統(tǒng)更具有可信性, 我們通過網(wǎng)上的評測與問卷的形式采集了人們對于慈善系統(tǒng)的可信程度的分析, 我們選擇了20-40歲年齡段的工作者進(jìn)行樣本采集, 在發(fā)放的1000份調(diào)查問卷中, 收到了847份有效回復(fù), 分析結(jié)果表明, 當(dāng)采用區(qū)塊鏈時的慈善系統(tǒng)可信度要遠(yuǎn)高于傳統(tǒng)的中心化管理的慈善系統(tǒng)[11],如圖7所示, 其中實(shí)虛線表示區(qū)塊鏈慈善系統(tǒng)的可信度, 輕虛線表示傳統(tǒng)慈善系統(tǒng)可信度.
圖7 可信度對比圖
在交易數(shù)據(jù)可視化的實(shí)現(xiàn)上, 我們可以通過查詢區(qū)塊上存儲的交易數(shù)據(jù)來查看屬于捐助人的款項(xiàng)的流動去向, 交易數(shù)據(jù)的查看可以通過以太坊區(qū)塊查詢網(wǎng)頁或者本地測試所使用的的Ganache進(jìn)行查詢, 其中在translation頁面中包括轉(zhuǎn)賬地址和接受地址, 以及時間信息等.
在涉及到物資捐助的時候, 系統(tǒng)設(shè)計了一套通過監(jiān)督者權(quán)限才能使用的賬本功能, 監(jiān)督者通過得到捐助和受助兩方對于捐助信息的確認(rèn)后, 將捐助者提交的有效捐助信息進(jìn)行上傳, 將物資的有關(guān)信息全部打包提交到鏈上, 后續(xù)對于物資的處理過程全部需要將信息提交到監(jiān)督者的手中, 這樣就可以記錄物資的使用情況的完整流程, 之后將上傳到鏈上的信息同步到系統(tǒng)的主頁面, 從而實(shí)現(xiàn)物資信息的可追溯和查詢的功能.
區(qū)別于具有中心化職能的慈善系統(tǒng), 基于區(qū)塊鏈的慈善系統(tǒng)更加具有公信力.首先分析了傳統(tǒng)的慈善組織或系統(tǒng)在捐款、項(xiàng)目審核以及資金流動等過程中的缺陷以及漏洞, 然后對目前區(qū)塊鏈與慈善領(lǐng)域結(jié)合的應(yīng)用研究進(jìn)行說明; 之后介紹了本系統(tǒng)在數(shù)據(jù)存儲上的創(chuàng)新, 為信息登記之后的保密性提供了可靠支持.系統(tǒng)實(shí)現(xiàn)了慈善捐款的全部流程都可以在鏈上進(jìn)行查詢和審核, 同時提供了信息的加密存儲.最后通過Ganache等測試工具驗(yàn)證了該系統(tǒng)的可行性以及信息的安全性,證明了在捐款過程中交易數(shù)據(jù)的可溯源, 可查詢, 不可篡改的特性; 以及針對用戶私密信息加密的安全性, 在讀取用戶信息時還原數(shù)據(jù)的可行性, 通過兩者實(shí)現(xiàn)了系統(tǒng)的數(shù)據(jù)可使用的循環(huán), 然后通過測試模塊的存儲性能, 驗(yàn)證了該系統(tǒng)可以在保障信息安全的同時, 增加了可存儲量, 為信息的存儲提供了更加便利的條件, 從而實(shí)現(xiàn)交易數(shù)據(jù)可溯源、信息安全有保障的慈善系統(tǒng).