王文明, 施重陽, 達(dá)斯坦·扎尼別克
(北京理工大學(xué) 計算機(jī)學(xué)院, 北京 100081)
實驗教學(xué)是培養(yǎng)學(xué)生實踐能力、創(chuàng)新思維的重要環(huán)節(jié),是人才培養(yǎng)體系的重要組成部分[1]。能否設(shè)計出好的實驗方案成為廣大一線教師的研究課題。近年來,新技術(shù)不斷涌現(xiàn),在眾多新技術(shù)中,一項火爆的技術(shù)闖進(jìn)我們的視野,這就是區(qū)塊鏈技術(shù)[2]。區(qū)塊鏈技術(shù)應(yīng)該從兩個方面看,一是區(qū)塊鏈技術(shù)確實具有一定顛覆性能力,會在未來的應(yīng)用中大放異彩,并且目前得到了世界各國的普遍重視,紛紛開始了技術(shù)及應(yīng)用研究,其標(biāo)準(zhǔn)也在研究和制定過程中;二是區(qū)塊鏈技術(shù)不是萬能的,它在具備和提供安全的同時,仍然受到安全的挑戰(zhàn),安全性研究仍然是長久的主題,不可忽視。
所謂區(qū)塊鏈技術(shù),簡稱BT(blockchain technology),也被稱之為分布式賬本技術(shù),是一種互聯(lián)網(wǎng)數(shù)據(jù)庫技術(shù),其特點(diǎn)是去中心化、公開透明,讓每個人均可參與數(shù)據(jù)庫記錄。最早是比特幣的基礎(chǔ)技術(shù),目前世界各地均在研究,可廣泛應(yīng)用于金融等各領(lǐng)域。從2008 年的“比特幣白皮書”中出現(xiàn)的區(qū)塊鏈概念,并在2009 年開發(fā)出的第一個區(qū)塊“創(chuàng)世區(qū)塊”(genesis block)開始,區(qū)塊鏈與價值互聯(lián)網(wǎng)的歷史也從此展開,并且迅速得到發(fā)展[3]。
隨著區(qū)塊鏈技術(shù)的發(fā)展,人才需求也與日俱增,甚至出現(xiàn)區(qū)塊鏈人才缺乏的現(xiàn)象,人才需求主要集中在新技術(shù)GO語言開發(fā)(例如Web開發(fā)、微服務(wù)、分布式等)和新領(lǐng)域區(qū)塊鏈開發(fā)(例如密碼學(xué)安全、區(qū)塊鏈系統(tǒng)、區(qū)塊鏈應(yīng)用等)。
本文的目的在于為高等院校區(qū)塊鏈相關(guān)課程提供實驗教學(xué)方案和手段,同時也為相關(guān)項目、相關(guān)研究提供方法和案例。目前,從以太坊平臺應(yīng)用角度來看,比特幣應(yīng)用屬于區(qū)塊鏈1.0,以太坊智能合約設(shè)計屬于區(qū)塊鏈2.0,行業(yè)應(yīng)用(聯(lián)盟鏈/私有鏈搭建原理)屬于區(qū)塊鏈3.0。
本文以最具代表性的以太坊區(qū)塊鏈技術(shù)[3-4]為例,提出一個基于區(qū)塊鏈智能合約的“眾籌平臺”,講解平臺的設(shè)計及構(gòu)造方法,以該平臺為實驗教學(xué)平臺,介紹該平臺上如何部署智能合約,并進(jìn)行智能合約實驗。
維基百科(Wikipedia)給出的區(qū)塊鏈定義是:用分布式數(shù)據(jù)庫識別、傳播和記載信息的智能化對等網(wǎng)絡(luò),也稱為價值互聯(lián)網(wǎng)。一種普遍的觀點(diǎn)認(rèn)為,區(qū)塊鏈技術(shù)是下一代云計算的雛形,有望像互聯(lián)網(wǎng)一樣徹底重塑人類社會活動形態(tài),并實現(xiàn)從目前的信息互聯(lián)網(wǎng)向價值互聯(lián)網(wǎng)的轉(zhuǎn)變[5]。
區(qū)塊鏈的安全性是通過分散服務(wù)器提供的,該服務(wù)器提供時間戳和點(diǎn)對點(diǎn)網(wǎng)絡(luò)連接,其結(jié)果就形成了一個數(shù)據(jù)庫,這個數(shù)據(jù)庫是自主管理的,沒有一個統(tǒng)一的中心。區(qū)塊鏈技術(shù)的出現(xiàn),使缺乏信任機(jī)制的項目有了可行的實現(xiàn)機(jī)會。例如,互聯(lián)網(wǎng)的發(fā)展帶動了眾籌業(yè)的發(fā)展,傳統(tǒng)的“眾籌”平臺存在潛在的信任危機(jī)與誠信問題, 還要依靠第三方(銀行等),而基于以太坊區(qū)塊鏈的“眾籌”平臺可以用智能合約來解決這些問題。
區(qū)塊鏈?zhǔn)且环N賬本數(shù)據(jù)存儲方式,是以多份拷貝形式存在于點(diǎn)對點(diǎn)網(wǎng)絡(luò)上的只可以追加的總賬數(shù)據(jù)庫。當(dāng)前,國內(nèi)外各類金融機(jī)構(gòu)已經(jīng)紛紛在嘗試應(yīng)用區(qū)塊鏈技術(shù)來構(gòu)建或優(yōu)化現(xiàn)有的金融基礎(chǔ)設(shè)施,進(jìn)而改造現(xiàn)有業(yè)務(wù)。但是,基于區(qū)塊鏈技術(shù)的“眾籌平臺”及其活動暫時還未出現(xiàn),該項內(nèi)容在國內(nèi)外業(yè)缺少研究。
本實驗平臺設(shè)計,可以讓用戶用瀏覽器使用以太坊區(qū)塊鏈中的“眾籌”智能合約(區(qū)塊鏈上運(yùn)行的程序),讓用戶尋找投資或者用戶本人投資一些項目,利用智能合約保證投資方投資以太幣的安全性。尋找投資的用戶每次得到投資之前應(yīng)該發(fā)送請求,投資人大部分同意之后交易才能實現(xiàn),否則取消交易。本文認(rèn)為區(qū)塊鏈?zhǔn)莿討B(tài)的、活動的、運(yùn)動的,均是程序的動態(tài)體現(xiàn),在該實驗平臺上可以利用以太坊智能合約技術(shù),創(chuàng)建諸如活動、運(yùn)動、方案、計劃等類型的項目,例如投票活動、競選運(yùn)動等。
(1) 賬戶。每個賬戶都有一個與之相關(guān)的狀態(tài)和一個 20 字節(jié)的地址。 以太坊中的地址是用于識別賬戶的 160 位標(biāo)識符。
(2) 費(fèi)用。在以太坊區(qū)塊鏈上發(fā)生的每個交易(一次計算)都會產(chǎn)生費(fèi)用,該筆費(fèi)用Gas表示,它用于衡量特定計算所需費(fèi)用的單位。 Gas 的價格就是花費(fèi)在每個Gas上的ether數(shù)量,用Gwei來衡量。wei是以太幣的最小單位 1018wei=1 ether,1 kwei=103wei,1Mwei=106wei,1Gwei=109wei, 1 ether = 109Gwei=1018wei,每次交易時,發(fā)送人都會設(shè)置 gasLimit 和 gasPrice, gasPrice 和 gasLimit的乘積表示發(fā)送人愿意為執(zhí)行交易支付的wei的最大金額。
(3) 交易。以太坊是以交易為基礎(chǔ)的區(qū)塊鏈技術(shù)。以太坊有兩種交易:發(fā)送消息,創(chuàng)建智能合約。
(4) 區(qū)塊。將交易組合在一起成為區(qū)塊。區(qū)塊鏈包含一系列鏈接在一起的此類區(qū)塊。
(5) 智能合約。智能合約是一種運(yùn)行于區(qū)塊鏈上的計算機(jī)算法,旨在總結(jié)與維護(hù)在區(qū)塊鏈上自執(zhí)行的合約。這種智能合約用代碼實現(xiàn),在區(qū)塊鏈的分布式注冊表中存在,由計算機(jī)網(wǎng)絡(luò)支持與管理。簡而言之,智能合約允許用戶在不借助中間人服務(wù)的情況下交換資產(chǎn)。也就是說,智能合約是用程序語言編寫的商業(yè)合約,在約定條件滿足時,能夠自動強(qiáng)制地執(zhí)行合同條款,實現(xiàn)“代碼即法律”的目標(biāo)。區(qū)塊鏈的去中心化使得智能合約在沒有中心管理者參與的情況下,可同時運(yùn)行在全網(wǎng)所有節(jié)點(diǎn),任何機(jī)構(gòu)和個人都無法將其強(qiáng)行停止[6]。
以太坊自定義了Solidity等腳本語言用以編寫智能合約,并在智能合約內(nèi)置了Address數(shù)據(jù)類型,用來表示“賬戶地址”。以太坊智能合約在執(zhí)行時,會根據(jù)占用的CPU 和內(nèi)存情況消耗Gas(由以太幣兌換獲得),一旦Gas耗盡,合約就會終止執(zhí)行,消耗掉的費(fèi)用不會退回,從而防范了垃圾交易或含有死循環(huán)的智能合約。
本實驗的智能合約采用Solidity[7]編程語言編寫。
對于普通用戶來說,編寫和使用智能合約是件不容易的事情,因此本文著重設(shè)計了客戶端,以便普通客戶根據(jù)自己的實際需求編寫和使用智能合約,該實驗平臺代碼結(jié)構(gòu)如圖1所示。
圖1 平臺結(jié)構(gòu)圖
圖1中的ethereum是本文設(shè)計的智能合約模塊。其中,運(yùn)行環(huán)境為Apple MacBook Pro(2017),2.9 GHz Intel Core i7,16 GB 內(nèi)存和操作系統(tǒng)為 mac OS High Sierra。開發(fā)環(huán)境為Visual Studio26 Code v1.23.1.智能合約編程語言為Solidity,采用JavaScript(ES2015, React(JSX前端)), HTML, SCSS,Node.js,Next.JS等。
普通用戶可以按照ethereum模塊結(jié)構(gòu)撰寫自己的智能合約,以便簡化合約的設(shè)計過程。ethereum是平臺的核心模塊,ethereum文件夾中文件見表1。
表1 ethereum文件夾中的文件
圖1中Components和pages文件夾構(gòu)成平臺的界面模塊,Routes.js用于網(wǎng)站路由設(shè)置,Server.js用于網(wǎng)站的服務(wù)器設(shè)置。
平臺前端采用JavaScript語言實現(xiàn),后端采用Node.js語言實現(xiàn)。Node.js 采用C++語言編寫而成,它使用了Google的一個非??焖俚腏avaScript引擎,即V8引擎[8]。
本設(shè)計方案的系統(tǒng)模型由以下幾個部分組成: 發(fā)起人/創(chuàng)意人, 投資人, 供應(yīng)商, 智能合約。整體結(jié)構(gòu)非常簡單,不需要任何第三方服務(wù)或平臺介入,如圖2所示。
圖2 平臺智能合約的工作模式
步驟1: 發(fā)起人創(chuàng)建項目,并且指定最小投資余額,以“wei”為單位。
步驟2: 投資人能夠瀏覽平臺所有的項目。
步驟3: 投資人選擇一個項目,可以看到項目發(fā)起人的以太坊區(qū)塊鏈的賬號地址,發(fā)起人設(shè)置的最小投資金額,所有項目發(fā)起方的以太幣請求(即發(fā)起人向所有投資人發(fā)出資金請求的公告,即從智能合約中獲得以太幣用于項目開發(fā)),發(fā)起人可以看到投資人數(shù)量和本項目已籌集的以太幣數(shù)目。
步驟4: 投資方設(shè)定投資金額,然后單擊“確認(rèn)”按鈕進(jìn)行投資。
步驟5: 如果用戶屬于一個項目的投資方,除了查看項目的基本信息與眾籌進(jìn)展外,還可以查看發(fā)起人在這個項目上的所有以太幣請求。
步驟6: 項目發(fā)起人發(fā)送以太幣的花費(fèi)請求,投資方如果同意請求,可以按“批準(zhǔn)”按鈕,默認(rèn)或者批準(zhǔn)則視為不同意。
步驟7: 如果有75%以上(事先約定)的投資方批準(zhǔn)了請求,智能合約將自動把發(fā)起人請求的以太幣數(shù)目發(fā)送給指定的地址。
目前,區(qū)塊鏈智能合約的形式大致分為3類,一是以太坊方式[9-10],二是Hyperledger方式[11],三是Codius方式[12]。本文采用以太坊區(qū)塊鏈智能合約的方式。創(chuàng)建項目的過程即是產(chǎn)生合約的過程,如圖3所示。
圖3 項目產(chǎn)生智能合約
本實驗在眾籌平臺上撰寫智能合約,即在以太坊區(qū)塊鏈上創(chuàng)建項目,尋求投資,投資方對項目進(jìn)行投資,項目發(fā)起方向投資方提出資金花費(fèi)請求。具體過程如下:
(1) CreateCampaign(minium_ether, creator_address):在以太坊區(qū)塊鏈上創(chuàng)建項目,輸入為最小的投資金額和發(fā)起者的地址。
(2) Contribute(ether_amount):投資者對項目進(jìn)行投資,數(shù)額為 ether_amount。
(3) CreateRequest(description, value, recipient_address):項目發(fā)起方向所有投資方請求花費(fèi)以太幣。輸入 description 為字符串類型,是對請求的描述;value 為請求花費(fèi)的以太幣數(shù)額; recipient_address 為以太幣的接收地址。
(4) ApproveRequest(index):投資者對發(fā)起方請求的確認(rèn),同意或不同意。輸入 index 為給定請求在數(shù)組(包括所有數(shù)組)中的索引。
(5) FinalizeRequest(index):對給定請求的最終裁定。假設(shè)發(fā)起方請求通過的條件為“大于75%”的投資者同意,那么當(dāng)條件滿足時,則請求被滿足。
智能合約一般包括以下內(nèi)容:交易(Transaction) 處理,保存機(jī)制,一個完備的狀態(tài)機(jī)用于接收和處理各種智能合約,事務(wù)保存和狀態(tài)處理則在區(qū)塊鏈上完成[13-15]。
為了安全起見,以太坊智能合約不是直接運(yùn)行在節(jié)點(diǎn)上,而是運(yùn)行于沙盒(以太坊虛擬機(jī))中。合約存儲在以太坊的區(qū)塊鏈上,并被編譯為以太坊虛擬機(jī)字節(jié)碼,通過虛擬機(jī)來運(yùn)行[16]。
在終端打開ethereum文件夾,在終端命令行輸入node compile.js命令,編譯Solidity語言編寫的智能合約,這時會自動生成build 文件夾,里面便是剛剛編譯過的智能合約;然后同樣在終端,在ethereum文件夾下運(yùn)行node deploy.js命令,通過web3、infura、truffle-hdwallet-provider編譯過智能合約的bytecode提交到Rinkeby測試網(wǎng)。
ethereum文件夾里面的factory.js與campaign.js 文件讓前端或者后端部分通過它們聯(lián)系智能合約。ethereum文件夾里的web3.js文件的作用是包如果將來使用的用戶沒有安裝Metamask的情況下,通過使用infura與以太坊區(qū)塊鏈溝通。
系統(tǒng)運(yùn)行主要測試以下內(nèi)容:
(1) 用戶能夠瀏覽已經(jīng)創(chuàng)建在區(qū)塊鏈上的項目(活動,運(yùn)動,計劃,專題等),如圖4所示。
圖4 眾籌平臺首頁
從圖4中可以看出,頁面列出了已經(jīng)創(chuàng)建在以太坊區(qū)塊鏈上的項目,每一個項目對應(yīng)一串字母與數(shù)字構(gòu)成的字符串,該字符串代表項目在以太坊區(qū)塊鏈的地址。例如,單擊最后一條地址(最后一個項目),頁面如圖5所示。
圖5 項目詳情頁面
其中Address of Manager“ 0xF83b0b20E……” 代表本項目的發(fā)起方在區(qū)塊鏈中的地址; Minimum Contribution (wei) 代表本項目的最低投資金額,本例為1000 wei; Number of requests 代表本項目發(fā)起人對投資金額發(fā)起的消費(fèi)請求,如發(fā)起人想要用 1 ETH 去購買項目中需要用到的某件物品,它需要發(fā)起一個請求,并等待投資人回應(yīng); Number of Approvers 代表已經(jīng)有多少投資方對本項目進(jìn)行了投資; Campaign balance (ether) 代表本項目已經(jīng)籌集的金額,單位為 ether。
(2) 用戶是否能順利創(chuàng)建項目(活動,運(yùn)動,計劃、專題)等。單擊圖4 中所示的 “Create Campaign”按鈕,將得到圖6 所示頁面。
圖6 創(chuàng)建活動頁面
圖6 為創(chuàng)建活動頁面,需要設(shè)置一個最小投資金額,單位為“wei”。在本例中,我們設(shè)置金額為 1000 wei。單擊“創(chuàng)建”按鈕后, Metamask 會彈出如圖 7 所示頁面??梢钥吹紾as Price為1 Gwei,這代表確認(rèn)交易(即提交項目到區(qū)塊鏈)的費(fèi)用。在圖 7 Metamask 交易確認(rèn)頁面單擊 “SUBMIT”按鈕后,項目就創(chuàng)建成功。用戶可以在平臺首頁看到新創(chuàng)建的項目。
Metamask是瀏覽器的擴(kuò)展程序,它允許用戶在瀏覽器中運(yùn)行以太坊的分散式應(yīng)用,而無需運(yùn)行完整的以太坊節(jié)點(diǎn),該擴(kuò)展將以太坊Web3.0 API注入到每個網(wǎng)站的JavaScript上下文中,以便分散式應(yīng)用可以從區(qū)塊鏈中讀取。Metamask還允許用戶創(chuàng)建和管理自己的身份,所以當(dāng)分散式應(yīng)用想要執(zhí)行交易并寫入?yún)^(qū)塊鏈時,用戶可以在批準(zhǔn)或拒絕交易之前獲得安全的界面來審查交易。
圖7 Metamask 交易確認(rèn)頁面
(3) 用戶是否能夠?qū)霞s進(jìn)行投資。在項目詳情頁面,用戶可以設(shè)置投資金額,本例中設(shè)置金額為 1 ether ,單擊“投資”按鈕后,合約確認(rèn)投資金額大于設(shè)定的最小投資金額,并且確認(rèn) Metamask 的交易提交之后,投資就正式創(chuàng)建。圖8為投資項目頁面。
圖8 投資項目頁面
(4) 發(fā)起人對項目的請求進(jìn)行處理,包括查看請求、發(fā)起請求以及請求處理。在項目的詳情頁面,可以單擊“ View Request”按鈕來查看本項目的請求信息,如圖9所示。
圖9 項目請求頁面
發(fā)起人對項目發(fā)起了一個花費(fèi)請求,需要使用0.5 ether 購買電腦,其中, 0.5 ether 需要匯款至地址為“0xa87387f58……”的用戶。如果用戶是此項目的投資者,即可以單擊“批準(zhǔn)”按鈕允許此請求,如果不是此項目的投資者,則不允許點(diǎn)擊“批準(zhǔn)”按鈕。當(dāng)批準(zhǔn)計數(shù)大于總數(shù)的75&時(事先約定),不管是投資人還是發(fā)起人都可以單擊“最終確定 Finalize”按鈕,即此請求已經(jīng)通過,使得大多數(shù)投資者的意見可以順利執(zhí)行。
發(fā)起人的創(chuàng)建請求頁面如圖10所示,請求創(chuàng)建內(nèi)容包括請求敘述、請求以太幣數(shù)額、以太幣接收者地址3個欄目,如果有特定需要,可以增加創(chuàng)建內(nèi)容。
圖10 創(chuàng)建請求頁面
至此,實驗測試圓滿結(jié)束,從頭至尾展示了實驗平臺的使用過程以及智能合約的部署和使用方法。
在現(xiàn)實生活中,眾籌活動以及基于互聯(lián)網(wǎng)的眾籌形式很多,但基于以太坊區(qū)塊鏈智能合約技術(shù)的眾籌活動還是個新話題,是個發(fā)展方向,隨著區(qū)塊鏈技術(shù)以及智能合約的發(fā)展,勢必在眾籌活動中得到實際應(yīng)用。
本文以眾籌活動為例,完成了實驗平臺設(shè)計,演示了智能合約實驗,旨在提供一種基于區(qū)塊鏈技術(shù)的實驗設(shè)計思路,為區(qū)塊鏈技術(shù)實驗課程提供支持,為“雙一流”高校實驗教學(xué)體系建設(shè)以及區(qū)塊鏈相關(guān)研究項目提供一種實驗教學(xué)方案,為學(xué)生及相關(guān)研究人員提供一個參考,以便能快速了解該項技術(shù)并進(jìn)入角色。本著新技術(shù),新起點(diǎn),新高度的育人理念,從創(chuàng)新實踐出發(fā),為多出人才、快出人才、出好人才做出貢獻(xiàn)。本文基于以太坊區(qū)塊鏈智能合約的眾籌實驗平臺方案僅供同行參考。