胡娟,湯海林
(廣東白云學院大數據與計算機學院,廣東 廣州 510400)
區塊鏈技術本質上是一種基于時間戳的防篡改數據庫,可以允許個人、公司、公共機構以及其他實體以同步、透明和去中心化的方式驗證交易和更新數據庫數據。這種創建和管理數據的新機制由于備具透明、安全以及信任增強的優點,能夠跨行業、跨組織地產生影響,將原本孤立的系統變成更開放的系統。以比特幣為代表的數字貨幣提供了區塊鏈技術應用的原型,以以太坊為代表的智能合約平臺延伸了區塊鏈技術的功能。
低代碼開發平臺提供了可視化的界面和預構建的組件,開發者可以通過拖放和配置來構建應用程序。低代碼平臺通常提供與以太坊區塊鏈的集成,開發者可以通過配置連接到以太坊網絡,部署智能合約,并與以太坊的節點進行通信。開發者能夠在低代碼平臺上輕松地開發和部署區塊鏈以太坊微博系統,而無須深入了解底層的區塊鏈技術和編寫復雜的代碼。
以太坊是一個基于區塊鏈技術的開源平臺,允許用戶建立和執行智能合約,創建去中心化的應用程序和數字資產。
以太坊中有兩種類型的賬戶:外部賬戶和合約賬戶[3]。EOA[4](Externally Owned Account)是以太坊中的外部賬戶,由私鑰控制,可以發送交易和持有以太幣或其他代幣(Token)。合約賬戶是以太坊中的智能合約賬戶,由智能合約代碼控制,可以執行預定的邏輯和操作,存儲狀態并與其他合約或外部賬戶進行交互。
智能合約[5]是以太坊上的自動執行合約,包含編程邏輯和數據,可以實現自動化的交互和資產管理。
Truffle 是一個流行的以太坊開發框架,用于構建、測試和部署智能合約。它使開發者能夠輕松地開發、測試和部署以太坊智能合約。
以太坊錢包是一種用于存儲、管理和交換以太坊及其相關代幣的數字錢包。它允許用戶創建和控制一個或多個以太坊賬戶,并使用安全的方式進行交易、轉賬和管理加密資產。常見的以太坊錢包包括MetaMask[7]、MyEtherWallet、Trust Wallet和Ledger等。
這個系統的前端使用HTML5、CSS3 和JavaScript來實現用戶界面。用戶可以通過前端界面瀏覽微博文章并發表評論。系統還需要一個后端服務器來處理用戶提交的數據和交互。這個后端服務器應該包括以太坊節點,以便與以太坊網絡進行通信。在以太坊網絡上,系統需要部署兩個智能合約,分別是微博注冊合約和微博賬號合約。微博注冊合約負責驗證用戶身份并創建新的微博賬戶,而微博賬號合約則負責管理用戶的微博文章和評論。當用戶在前端界面上發布一篇新的微博文章或發表評論時,這些數據將會被發送到后端服務器。服務器將對用戶進行身份驗證,并將文章或評論存儲在以太坊網絡上的微博賬號合約中。當其他用戶瀏覽微博或者查看評論時,系統將從以太坊網絡中讀取數據,并將其顯示在前端界面上。整個系統的核心就是以太坊虛擬機(EVM),它允許人們在以太坊網絡上部署智能合約并與其進行交互。同時,這個系統也需要一定的安全措施,以保護用戶數據和身份信息不受攻擊。圖1是該系統的整體架構圖。

圖1 系統架構圖
這是一個運行在以太坊上的去中心化的微博系統,去中心化意味著沒有一個中心化機構能夠控制用戶發送的微博。下面介紹微博系統的注冊流程,如圖2所示。

圖2 微博注冊流程圖
第一步,需要先在Truffle中編寫微博注冊智能合約,使用Truffle 工具將其部署到以太坊網絡中,獲得合約地址。第二步,用戶注冊微博賬號。用戶在界面上填寫個人信息,包括昵稱和以太坊錢包地址,通過界面將這些信息發送給后端。第三步,后端收到用戶提交的注冊請求后,調用智能合約的注冊函數,創建一個微博賬號地址。將微博賬號地址與用戶的以太坊錢包地址進行關聯,并將用戶昵稱等信息存儲到數據庫中。第四步,返回微博賬號地址給用戶,后端將生成的微博賬號地址返回到前端界面。
3.1.1 微博賬號合約
1)發表微博:在發微博頁面,用戶可以輸入文字、圖片或者視頻等內容,發布到微博上。微博賬號合約會將微博的內容保存到以太坊上,以便其他用戶進行查看。

這是一個Content 結構體。該結構體包含了以下字段:text表示微博中的文本內容。imageHash表示上傳到IPFS 網絡上的圖片的哈希值。videoHash表示上傳到IPFS 網絡的視頻的哈希值。emoji表示微博中使用的表情。timestamp表示微博發布的時間戳。

