曾一洪 闕培斯 高飛



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