于金剛, 王海汀, 趙培培, 李 姝
1(中國科學院大學, 北京 100049)
2(中國科學院 沈陽計算技術研究所, 沈陽 110168)
3(沈陽理工大學 裝備工程學院, 沈陽 110159)
如今我國的慈善事業的總體進度以及發展情況較之世界上先進國家的水平有較大的差距, 如今我們經常會在新聞中見到詐捐、貪污善款等丑聞的發生, 這樣對于慈善領域的發展可以說是一種打擊[1,2].在爆發一系列事件之后, 國內慈善事業也經歷了前所未有的信任危機.許多慈善基金會、機構在一時間流失了許多捐贈, 部分慈善人士更是選擇繞過機構, 向受助群體直接提供“一對一”幫助.雖然那些頂著“慈善”旗號的不法組織、個人最后受到了法律制裁, 但這依舊難以重拾國人對于慈善事業的信心[3].
在慈善領域公信力的問題上, 傳統的慈善組織會因為透明度不高且監管難以到位[4], 無論多么詳細的賬目報表, 都是中心化的產物, 都是(慈善)機構的一家之言, 自然缺乏信任度.這樣就導致這些組織的公信力不足, 群眾無法得知善款的具體用處, 對這些組織缺少信任.現在的捐款的主流方式是通過網上募捐, 區塊鏈作為比特幣的底層技術, 因為其具有的不可篡改和可追溯的特性而被人所知, 于是, 將區塊鏈技術應用在慈善領域, 通過網上募捐, 記錄善款的流動方向, 隨時可以查詢善款的去向, 針對應用在慈善領域的區塊鏈系統可以做到善款追蹤, 公開慈善賬目, 提升慈善組織的透明度, 提升公眾的信任感.
近年來, 國內外學者也提出了一些基于區塊鏈技術的慈善系統, 如文獻[5], 本文與傳統的基于區塊鏈的系統的區別在于, 傳統的區塊鏈系統應用主要使用的是在系統內設計專屬于系統的token或者以積分的形式供使用者使用, 并且系統要上傳到區塊鏈網絡中的內容大多會采用全部上傳的方式; 而本文所設計的慈善系統采用了具有監管職能的第三方監管機構身份——監督者, 系統會將收集到的信息自動地識別和分類, 監督者在審核通過后, 會將提取出的信息憑證上傳到區塊鏈網絡中, 從而節省出區塊的使用空間, 節約成本.
傳統的慈善系統更多的是采取本地存儲的方式,通過系統內部鏈接的數據庫進行信息的存儲, 其中涉及到的交易記錄也大多由系統的所屬方來保存, 這樣的中心化管理就不可避免的涉及到信息是否公開透明的問題, 尤其是對于交易數據來說, 捐助者無法確定自己所捐助的款項是否被使用在自己所期待的方向上,無法做到實時的監控, 可能會造成一些貪污的問題, 這些就需要用到區塊鏈交易數據可溯源、不可篡改的特性[6].
區塊鏈技術源自于比特幣的創造, 區塊鏈作為一個新興技術, 具備去中心化、防篡改、可追溯等特性,這些特性在金融領域中都具有非常突出的效果, 它可以適應多種情況下的金融交易, 同時也為金融交易提供了一個具備公信力的合理的平臺, 區塊鏈技術是開放的, 同時也是一個能高效地分配資源的技術, 為金融交易提供了新的手段, 區塊鏈技術為商業領域的快速發展, 帶來了更多的成長空間.與分布式結構相比較而言, 傳統的中心化結構有兩點比較突出的問題: 一是因為如今的交易方式會使交易雙方產生信息不對稱的問題; 二是在交易的時候難免會產生資金安全的問題.區塊鏈技術可應用于優化支付體系和構建高效安全的金融科技.其中, 根據區塊鏈技術的發展, 演化出了很多區塊鏈技術的底層平臺, 其中的以太坊平臺是最為人熟知的平臺之一, 以太坊平臺具有完備的圖靈機制, 對于實現智能合約的目的來說已經具備很成熟的環境.
對于以太坊來說, 可以看作是區塊鏈技術與智能合約的結合, 以太坊是區塊鏈2.0的產物, 以太坊對于智能合約來說具有更加成熟的環境, 可以幫助智能合約更穩定的運行.以太坊可以看作是一個為交易服務的狀態機, 他通過讀取一系列的輸入, 通過這些輸出產生一個新的狀態, 其中, 對于如何執行某種功能或者某種需要的狀態, 我們需要根據具體的要求來編寫符合規定的智能合約, 實現不可篡改可追溯的功能.
為了滿足慈善系統對數據的安全性、存儲量、不可篡改等方面的需求, 采用了區塊鏈技術與慈善相結合的方式, 滿足了數據的可追溯、不可篡改的要求, 本系統的重點放在了區塊鏈的信息存儲能力的問題上,因為區塊的存儲能力有限, 所以為了節省上鏈存儲的成本, 本系統設計了一種新型的結合了區塊鏈的存儲模型.通過信息的重要程度對等級的信息進行篩選, 從而將所需的特定信息進行加密上鏈, 將非必要信息進行本地存儲, 從而減輕區塊所要保存的任務量.系統通過4個層次進行設計[7], 具體結構如圖1所示.