該函數現在接收四個參數,分別表示微博的文本內容、上傳到IPFS 網絡的圖片和視頻的哈希值以及微博中使用的表情。函數使用require 函數來檢查微博的文本內容是否符合要求,以確保不會發布過長的微博。
2)發表評論:用戶輸入評論的內容、表情或圖片,微博賬號合約會將評論的內容保存到以太坊上,以便其他用戶可以看到評論。

這段代碼使用require 來確保傳入的微博ID 是有效的。第二個require確保傳入的評論內容不能為空,即評論的內容長度大于0。在存儲所有微博的映射中,找到目標微博并將評論添加到這個微博的評論數組中。添加評論時,使用結構體Comment 來表示評論,這個結構體包括兩個屬性,分別是評論者地址和評論內容。當函數執行完畢后,這條新評論會被添加到目標微博的評論數組中,以便其他用戶能看到這條新的評論。
3)發起打賞:在看微博時,用戶可以通過打賞的方式向對方表達贊賞或支持。用戶輸入打賞的金額,微博賬號合約會將打賞的以太幣轉入到被打賞者的賬戶中。

當用戶想要打賞給某個微博作者時,reward 函數會將打賞的金額從用戶的賬戶上轉賬到受打賞的微博賬戶地址上,用于打賞某條微博的作者。這段代碼中的address payable weiboAuthor 是一個可支付的地址變量。ownerOfWeibo(weiboId)函數的返回值是一個地址,表示微博作者的地址。payable 關鍵字用于將該地址轉換為可支付的地址,以便使用transfer 函數將用戶打賞的金額轉移到該地址,也就是轉給受打賞的微博作者。
4)提現打賞:將接收到的以太幣從智能合約的地址中轉移到一個外部的以太坊錢包地址中的過程。

這段代碼根據選擇的weiboId 獲取對應的微博信息,并存儲在weibo 變量中。使用require 函數判斷該用戶在該微博上的打賞金額是否大于0,如果不是則拋出異常,表示沒有打賞金額可以提現。如果存在打賞金額,將該用戶在該微博上的打賞金額存儲到amount 變量中,將其在_donations 映射中的值清零,表示已經提現過了。根據amount 計算手續費(Gas),并將手續費金額存儲在fee 變量中。計算扣除手續費之后的凈金額netAmount,如果小于等于0,則拋出異常,表示手續費過高,不可以提現。使用payable 關鍵字將凈金額netAmount 轉賬到該微博用戶的地址。使用payable 關鍵字將手續費fee 轉賬到微博管理員地址。
3.1.2 微博注冊合約
1)注冊微博賬號:用戶向微博注冊合約發送一個注冊請求,包含了用戶名和密碼等信息。微博注冊合約會根據傳入的參數,創建一個新的微博賬號合約,并將賬號合約的地址返回給用戶。
WeiboRegistration 是一個智能合約,用于注冊微博賬號。User 結構體定義了每個用戶的屬性。每個用戶有一個用戶名(username)、密碼(password)、微博以太坊地址(weiboAddress)、注冊狀態(isRegistered)和注冊時間(registrationTime)。
mapping(address=>User) public users 是一個映射(mapping),將用戶的以太坊地址映射到對應的User結構體,實現了以太坊地址到用戶信息的查找功能。


register 函數用于注冊微博賬號。它接受三個參數:用戶名(_username)、密碼(_password)和微博以太坊地址(_weiboAddress)。在函數體內,通過require語句對輸入進行驗證。確保用戶名和密碼非空,微博以太坊地址有效且不為零地址,并且調用者的地址還未注冊過微博賬號。如果驗證通過,將用戶信息存儲在users映射中,使用調用者的以太坊地址作為鍵。用戶信息包括用戶名、密碼、微博以太坊地址、注冊狀態和注冊時間。效果如圖3所示。

圖3 注冊微博賬號頁面效果圖
3.1.3 部署微博注冊智能合約
在Truffle中只要部署微博注冊合約就可以了,微博賬號合約可以通過前端頁面進行部署。在部署微博注冊合約之前,需要編寫遷移腳本,內容如下:
首先,引入需要使用的智能合約WeiboRegistration 和ExternalAPI。

之后,定義了一個異步函數,該函數將用來部署合約。

這些信息由用戶在界面上提供。通過deployer.deploy(),將WeiboRegistration 合約部署到區塊鏈上,并使用externalAPI.address 作為參數傳遞給合約的構造函數。然后,使用WeiboRegistration.deployed()獲取已部署的合約實例。

部署成功之后,就可以在低代碼平臺編寫前端應用了。由于前端應用的編程并不復雜,這里不再詳述。
基于Solidity 的低代碼以太坊微博系統是為了解決傳統微博系統中存在的中心化管理[8]、數據安全性和透明性不足等問題而設計的。在設計這樣的架構時,需要考慮一些重要的因素。首先是安全性問題,因為區塊鏈技術的去中心化和不可篡改特性[9],智能合約一旦部署就無法更改,因此必須保證智能合約代碼的安全性。其次是性能問題,因為以太坊網絡的交易速度和吞吐量受限,可能會影響系統的響應速度和并發能力。因此,在設計和實現時需要考慮這些問題,從而保證系統的可靠性和穩定性。