胡娟,湯海林
(廣東白云學(xué)院大數(shù)據(jù)與計(jì)算機(jī)學(xué)院,廣東 廣州 510400)
區(qū)塊鏈技術(shù)本質(zhì)上是一種基于時(shí)間戳的防篡改數(shù)據(jù)庫(kù),可以允許個(gè)人、公司、公共機(jī)構(gòu)以及其他實(shí)體以同步、透明和去中心化的方式驗(yàn)證交易和更新數(shù)據(jù)庫(kù)數(shù)據(jù)。這種創(chuàng)建和管理數(shù)據(jù)的新機(jī)制由于備具透明、安全以及信任增強(qiáng)的優(yōu)點(diǎn),能夠跨行業(yè)、跨組織地產(chǎn)生影響,將原本孤立的系統(tǒng)變成更開放的系統(tǒng)。以比特幣為代表的數(shù)字貨幣提供了區(qū)塊鏈技術(shù)應(yīng)用的原型,以以太坊為代表的智能合約平臺(tái)延伸了區(qū)塊鏈技術(shù)的功能。
低代碼開發(fā)平臺(tái)提供了可視化的界面和預(yù)構(gòu)建的組件,開發(fā)者可以通過拖放和配置來(lái)構(gòu)建應(yīng)用程序。低代碼平臺(tái)通常提供與以太坊區(qū)塊鏈的集成,開發(fā)者可以通過配置連接到以太坊網(wǎng)絡(luò),部署智能合約,并與以太坊的節(jié)點(diǎn)進(jìn)行通信。開發(fā)者能夠在低代碼平臺(tái)上輕松地開發(fā)和部署區(qū)塊鏈以太坊微博系統(tǒng),而無(wú)須深入了解底層的區(qū)塊鏈技術(shù)和編寫復(fù)雜的代碼。
以太坊是一個(gè)基于區(qū)塊鏈技術(shù)的開源平臺(tái),允許用戶建立和執(zhí)行智能合約,創(chuàng)建去中心化的應(yīng)用程序和數(shù)字資產(chǎn)。
以太坊中有兩種類型的賬戶:外部賬戶和合約賬戶[3]。EOA[4](Externally Owned Account)是以太坊中的外部賬戶,由私鑰控制,可以發(fā)送交易和持有以太幣或其他代幣(Token)。合約賬戶是以太坊中的智能合約賬戶,由智能合約代碼控制,可以執(zhí)行預(yù)定的邏輯和操作,存儲(chǔ)狀態(tài)并與其他合約或外部賬戶進(jìn)行交互。
智能合約[5]是以太坊上的自動(dòng)執(zhí)行合約,包含編程邏輯和數(shù)據(jù),可以實(shí)現(xiàn)自動(dòng)化的交互和資產(chǎn)管理。
Truffle 是一個(gè)流行的以太坊開發(fā)框架,用于構(gòu)建、測(cè)試和部署智能合約。它使開發(fā)者能夠輕松地開發(fā)、測(cè)試和部署以太坊智能合約。
以太坊錢包是一種用于存儲(chǔ)、管理和交換以太坊及其相關(guān)代幣的數(shù)字錢包。它允許用戶創(chuàng)建和控制一個(gè)或多個(gè)以太坊賬戶,并使用安全的方式進(jìn)行交易、轉(zhuǎn)賬和管理加密資產(chǎn)。常見的以太坊錢包包括MetaMask[7]、MyEtherWallet、Trust Wallet和Ledger等。
這個(gè)系統(tǒng)的前端使用HTML5、CSS3 和JavaScript來(lái)實(shí)現(xiàn)用戶界面。用戶可以通過前端界面瀏覽微博文章并發(fā)表評(píng)論。系統(tǒng)還需要一個(gè)后端服務(wù)器來(lái)處理用戶提交的數(shù)據(jù)和交互。這個(gè)后端服務(wù)器應(yīng)該包括以太坊節(jié)點(diǎn),以便與以太坊網(wǎng)絡(luò)進(jìn)行通信。在以太坊網(wǎng)絡(luò)上,系統(tǒng)需要部署兩個(gè)智能合約,分別是微博注冊(cè)合約和微博賬號(hào)合約。微博注冊(cè)合約負(fù)責(zé)驗(yàn)證用戶身份并創(chuàng)建新的微博賬戶,而微博賬號(hào)合約則負(fù)責(zé)管理用戶的微博文章和評(píng)論。當(dāng)用戶在前端界面上發(fā)布一篇新的微博文章或發(fā)表評(píng)論時(shí),這些數(shù)據(jù)將會(huì)被發(fā)送到后端服務(wù)器。服務(wù)器將對(duì)用戶進(jìn)行身份驗(yàn)證,并將文章或評(píng)論存儲(chǔ)在以太坊網(wǎng)絡(luò)上的微博賬號(hào)合約中。當(dāng)其他用戶瀏覽微博或者查看評(píng)論時(shí),系統(tǒng)將從以太坊網(wǎng)絡(luò)中讀取數(shù)據(jù),并將其顯示在前端界面上。整個(gè)系統(tǒng)的核心就是以太坊虛擬機(jī)(EVM),它允許人們?cè)谝蕴痪W(wǎng)絡(luò)上部署智能合約并與其進(jìn)行交互。同時(shí),這個(gè)系統(tǒng)也需要一定的安全措施,以保護(hù)用戶數(shù)據(jù)和身份信息不受攻擊。圖1是該系統(tǒng)的整體架構(gòu)圖。
圖1 系統(tǒng)架構(gòu)圖
這是一個(gè)運(yùn)行在以太坊上的去中心化的微博系統(tǒng),去中心化意味著沒有一個(gè)中心化機(jī)構(gòu)能夠控制用戶發(fā)送的微博。下面介紹微博系統(tǒng)的注冊(cè)流程,如圖2所示。
圖2 微博注冊(cè)流程圖
第一步,需要先在Truffle中編寫微博注冊(cè)智能合約,使用Truffle 工具將其部署到以太坊網(wǎng)絡(luò)中,獲得合約地址。第二步,用戶注冊(cè)微博賬號(hào)。用戶在界面上填寫個(gè)人信息,包括昵稱和以太坊錢包地址,通過界面將這些信息發(fā)送給后端。第三步,后端收到用戶提交的注冊(cè)請(qǐng)求后,調(diào)用智能合約的注冊(cè)函數(shù),創(chuàng)建一個(gè)微博賬號(hào)地址。將微博賬號(hào)地址與用戶的以太坊錢包地址進(jìn)行關(guān)聯(lián),并將用戶昵稱等信息存儲(chǔ)到數(shù)據(jù)庫(kù)中。第四步,返回微博賬號(hào)地址給用戶,后端將生成的微博賬號(hào)地址返回到前端界面。
3.1.1 微博賬號(hào)合約
1)發(fā)表微博:在發(fā)微博頁(yè)面,用戶可以輸入文字、圖片或者視頻等內(nèi)容,發(fā)布到微博上。微博賬號(hào)合約會(huì)將微博的內(nèi)容保存到以太坊上,以便其他用戶進(jìn)行查看。
這是一個(gè)Content 結(jié)構(gòu)體。該結(jié)構(gòu)體包含了以下字段:text表示微博中的文本內(nèi)容。imageHash表示上傳到IPFS 網(wǎng)絡(luò)上的圖片的哈希值。videoHash表示上傳到IPFS 網(wǎng)絡(luò)的視頻的哈希值。emoji表示微博中使用的表情。timestamp表示微博發(fā)布的時(shí)間戳。
該函數(shù)現(xiàn)在接收四個(gè)參數(shù),分別表示微博的文本內(nèi)容、上傳到IPFS 網(wǎng)絡(luò)的圖片和視頻的哈希值以及微博中使用的表情。函數(shù)使用require 函數(shù)來(lái)檢查微博的文本內(nèi)容是否符合要求,以確保不會(huì)發(fā)布過長(zhǎng)的微博。
2)發(fā)表評(píng)論:用戶輸入評(píng)論的內(nèi)容、表情或圖片,微博賬號(hào)合約會(huì)將評(píng)論的內(nèi)容保存到以太坊上,以便其他用戶可以看到評(píng)論。
這段代碼使用require 來(lái)確保傳入的微博ID 是有效的。第二個(gè)require確保傳入的評(píng)論內(nèi)容不能為空,即評(píng)論的內(nèi)容長(zhǎng)度大于0。在存儲(chǔ)所有微博的映射中,找到目標(biāo)微博并將評(píng)論添加到這個(gè)微博的評(píng)論數(shù)組中。添加評(píng)論時(shí),使用結(jié)構(gòu)體Comment 來(lái)表示評(píng)論,這個(gè)結(jié)構(gòu)體包括兩個(gè)屬性,分別是評(píng)論者地址和評(píng)論內(nèi)容。當(dāng)函數(shù)執(zhí)行完畢后,這條新評(píng)論會(huì)被添加到目標(biāo)微博的評(píng)論數(shù)組中,以便其他用戶能看到這條新的評(píng)論。
3)發(fā)起打賞:在看微博時(shí),用戶可以通過打賞的方式向?qū)Ψ奖磉_(dá)贊賞或支持。用戶輸入打賞的金額,微博賬號(hào)合約會(huì)將打賞的以太幣轉(zhuǎn)入到被打賞者的賬戶中。
當(dāng)用戶想要打賞給某個(gè)微博作者時(shí),reward 函數(shù)會(huì)將打賞的金額從用戶的賬戶上轉(zhuǎn)賬到受打賞的微博賬戶地址上,用于打賞某條微博的作者。這段代碼中的address payable weiboAuthor 是一個(gè)可支付的地址變量。ownerOfWeibo(weiboId)函數(shù)的返回值是一個(gè)地址,表示微博作者的地址。payable 關(guān)鍵字用于將該地址轉(zhuǎn)換為可支付的地址,以便使用transfer 函數(shù)將用戶打賞的金額轉(zhuǎn)移到該地址,也就是轉(zhuǎn)給受打賞的微博作者。
4)提現(xiàn)打賞:將接收到的以太幣從智能合約的地址中轉(zhuǎn)移到一個(gè)外部的以太坊錢包地址中的過程。
這段代碼根據(jù)選擇的weiboId 獲取對(duì)應(yīng)的微博信息,并存儲(chǔ)在weibo 變量中。使用require 函數(shù)判斷該用戶在該微博上的打賞金額是否大于0,如果不是則拋出異常,表示沒有打賞金額可以提現(xiàn)。如果存在打賞金額,將該用戶在該微博上的打賞金額存儲(chǔ)到amount 變量中,將其在_donations 映射中的值清零,表示已經(jīng)提現(xiàn)過了。根據(jù)amount 計(jì)算手續(xù)費(fèi)(Gas),并將手續(xù)費(fèi)金額存儲(chǔ)在fee 變量中。計(jì)算扣除手續(xù)費(fèi)之后的凈金額netAmount,如果小于等于0,則拋出異常,表示手續(xù)費(fèi)過高,不可以提現(xiàn)。使用payable 關(guān)鍵字將凈金額netAmount 轉(zhuǎn)賬到該微博用戶的地址。使用payable 關(guān)鍵字將手續(xù)費(fèi)fee 轉(zhuǎn)賬到微博管理員地址。
3.1.2 微博注冊(cè)合約
1)注冊(cè)微博賬號(hào):用戶向微博注冊(cè)合約發(fā)送一個(gè)注冊(cè)請(qǐng)求,包含了用戶名和密碼等信息。微博注冊(cè)合約會(huì)根據(jù)傳入的參數(shù),創(chuàng)建一個(gè)新的微博賬號(hào)合約,并將賬號(hào)合約的地址返回給用戶。
WeiboRegistration 是一個(gè)智能合約,用于注冊(cè)微博賬號(hào)。User 結(jié)構(gòu)體定義了每個(gè)用戶的屬性。每個(gè)用戶有一個(gè)用戶名(username)、密碼(password)、微博以太坊地址(weiboAddress)、注冊(cè)狀態(tài)(isRegistered)和注冊(cè)時(shí)間(registrationTime)。
mapping(address=>User) public users 是一個(gè)映射(mapping),將用戶的以太坊地址映射到對(duì)應(yīng)的User結(jié)構(gòu)體,實(shí)現(xiàn)了以太坊地址到用戶信息的查找功能。
register 函數(shù)用于注冊(cè)微博賬號(hào)。它接受三個(gè)參數(shù):用戶名(_username)、密碼(_password)和微博以太坊地址(_weiboAddress)。在函數(shù)體內(nèi),通過require語(yǔ)句對(duì)輸入進(jìn)行驗(yàn)證。確保用戶名和密碼非空,微博以太坊地址有效且不為零地址,并且調(diào)用者的地址還未注冊(cè)過微博賬號(hào)。如果驗(yàn)證通過,將用戶信息存儲(chǔ)在users映射中,使用調(diào)用者的以太坊地址作為鍵。用戶信息包括用戶名、密碼、微博以太坊地址、注冊(cè)狀態(tài)和注冊(cè)時(shí)間。效果如圖3所示。
圖3 注冊(cè)微博賬號(hào)頁(yè)面效果圖
3.1.3 部署微博注冊(cè)智能合約
在Truffle中只要部署微博注冊(cè)合約就可以了,微博賬號(hào)合約可以通過前端頁(yè)面進(jìn)行部署。在部署微博注冊(cè)合約之前,需要編寫遷移腳本,內(nèi)容如下:
首先,引入需要使用的智能合約WeiboRegistration 和ExternalAPI。
之后,定義了一個(gè)異步函數(shù),該函數(shù)將用來(lái)部署合約。
這些信息由用戶在界面上提供。通過deployer.deploy(),將WeiboRegistration 合約部署到區(qū)塊鏈上,并使用externalAPI.address 作為參數(shù)傳遞給合約的構(gòu)造函數(shù)。然后,使用WeiboRegistration.deployed()獲取已部署的合約實(shí)例。
部署成功之后,就可以在低代碼平臺(tái)編寫前端應(yīng)用了。由于前端應(yīng)用的編程并不復(fù)雜,這里不再詳述。
基于Solidity 的低代碼以太坊微博系統(tǒng)是為了解決傳統(tǒng)微博系統(tǒng)中存在的中心化管理[8]、數(shù)據(jù)安全性和透明性不足等問題而設(shè)計(jì)的。在設(shè)計(jì)這樣的架構(gòu)時(shí),需要考慮一些重要的因素。首先是安全性問題,因?yàn)閰^(qū)塊鏈技術(shù)的去中心化和不可篡改特性[9],智能合約一旦部署就無(wú)法更改,因此必須保證智能合約代碼的安全性。其次是性能問題,因?yàn)橐蕴痪W(wǎng)絡(luò)的交易速度和吞吐量受限,可能會(huì)影響系統(tǒng)的響應(yīng)速度和并發(fā)能力。因此,在設(shè)計(jì)和實(shí)現(xiàn)時(shí)需要考慮這些問題,從而保證系統(tǒng)的可靠性和穩(wěn)定性。