圖1 慈善系統模型設計圖
具體步驟如下:
(1) 搭建以太坊平臺環境, 可以正常編寫、運行智能合約, 同時按照所需的需求來設計智能合約應當遵守的規則.
(2) 慈善系統中, 最主要的是智能合約層的設計,智能合約層主要設計了3種角色, 分別應該具備以下能力:
受助人: 提供受助信息, 提交受助計劃, 包括所需的款項或者所需的物資等.
捐款人: 提供資金以及待捐贈項目所需的物資等,將其信息提交至監督者, 在得到確認的信息后, 可以得到反饋信息.
監督者: 審核受助信息以及捐助信息, 查詢善款動態.
在設計慈善系統的同時, 重點設計對于鏈上信息進行加密保存的存儲模型.
(3)對智能合約進行打包封裝, 通過Web3來設計系統的前端界面, Truffle框架實現前后端的交互功能.
首先根據搜索的資料以及相關方向上的一些實際的慈善系統的調研情況, 來總結出在慈善領域使用區塊鏈技術的突出優勢, 在這些優勢方向上加以設計, 提出創新, 從而將理論中的設計在現實中得以實現[8].
在設計系統的整體架構上, 要趨于簡潔明了, 將系統按照設定的思路為其中的使用者設計為3個角色:捐款者、受助者以及監督者.這3個模塊互相獨立, 但在某些功能上又會有相互照應的關系, 具體代碼設計如下:
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;
}
其中, 捐款者需要有可以捐款以及查詢屬于自己的捐款的流向動態的功能; 受助者需要有提交受助信息, 選擇受助計劃的功能; 監督者當然要履行監督的職能, 需要有監督受助信息, 同時可以監督捐款流向的功能.所有的功能都圍繞著系統為上傳至系統內的項目所分配的ID而進行, 通過ID, 使用者可以進行查詢、登記、增加或者修改等操作, 具體功能設計如圖2所示.

圖2 智能合約功能圖
2.2.1 合約內角色屬性分配
慈善項目登記功能是這個慈善系統最核心的部分,其各項屬性信息如表1, 其內部的每一個屬性通過登記者輸入, 或是經過不同的計算方式錄入到系統中, 系統會自動收集當前賬戶的地址信息, 在登記項目信息的時候, 會將當前提取的使用者地址自動設置為受益地址, 當監督者使用合約的摧毀機制時, 會將所籌集的善款打向指定賬戶.

