張小雪 陸萍
摘要:眾籌是一種面向大眾籌集資金的方式。眾籌能夠幫助有創(chuàng)意、有潛力的項(xiàng)目解決資金的短缺,從而獲得項(xiàng)目的成功。而傳統(tǒng)的眾籌過程缺乏透明度,信度無法保證。區(qū)塊鏈技術(shù)具有去中心化、公開透明、數(shù)據(jù)可溯源等特點(diǎn),現(xiàn)已被逐步用于公信度要求較高的相關(guān)行業(yè)。本論述基于區(qū)塊鏈技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了眾籌系統(tǒng)。系統(tǒng)采用Solidity語言編寫了眾籌智能合約,搭建了以太坊私有鏈,并將智能合約部署到了以太坊私鏈上。眾籌系統(tǒng)主要采用基于MVC的軟件技術(shù)架構(gòu),為了加強(qiáng)系統(tǒng)間的交互性,軟件開發(fā)過程中還采用了Ajax技術(shù)。本項(xiàng)目實(shí)現(xiàn)了眾籌平臺中眾籌標(biāo)的發(fā)布與集資等眾籌環(huán)節(jié)的主要功能,保障了眾籌的透明、公正。
關(guān)鍵詞:眾籌系統(tǒng);智能合約;以太坊;私有鏈
中圖分類號:F233文獻(xiàn)標(biāo)志碼:A
0引言
眾籌(crowd funding)是一種由發(fā)起者面向大眾籌集資金的方式。由于眾籌平臺能夠有效地幫助投資人和項(xiàng)目發(fā)起人實(shí)現(xiàn)對接,加速雙方的合作,近年來涌現(xiàn)了大量的第三方眾籌平臺。利用互聯(lián)網(wǎng)的傳播特性,2017年在眾籌平臺上成功實(shí)現(xiàn)眾籌的項(xiàng)目數(shù)達(dá)到了69637項(xiàng),融資總額累計(jì)260億元,成為“互聯(lián)網(wǎng)+金融”的典型代表。但是從《中國眾籌行業(yè)發(fā)展報(bào)告2018》的數(shù)據(jù)來看,國內(nèi)眾籌平臺數(shù)量正在急劇下降,只有少數(shù)平臺不僅經(jīng)營良好,而且開始快速擴(kuò)張,市場占有率也在急速上升。這背后的原因主要在于各平臺在實(shí)施中心化融資的過程中,難以保證每個參與者的行為誠信度,資金在使用過程中會存在不透明和信息不對稱的現(xiàn)象,也就是說傳統(tǒng)的眾籌無法做到整個眾籌流程的透明化。另一方面,當(dāng)前眾籌平臺中所有用戶的資金以及數(shù)據(jù)都由第三方在中心化的系統(tǒng)中統(tǒng)一管理。由于所有用戶數(shù)據(jù)都直接向第三方開放,可能存在有不良第三方盜用甚至篡改用戶數(shù)據(jù)的行為。
區(qū)塊鏈技術(shù)是解決眾籌平臺中信息不透明與數(shù)據(jù)溯源問題的一個有效途徑。它具有去中心化、公開透明和可追溯等優(yōu)點(diǎn),現(xiàn)已在金融、房產(chǎn)、醫(yī)療和智慧城市等多個領(lǐng)域中得到廣泛應(yīng)用。區(qū)塊鏈技術(shù)的分布式記賬模型以及數(shù)據(jù)公開透明能夠有效地彌補(bǔ)傳統(tǒng)眾籌遇到的困境。在眾籌平臺中引入?yún)^(qū)塊鏈技術(shù)不僅可以保證各個環(huán)節(jié)的信息透明度,還可以在眾籌失敗或者項(xiàng)目違約時,投資者的資金可以第一時間內(nèi)退回。
1技術(shù)基礎(chǔ)
1.1區(qū)塊鏈技術(shù)和以太坊
區(qū)塊鏈技術(shù)是作為比特幣的底層技術(shù)出現(xiàn)的一個分布式的架構(gòu)。區(qū)塊鏈架構(gòu)中的每個分布式節(jié)點(diǎn)都可以執(zhí)行并記錄每一筆交易,交易每隔一段時間會被打包進(jìn)一個區(qū)塊。每一個區(qū)塊都按照數(shù)學(xué)公式來保證自己插入?yún)^(qū)塊鏈賬本的唯一陛。
以太坊是可編程的區(qū)塊鏈,它也具有一個點(diǎn)對點(diǎn)網(wǎng)絡(luò)協(xié)議,以太坊區(qū)塊鏈數(shù)據(jù)庫是由連接到網(wǎng)絡(luò)的節(jié)點(diǎn)一起來維護(hù)和更新的。但是和其他區(qū)塊鏈不同的是,以太坊允許用戶在圖靈完備的以太坊虛擬機(jī)上靈活地、按照自己的意愿來創(chuàng)建并執(zhí)行相關(guān)操作。
1.2智能合約
智能合約自帶了區(qū)塊鏈上所有節(jié)點(diǎn)一起執(zhí)行的邏輯代碼,智能合約的執(zhí)行通常局限于一個確定性的上下文中(如:基于相同的輸人、賬本狀態(tài)、運(yùn)行時環(huán)境等)。當(dāng)前最為流行的區(qū)塊鏈智能合約就是以太坊。以太坊智能合約發(fā)送并接收加密貨幣即以太幣,合約被包含在交易中執(zhí)行,由以太坊客戶或其他合約簽署。
在本論述基于以太坊的眾籌系統(tǒng)中,智能合約采用了Solidity語言編寫,并在智能合約在線編譯網(wǎng)站Remix上完成編譯。編譯完成后,進(jìn)一步將編譯好的二進(jìn)制形式的合約通過web3.is進(jìn)行部署。調(diào)用智能合約通過JavaScfipt來完成,其過程為首先將請求發(fā)送到web3.is,通過遠(yuǎn)程過程調(diào)用(Remote Procedure Call,RPC)的方式將數(shù)據(jù)或請求傳遞給區(qū)塊鏈上的智能合約,實(shí)現(xiàn)對區(qū)塊鏈上數(shù)據(jù)的讀取或?qū)懭搿?/p>
1.3web框架
系統(tǒng)后臺使用流行的Java語言作為編程語言,采用MVC(Model View Controller)框架作為后臺框架,使得系統(tǒng)具有高度解耦和易擴(kuò)展的特點(diǎn)。其中模型對象(Model)分為眾籌和眾籌記錄兩個對象??刂破鳎╟on-troller)負(fù)責(zé)讀取、調(diào)用部署在區(qū)塊鏈上智能合約的數(shù)據(jù)和函數(shù)。視圖(view)對應(yīng)于應(yīng)用程序中數(shù)據(jù)的展示,并基于Aiax進(jìn)行web開發(fā)。
2以太坊底層搭建
以太坊私有鏈的創(chuàng)建以及智能合約的部署是眾籌系統(tǒng)的底層基礎(chǔ),主要包含有以下的步驟。
Stepl:通過執(zhí)行g(shù)eth-datadir chaindata init gene-sis.json來初始化創(chuàng)世區(qū)塊。
Step2:啟動geth,進(jìn)入控制臺。由于在初始化創(chuàng)世區(qū)塊中指定了geth的數(shù)據(jù)目錄為chaindata,若要進(jìn)一步開啟“admin,web3,eth,personal,miner,net”這些api,指定本地為rpc服務(wù)器地址,服務(wù)端口(如8545),需要執(zhí)行如下的命令。
geth-datadir chaindata-rpc-rpcapi”admin.web3,eth,personal,miner,net”-rpcaddr 127.0.0.1-rpc-port 8545consde
Step3:通過執(zhí)行:personal.newAccount()來創(chuàng)建賬戶1,運(yùn)行之后提示輸入Passphase,即輸入賬戶密碼。
以上步驟執(zhí)行至少兩次,保證至少生成兩個挖礦賬戶。
Step4:通過執(zhí)行eth.accounts來查看上一步驟是否正確生成了賬戶。
Step5:通過執(zhí)行eth.getBalance(賬戶名)或者eth.getBalance(eth.accounts[n])來查看參數(shù)賬戶的余額(n為賬戶序號)。
Step6:通過執(zhí)行eth.coinbase()來查看挖礦進(jìn)賬用戶,默認(rèn)情況下coinbase是本地賬戶中的第一個賬戶。通過miner.setEtherbase(eth.accounts[n])設(shè)置挖礦用戶。
Step7:運(yùn)行miner.start()開始挖礦,若需要停止挖礦,可以執(zhí)行miner.stop()。
Step8:轉(zhuǎn)賬。如在單機(jī)上運(yùn)行需要開啟新的窗口鏈接到當(dāng)前窗口,如在Windows中,需要輸入命令:gethattach ipc:\\./pip&geth.ipc。然后在attach窗口執(zhí)行賬戶解鎖命令:personal.unlockAccount(eth.accounts[0])。最后進(jìn)行轉(zhuǎn)賬,輸人命令:eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(10)})。
Step9:通過運(yùn)行txpool.status來查看轉(zhuǎn)賬狀態(tài)。
在完成上述步驟后,即創(chuàng)建了一條以太坊的私有鏈,而且生成了多個賬戶并實(shí)現(xiàn)相互間的轉(zhuǎn)賬,進(jìn)一步即可在該私有鏈上部署智能合約。
3系統(tǒng)設(shè)計(jì)
3.1
智能合約的solidity實(shí)現(xiàn)
在智能合約campaign中設(shè)計(jì)了兩個結(jié)構(gòu)體:眾籌項(xiàng)目CrowdFund和捐贈記錄CrowdRecord,結(jié)構(gòu)體中屬性定義以及合約的成員函數(shù)簡介見表1所列。
3.2眾籌平臺的設(shè)計(jì)
本項(xiàng)目在區(qū)塊鏈上創(chuàng)建眾籌智能合約,尋求在以太坊上投資方的資金支持實(shí)現(xiàn)眾籌。在完成眾籌智能合約的solidity編碼后,進(jìn)一步設(shè)計(jì)如圖1所示的基于MVC的眾籌平臺web架構(gòu)。
(1)Model層。系統(tǒng)的模型層主要包含有兩個對象:眾籌項(xiàng)目CrowdFund、眾籌記錄CrowdRecord,分別對應(yīng)智能合約的兩個結(jié)構(gòu)體struct CrowdFund和structCrowdRecord。類CrowdFund主要包含的數(shù)據(jù)屬性有項(xiàng)目編號、眾籌發(fā)起者地址、眾籌目標(biāo)值、眾籌信息、目前已眾籌到的數(shù)額、眾籌結(jié)束標(biāo)志。類CrowdFund中的數(shù)據(jù)屬性則主要包含了投資人信息、投資數(shù)額、投資時間。
(2)View層。視圖層主要負(fù)責(zé)向用戶展示界面。本系統(tǒng)采用Ajax技術(shù)來加強(qiáng)系統(tǒng)的交互能力,并提高了系統(tǒng)頁面與用戶之間的響應(yīng)速度。
(3)Controller層。根據(jù)眾籌的實(shí)際過程,Controller層中的CrowdController類主要包含4個方法。這些方法的參數(shù)為類HttpServletRequest和類HttpServletRe-sponse的類對象。Controller層中的方法又分別調(diào)用眾籌系統(tǒng)Service層中具體實(shí)現(xiàn)類CrowdImpl的各個對應(yīng)方法。
3.3智能合約部署
在部署智能合約時,可以在合約在線編譯網(wǎng)站(http://remix.ethereum.org)上傳本地的眾籌合約代碼,選擇合適的編譯器的版本進(jìn)行編譯。若代碼正確,可以在編譯成功后獲得二進(jìn)制的合約代碼進(jìn)行部署,即選擇Remix提供的WEB3DEPLOY內(nèi)容用于本地部署。在保證本地私有鏈的帳戶處于挖礦狀態(tài)的前提下,執(zhí)行personal.unlockAccount(eth.accounts[0])并輸入賬戶對應(yīng)密碼以解鎖賬戶。將合約的二進(jìn)制代碼粘貼到命令行窗口,回車后等待挖礦將這個交易打包到區(qū)塊中。當(dāng)終端生成合約的地址后,即實(shí)現(xiàn)了合約在區(qū)塊鏈中的部署。
4結(jié)語和展望
區(qū)塊鏈技術(shù)的出現(xiàn),為眾籌行業(yè)的發(fā)展提供了一個透明公開的技術(shù)平臺。本論述實(shí)現(xiàn)了一個基于以太坊區(qū)塊鏈的眾籌平臺,實(shí)現(xiàn)了眾籌標(biāo)的的發(fā)布和集資。在系統(tǒng)架構(gòu)上,項(xiàng)目的設(shè)計(jì)采用了MVC架構(gòu),實(shí)現(xiàn)了眾籌系統(tǒng)的分層開發(fā),提高了代碼的復(fù)用性。下一步我們將擴(kuò)展系統(tǒng)的功能,例如,加入眾籌成功后對各投資者的分成功能。