曾一洪 闕培斯 高飛
關(guān)鍵詞:論壇系統(tǒng);去中心化;以太坊;智能合約
中圖分類號:TP311 文獻標識碼:A
文章編號:1009-3044(2023)14-0012-03
0 引言
以太坊智能合約是一種運行在以太坊區(qū)塊鏈上的程序,它可以定義和執(zhí)行合約的規(guī)則,可被區(qū)塊鏈上的交易所觸發(fā),在滿足觸發(fā)條件的情況下這段代碼可以從區(qū)塊鏈上讀取數(shù)據(jù)或者向區(qū)塊鏈上寫入數(shù)據(jù)[1],無須信任協(xié)議或中介機構(gòu)。以太坊智能合約的特點是透明、安全和不可篡改,因為它們的代碼和數(shù)據(jù)都存儲在去中心化的網(wǎng)絡(luò)上,由所有節(jié)點共同驗證和執(zhí)行。區(qū)塊鏈匿名性是指區(qū)塊鏈上的交易參與者可以隱藏或保護他們的真實身份,只使用加密的地址或偽名進行交易。匿名性是數(shù)字貨幣的重要屬性之一,旨在保護用戶的身份信息,隱藏用戶與交易地址之間的關(guān)聯(lián)關(guān)系,用戶在參與數(shù)字貨幣交易的過程中,無須暴露姓名、身份證號等真實的身份信息,而是將系統(tǒng)生成的假名地址作為交易時的身份標識[2],防止被追蹤或?qū)彶?。用戶可以通過智能合約創(chuàng)建和管理自己的數(shù)字身份,選擇性地向第三方提供必要的信息,而不是全部暴露。以太坊智能合約和區(qū)塊鏈匿名性的結(jié)合為用戶提供了更多的自主權(quán)、隱私權(quán)和信任度,是區(qū)塊鏈技術(shù)發(fā)展的重要方向之一。
隨著Web3.0時代的到來,去中心化應(yīng)用(DApp)開始受到越來越多的關(guān)注和嘗試。去中心化應(yīng)用是運行在分布式網(wǎng)絡(luò)上,無須信任協(xié)議,參與者的信息被安全保護或匿名的應(yīng)用。它們與傳統(tǒng)的中心化應(yīng)用相比,有著更高的透明度、安全性和自主性。去中心化應(yīng)用的后端代碼(即智能合約)運行在一個去中心化的網(wǎng)絡(luò)上,如以太坊,而非中心化的服務(wù)器。它們使用以太坊區(qū)塊鏈網(wǎng)絡(luò)作為數(shù)據(jù)存儲端,使用智能合約負責(zé)操作邏輯和數(shù)據(jù)存儲,并通過交易與DApp前端或多個智能合約進行交互[3]。去中心化應(yīng)用的前沿領(lǐng)域包括去中心化金融(DeFi)、藝術(shù)品和收藏品、游戲、科技等。這些領(lǐng)域都有著巨大的創(chuàng)新潛力和社會價值,為用戶提供了更多的選擇。
由于以太坊智能合約本質(zhì)上是一段程序,由一門針對區(qū)塊鏈運行環(huán)境而設(shè)計的程序語言編寫,運行在棧式的以太坊虛擬機中[4],所以智能合約同樣存在安全問題。為了提升系統(tǒng)的安全性,本文基于以太坊智能合約平臺,使用了Vyper進行智能合約開發(fā),Vyper 是一種運行在以太坊虛擬機上的智能合約編程語言,它的設(shè)計目標是安全、簡單、易審計,為了提高智能合約的安全性,它會故意禁止一些事情甚至使得某些需求變得更難實現(xiàn)。與主流的智能合約編程語言Solidi?ty相比,兩者有著如下區(qū)別(見表1)。
本項目使用了Brownie智能合約開發(fā)框架對智能合約進行開發(fā)和管理,Brownie是一種基于Python的以太坊智能合約開發(fā)框架,它提供了一系列的工具和庫,方便開發(fā)者編譯、部署、測試和調(diào)試智能合約;系統(tǒng)前端采用的是Vue框架,Vue通過MVVM模式將代碼拆分為視圖和數(shù)據(jù)兩部分,開發(fā)者只需要關(guān)注數(shù)據(jù)即可,視圖部分會根據(jù)數(shù)據(jù)的變化自動響應(yīng)更新[5];在Vue中引入了ethers.js庫以便前端能夠直接與以太坊上的智能合約進行交互,同時也引入了axios庫來實現(xiàn)上傳圖片到IPFS分布式文件系統(tǒng);為了更加有效率地開發(fā)和測試論壇的各項功能,使用了Ganache以太坊開發(fā)環(huán)境作為論壇系統(tǒng)的開發(fā)和測試環(huán)境,模擬了真實的以太坊網(wǎng)絡(luò)行為和狀態(tài)。
1 系統(tǒng)設(shè)計
論壇是用于交流觀點、分享經(jīng)驗、討論話題的網(wǎng)絡(luò)平臺,論壇核心的“三要素”是發(fā)送帖子、瀏覽帖子、回復(fù)帖子[6]。本論壇系統(tǒng)與傳統(tǒng)論壇系統(tǒng)的區(qū)別在于,它利用以太坊區(qū)塊鏈上的智能合約作為后端邏輯,以及使用IPFS分布式存儲,IPFS 可以使Web 內(nèi)容的分發(fā)方式發(fā)生改變,實現(xiàn)去中心化的特性[7];此外,本系統(tǒng)取消了傳統(tǒng)論壇的注冊和登錄功能,使得任何人都可以瀏覽帖子,只有在發(fā)帖和評論這類需要改變智能合約狀態(tài)的情況,屆時才會喚起MetaMask錢包支付gas費。
本系統(tǒng)主要由四個功能模塊組成,分別是帖子列表模塊、發(fā)布帖子模塊、帖子詳情模塊、帖子評論模塊。每個模塊會同時涉及智能合約部分和前端部分。
1.1 帖子列表模塊
本模塊負責(zé)在首頁展示已發(fā)布的帖子列表,并按照發(fā)布時間降序排列,即最新發(fā)布的帖子顯示在最前面。由于從鏈上的智能合約查詢帖子列表需要一定時間,所以在查詢過程中,首頁應(yīng)顯示“正在加載帖子”,如果查詢結(jié)果為空,即沒有任何帖子時,首頁則應(yīng)顯示“目前暫無帖子”。如果帖子數(shù)量過多,超出一頁的顯示范圍,則會啟用分頁功能,方便用戶瀏覽不同頁碼的帖子。本模塊的程序流程圖如圖1所示。
1.2 發(fā)布帖子模塊
本模塊負責(zé)實現(xiàn)發(fā)布帖子,用戶可以在頁面填入帖子的標題、內(nèi)容、圖片,點擊發(fā)布按鈕后,前端頁面會調(diào)用MetaMask錢包支付gas費,并將用戶剛發(fā)布的帖子信息寫入鏈上的智能合約,然后自動跳轉(zhuǎn)到首頁,用戶可以看到剛剛發(fā)布的帖子顯示在首頁。本模塊的時序圖如圖2所示。
1.3 帖子詳情模塊
本模塊負責(zé)帖子的詳情頁,用戶可以在該頁面查看帖子的詳細信息,包括標題、內(nèi)容、圖片、評論。前端頁面通過獲取首頁路由傳遞的帖子ID,從鏈上的智能合約查詢該ID對應(yīng)的帖子信息,并展示在頁面上。
1.4 帖子評論模塊
本模塊負責(zé)實現(xiàn)評論功能,用戶可以在帖子詳情頁面的下方輸入評論內(nèi)容,并點擊發(fā)送按鈕提交評論。前端頁面會調(diào)用MetaMask錢包支付gas費,將評論內(nèi)容寫入鏈上的智能合約,并關(guān)聯(lián)到相應(yīng)的帖子。然后頁面會自動刷新,顯示最新的評論列表。
2 系統(tǒng)實現(xiàn)
2.1 智能合約
本系統(tǒng)使用Vyper語言編寫智能合約,首先定義了一個名為post_struct的結(jié)構(gòu)體,用于表示一個帖子的信息,包括帖子標題、帖子內(nèi)容、帖子位置(帖子ID)、帖子發(fā)布時間、圖片哈希值(圖片CID)、評論數(shù)組和評論位置,post_struct中的變量見表2。
合約中還設(shè)計了一個名為post_title_struct的結(jié)構(gòu)體,表示一個帖子的標題信息,包括帖子標題、帖子位置和帖子發(fā)布時間,便于在查詢帖子標題列表時,返回以該結(jié)構(gòu)體為元素的數(shù)組。合約中設(shè)計了兩個變量,分別是posts和post_sign,posts是一個長度為100 的post_struct數(shù)組,表示所有的帖子。post_sign是一個uint8類型的變量,用于記錄帖子存放的位置。合約中設(shè)計了四個函數(shù),分別為publish_post、pub?lish_comment、get_posts_titles、get_post_object。pub?lish_post函數(shù)是發(fā)布帖子時需要調(diào)用的函數(shù),接收的參數(shù)為帖子的標題、內(nèi)容、發(fā)布時間戳和圖片哈希值,該函數(shù)將這些信息存儲在posts 數(shù)組中,并更新post_sign,如果posts數(shù)組已滿,則覆蓋最舊的帖子,并將post_sign設(shè)置為0。publish_comment函數(shù)是發(fā)布評論時需要調(diào)用的函數(shù),接收的參數(shù)為評論內(nèi)容和對應(yīng)的帖子位置,該函數(shù)將評論內(nèi)容追加到posts數(shù)組里對應(yīng)帖子的評論數(shù)組中,并更新評論位置。如果評論數(shù)組已滿,則拋出異常。get_posts_titles函數(shù)是查詢合約中所有帖子的標題時需要調(diào)用的函數(shù),它會返回一個長度為100的post_title_struct數(shù)組,表示所有帖子的標題信息。get_post_object函數(shù)是查詢指定帖子的詳情信息,接收的參數(shù)為帖子位置,返回該位置所對應(yīng)的帖子的標題、內(nèi)容、圖片哈希值以及該帖子下的評論。
2.2 前端頁面
前端使用的是Vue框架,主要使用的Node.js依賴包見表3。
Vue使用的是組件化的開發(fā),本系統(tǒng)主要包含5 個組件,分別為App.vue、Header.vue、HomeView.vue、PublishView.vue、PostView.vue。
1)App.vue:根組件,負責(zé)加載整個應(yīng)用的頁面。里面僅包含兩個子組件,一個是Header組件,另一個是RouterView組件。Header組件即為頁頭。Router?View組件是路由庫提供的路由組件,用于根據(jù)不同的URL顯示不同的子組件,如HomeView組件、Publish?View組件和PostView組件。
2)Header.vue:頁頭組件,組件包含兩個按鈕,分別為首頁和發(fā)帖。點擊首頁按鈕會跳轉(zhuǎn)路由到Hom?eView組件,顯示帖子列表。點擊發(fā)帖按鈕會跳轉(zhuǎn)路由到PublishView組件,進入發(fā)布帖子的頁面。
3)HomeView.vue:首頁組件,用于展示帖子標題列表。組件掛載完畢后,前端頁面會調(diào)用ethers.js庫來查詢智能合約上的帖子列表數(shù)據(jù),并將查到的帖子列表按照時間倒序展示到頁面。如果帖子數(shù)量超過十個,超出一頁的顯示范圍,則會啟用分頁功能。用戶可以點擊帖子標題跳轉(zhuǎn)到PostView組件,查看帖子詳情,該組件實現(xiàn)的頁面效果如圖3所示。
4)PublishView.vue:發(fā)布帖子組件,在頁頭點擊發(fā)帖即可跳轉(zhuǎn)到該組件,在該組件渲染的頁面中,可以填寫帖子標題、帖子內(nèi)容以及上傳圖片進行發(fā)帖。上傳的圖片會通過axios 庫上傳到IPFS 分布式文件系統(tǒng),并返回一個唯一的IPFS哈希值作為圖片的標識符。帖子發(fā)布成功后,會跳轉(zhuǎn)到HomeView組件,將剛發(fā)布的帖子標題展示到首頁的最上方。該組件實現(xiàn)的頁面效果如圖4所示。
5)PostView.vue帖子詳情組件,在該組件渲染的頁面中,會顯示當前帖子的標題、內(nèi)容、圖片以及評論列表。用戶還可以在評論框中輸入自己的評論,并點擊發(fā)送按鈕來發(fā)表評論。該組件實現(xiàn)的頁面效果如圖5 所示。
3 結(jié)束語
本文完成了一個基于以太坊智能合約的去中心化匿名論壇系統(tǒng)①,旨在為用戶提供一個自由、安全、隱私的在線交流平臺。用戶無須注冊賬號,即可在論壇上發(fā)布和瀏覽帖子,且不會暴露身份信息。用戶的每一次發(fā)帖或評論都會通過智能合約記錄在區(qū)塊鏈上,保證了數(shù)據(jù)的不可篡改和透明性。前端頁面及帖子圖片都存儲在IPFS分布式文件系統(tǒng)上,保證了數(shù)據(jù)的持久性和可訪問性。本系統(tǒng)展示了區(qū)塊鏈技術(shù)和分布式存儲技術(shù)在社交領(lǐng)域的應(yīng)用價值,為未來去中心化社交網(wǎng)絡(luò)提供了參考和啟示。