表1 項目登記合約屬性
2.2.2 功能模塊設計
(1) 受助者模塊
對于受助人來說, 受助人首先需要注冊自己的信息, 因為要更多的涉及到組織與組織之間的聯系, 所以對于受助者模塊的設計時, 要更多的貼近針對組織的特性來進行設計, 受助人分為很多種類, 比如針對孤寡老人、貧困學生、重病患者、留守兒童等; 這些不同的對象所要登記提交的信息有些許不同, 以后可以設計為多個入口, 從不同的入口進行信息的登記; 同時可以設計一個閾值, 當受助金額達到這個閾值的時候, 會將籌集到的善款轉向填寫的地址.
(2)捐助者模塊
首先, 對于捐助者來說, 這個身份可以查看所有的受助者的信息, 通過查找不同的分類, 查詢到受助者所需的金額, 以及捐助人本身的地址信息(交易地址)的登記, 同時擁有選擇是否進行匿名捐助的功能, 捐助者當然還要查看自己的善款的流向以及使用記錄.
(3)監督者模塊
基于區塊鏈本身的特性, 對于鏈上的信息是不可進行篡改的, 所以監督者更多的監督是對于信息的審核功能, 因為需要下到實地去考察資料是否符合真實情況, 對于資料正確性的審核, 以及其本身要具有發布合約的功能, 由監督者來判斷合約的使用期限.
以太坊平臺環境的搭建: 以太坊作為區塊鏈2.0時代最突出的代表之一, 它可以平穩的運行智能合約以及足夠的空間來為節點提供投票等功能, 使用智能合約的目的是確保系統在運行中保證嚴格按照代碼所描述的功能來運行, 而不會因為后續的修改對系統的結果造成影響.
在慈善領域的數據存儲過程中, 可能會涉及到項目的資料過于隱私, 不方便公開, 同時要注意數據資料保存的完整性, 不能丟棄數據, 會導致原始的存儲模式無法實現這樣的目的, 所以根據以上需求, 設計采用了新的數據存儲以及訪問模型[9,10], 如圖3所示.

圖3 新型存儲模型
整個數據存儲模型包含3個部分: 數據錄入, 數據還原, 鏈上存儲; 首先信息記錄者會進入項目登記界面,按照項目需求填寫有關信息, 同時系統會為該項目生成唯一的ID, 將每一個項目所對應的數據進行加密計算, 得到屬于這個項目的密鑰.我們會在鏈上存儲根據加密計算得到的項目密鑰L, 這樣可以在不暴露登記資料的情況下, 進行數據的鏈上存儲.在數據還原部分,我們會根據項目名稱查詢項目所對應的密鑰L, 在得到了密鑰L之后, 根據解密算法對已加密的數據密鑰L進行解密, 得到我們所需的數據, 之后再根據計劃由解密方對上傳方進行捐贈.
具體的步驟為:
(1)輸入數據S;
(2)對每個項目進行標記, 生成唯一的ID;
(3)對每一個輸入的數據S與ID共同進行加密計算, 生成對應的密鑰L:L←Encrypt(S,ID);
(4)將密鑰L和對應的ID標記存在鏈上;
(5)當進行讀取數據操作時, 首先通過項目名稱進行密鑰查找:L= SearchFrom(Name);
(6)得到密鑰L后, 通過解密算法對密鑰L進行解密, 得到所需的數據S:S←Decrypt(L);
(7)最后根據數據還原得到的項目ID進行捐款等一系列操作.
系統采用了Web3來進行智能合約與底層功能的交互, 主要是根據不同的功能設計了不同的頁面, 實現了功能和界面的鏈接交互, 構成了完整的系統架構.
該系統基于以太坊平臺來搭建智能合約, 在Windows 10系統下進行測試, 在智能合約的編寫上使用Solidity語言, 采用的Solidity v0.5.12版本, 同時使用Ganache v2.0.1可視化客戶端搭建私有鏈, 默認將系統搭建在7545端口, 可以通過客戶端提供的私鑰公鑰對系統進行操作測試, 首先進行Truffle的部署, 之后再運行程序, 通過Ganache客戶端提供的私鑰, 將賬戶導入到Metamask錢包中, 從而實現實驗環境的搭建;
受助者首先需要在指定的頁面進行項目登記, 如圖4所示, 涉及到的信息包括要登記的項目名稱, 項目的具體描述以及項目所要籌集的金額; 系統會根據當前登錄的地址自動提取受益賬戶地址, 將發布項目的地址設置為最后善款發放的接收方.

圖4 項目登記界面
在輸入項目的基本信息的同時, 會為這個項目分配獨屬于項目本身的ID, 這個ID用于后續的項目查詢以及捐款的過程.系統會提取項目的ID以及地址信息進行加密操作, 生成用于存放于區塊鏈網絡的密鑰.得到密鑰后, 會將密鑰代替項目信息存放于區塊鏈網絡中, 從而節省了區塊鏈存儲的空間, 提高了區塊的空間使用率.
當以捐助者的身份登錄時, 可以根據已知的項目名稱進行項目查詢, 系統會根據輸入的項目名稱, 在區塊鏈網絡上查找符合條件的項目ID, 再通過特定的數據還原算法, 將密鑰進行解密, 從而獲得項目的完整信息.具體查詢界面如圖5所示.

圖5 項目查詢界面
其他功能界面和項目查詢界面類似, 分別通過項目ID或者項目所對應的受益方地址來進行查詢或者交易操作.
系統為需要隱私保護的用戶設置了專門的私密信息加密功能, 會將用戶上傳的信息設置為項目捐助者以及監督者才可以查看.我們采用了Ganache客戶端通過廉價Metamask的方式模擬節點來發起交易, 數據查詢結果如圖6所示, 顯示了在不同權限的情況下查詢數據的結果.

圖6 數據查詢測試
為了節約在區塊上的存儲空間, 我們采用了新型存儲模型來進行數據的存儲, 以每個區塊可以存儲2 MB數據為例, 我們測試對于小、中、大型數據規模的存儲過程中, 新型存儲模型與傳統存儲模型性能上的區別; 傳統存儲需要將所有的項目信息打包保存, 實現全部信息上鏈的存儲方式, 其中我們得到了3種規模下的信息大小: 178 B、496 B、1022 B; 而在新型存儲模型中, 我們只需要通過對特定信息的分離, 對分離出的信息進行加密上鏈即可, 這樣得到的3種規模的數據都只需要128 B, 那么在同一區塊下的存儲數量形成了明顯的對比.
區別于傳統的中心化管理的慈善系統, 采用了區塊鏈技術的新型慈善系統更具有可信性, 我們通過網上的評測與問卷的形式采集了人們對于慈善系統的可信程度的分析, 我們選擇了20-40歲年齡段的工作者進行樣本采集, 在發放的1000份調查問卷中, 收到了847份有效回復, 分析結果表明, 當采用區塊鏈時的慈善系統可信度要遠高于傳統的中心化管理的慈善系統[11],如圖7所示, 其中實虛線表示區塊鏈慈善系統的可信度, 輕虛線表示傳統慈善系統可信度.

圖7 可信度對比圖
在交易數據可視化的實現上, 我們可以通過查詢區塊上存儲的交易數據來查看屬于捐助人的款項的流動去向, 交易數據的查看可以通過以太坊區塊查詢網頁或者本地測試所使用的的Ganache進行查詢, 其中在translation頁面中包括轉賬地址和接受地址, 以及時間信息等.
在涉及到物資捐助的時候, 系統設計了一套通過監督者權限才能使用的賬本功能, 監督者通過得到捐助和受助兩方對于捐助信息的確認后, 將捐助者提交的有效捐助信息進行上傳, 將物資的有關信息全部打包提交到鏈上, 后續對于物資的處理過程全部需要將信息提交到監督者的手中, 這樣就可以記錄物資的使用情況的完整流程, 之后將上傳到鏈上的信息同步到系統的主頁面, 從而實現物資信息的可追溯和查詢的功能.
區別于具有中心化職能的慈善系統, 基于區塊鏈的慈善系統更加具有公信力.首先分析了傳統的慈善組織或系統在捐款、項目審核以及資金流動等過程中的缺陷以及漏洞, 然后對目前區塊鏈與慈善領域結合的應用研究進行說明; 之后介紹了本系統在數據存儲上的創新, 為信息登記之后的保密性提供了可靠支持.系統實現了慈善捐款的全部流程都可以在鏈上進行查詢和審核, 同時提供了信息的加密存儲.最后通過Ganache等測試工具驗證了該系統的可行性以及信息的安全性,證明了在捐款過程中交易數據的可溯源, 可查詢, 不可篡改的特性; 以及針對用戶私密信息加密的安全性, 在讀取用戶信息時還原數據的可行性, 通過兩者實現了系統的數據可使用的循環, 然后通過測試模塊的存儲性能, 驗證了該系統可以在保障信息安全的同時, 增加了可存儲量, 為信息的存儲提供了更加便利的條件, 從而實現交易數據可溯源、信息安全有保障的慈善系統.