王華,戴建成,許力
(1.閩江師范高等專科學校 數字信息工程學院,福建 福州 350117;2.福建師范大學 計算機與網絡空間安全學院,福建 福州 350117;3.物聯網福建省高校應用技術工程中心,福建 福州 350117)
隨著互聯網的蓬勃發展,社交網絡成為新時代信息傳遞的重要媒介[1]。人們在社交網絡中可以共享、獲取各種信息。目前,社交網絡已經成為人們日常生活的重要組成部分。據統計2019 年我國社交網絡用戶規模已達到8.62 億人,預計2022 年中國社交網絡用戶整體突破10 億人[1]。當前社交網絡的發展依賴于中心化的社交網絡平臺,受到單點瓶頸限制,中心化管理者無法實時管理用戶發布的不良信息。更為嚴重的是,出于自身利益最大化的考慮,管理者常常會利用用戶流量來控制和影響輿論導向,達到不可告人的目的,這無疑損害了相關用戶的權益。甚至,管理者憑借控制權集中、信息修改不透明等優勢,對相關用戶的數據進行篡改,使得相關用戶的切身權益更加得不到保障。因此,設計一個新的社交網絡平臺成為重要的研究課題。
2008 年,中本聰發布比特幣,區塊鏈的概念由此產生[2]。區塊鏈具有去中心化、不可篡改、全程留痕、可以追溯、集體維護、公開透明等特點[2]。經過十多年的研究與發展,區塊鏈已從數字貨幣1.0 階段,到結合智能合約的2.0 階段[3],再到現在的全面接觸社會生活的3.0 階段[4]。近些年來,區塊鏈技術廣泛應用到人們生活和社會發展的方方面面,在金融[5]、農業[6]、政務[7]等領域提供了分布式安全服務。以太坊利用區塊鏈技術建立了一個開源的有智能合約功能的公共區塊鏈平臺[8],更進一步推進了去中心化應用的快速發展。
本文提出一個去中心化社交網絡方案,并基于以太坊、智能合約與現有虛擬貨幣交易所實現了分布式的社交網絡平臺。該方案不再依賴中心化管理者,避免了中心化管理者控制輿論和篡改用戶信息。
考慮到不良信息監管問題,本文設計身份認證方案實現對濫發不良信息用戶的管理。設計基于投票的監管機制,解決了中心化管理單點瓶頸限制的問題。設計基于熱榜函數的“評價-流量兌現”雙模式激勵機制,確保用戶發布良好信息的收益高于發布惡意信息。
通過hash 算法降低區塊鏈的存儲開銷。Solidity在線集成開發環境Remix 對平臺性能進行測試,實驗結果表明,所提方案實現了預期功能,降低了存儲開銷,減少了gas 消耗,在使用少量存儲空間與算力的情況下,保證了分布式信任安全。
區塊鏈是一種運用密碼學解決分布式信任問題的數據結構[9]。如圖1 所示,區塊鏈通過將前一區塊Hash 值與當前區塊數據進行哈希處理,得到一個可快速驗證的Hash 值。根據使用場景不同,區塊記錄的數據類型也不同,比特幣則記錄了交易信息[10]。區塊鏈利用密碼學形成一種前后關聯、可快速驗證、且難以偽造的數據記錄結構體,從而保證了數據的真實性。

圖1 區塊鏈結構Fig.1 Block chain structure
以太坊是一個開源的有智能合約功能的公共區塊鏈平臺[8],通過其專用加密貨幣——以太幣提供去中心化的以太虛擬機(EVM)來處理點對點合約[11]。以太坊設計框架如圖2 所示。

圖2 以太坊框架Fig.2 Ethereum framework
系統模型如圖3 所示,其擁有系統開發者、系統維護者、內容生產者、流量購買者以及內容閱讀者等五類主要角色。系統的更新與管理,由全體參與者投票決定,每個人的投票權重將依據獲得利潤與活躍度動態調整。具體而言,每類角色如下:

圖3 系統模型Fig.3 System model
(1)系統開發者:持續為系統更新。更新內容將由投票確認;用戶調用新功能時會向開發者轉取一定的虛擬貨幣,開發者以此來獲得收益。
(2)系統維護者:為系統提供算力,讓系統持續的運行,每出一個區塊,系統會鑄造新的虛擬貨幣給維護者。
(3)內容生產者:為社交網絡提供作品,吸引流量的群體。他們可以通過出售自己區域的廣告位來獲取虛擬貨幣,以此獲取收益。
(4)流量購買者:使用從開發者、維護者、內容生產者或閱讀者手中購買的虛擬貨幣兌換流量服務。
(5)內容閱讀者:從平臺獲取信息的用戶。平臺為閱讀者提供一個以關鍵詞為主題的交流社區,準確把握用戶需求,為興趣而生。讓那些對同一個話題感興趣的人們聚集在一起,更加方便地展開交流和互相幫助。
(6)參與者:對系統更新是否生效而進行投票的所有群體。
設計一個基于以太坊的社交網絡平臺,為社交網絡上的參與者提供一個團體自治的社交網絡環境,具體主要目標如下:
去中心化。搭建一個去中心化的社交網絡平臺,解決傳統中心化社交網絡封閉、單點瓶頸、權限集中等實際問題。
可身份認證。采用以太坊公有鏈技術,其去中心化技術導致用戶匿名性,不便管理。為此,需要對用戶的身份進行認證,以此杜絕有不良企圖的用戶,隨意創建并發布不良信息。
節約gas。gas 是指調用合約運行時需要支付的以太幣,支付的gas 將會直接銷毀。如果一個合約運行需要的gas 值太高,系統可能會無法部署,因為以太坊網有最高gas 的限制,gas 值太大會影響系統的性能。以太坊中的gas 控制機制既是為了平臺的資源考慮,也是對用戶成本的一種保護。在本文方案設計中,為了優化代碼,減少系統運行花費以及提高運行效率,有必要盡可能的減少程序gas 的消耗。
針對系統整體框架和系統主要功能模塊展開描述,給出具體的設計方案。
3.1.1 系統物理架構
系統物理架構如圖4 所示[12],使用基于區塊鏈技術的分布式架構,不限制加入群體,任何人都可以使用設備自建屬于自己的社交網絡,或是加入他人的社交網絡。每個維護者負責運行一個以太坊區塊鏈的共識節點,各維護者可以利用初始化信息以特定的配置加入到區塊鏈公有鏈網絡,以區塊鏈地址作為各個用戶的唯一標識。之后維護者又將在自己的設備上配置web 服務,為閱讀者提供前端服務用以連接區塊鏈網絡。若需要控制用戶注冊,合約發布可將監管機構納入為注冊系統的管理員。

圖4 系統物理架構Fig.4 System physical architecture
3.1.2 系統邏輯架構
通常去中心化應用(DAPP)由HTML 頁面、前端JavaScript、web3.js 庫以及以太坊區塊鏈組成,這種最簡單的DAPP 架構雖然能滿足區塊鏈應用的基本需求,但是需要前端做很多的邏輯處理,也不能讓閱讀者在不需要連接區塊鏈網絡的前提下訪問區塊鏈網絡的數據。所以本文對其進行優化,提出了一種四層架構的程序框架,如圖5 所示:

圖5 系統邏輯架構Fig.5 System logical architecture
網絡層是實現分布式網絡的以太坊底層技術,運用區塊鏈技術來保證分布式應用的信任問題。
合約層使用Solidity 編寫智能合約,完成各項功能控制,實現區塊鏈數據的存取。
服務層為用戶提供web 交互和區塊鏈信息交換服務。為了讓內容閱讀者無需在客戶端直接連接區塊鏈網絡,本文方案在服務端通過Node.js 調用web3.js與區塊鏈進行交互,而服務端直接連接著區塊鏈網絡,也將大大提升訪問速度。在服務層中,Node.js 是提供服務的核心,支撐著整個平臺的運行。
應用層提供用戶接口,用以實現對數據的存儲與修改。通過web 界面直接與用戶進行交互。
經過需求分析,系統功能模塊總體結構如圖6 所示,包含了類貼吧社交模塊,廣告模塊,系統更新模塊和虛擬貨幣交易模塊等。社交模塊為用戶提供社交服務;廣告模塊為內容創作者與流量購買者提供流量交易服務;投票模塊為系統提供一個投票更新的功能;交易模塊可以讓用戶出售虛擬貨幣提現。

圖6 系統功能模塊結構Fig.6 System function module structure
3.2.1 社交網絡模塊
社交網絡模塊是整個系統正常運行的重要基礎,使用前用戶必須先注冊。他包含了身份認證、用戶注冊、信息發布和熱榜等功能。整個模塊內部交互設計如圖7 所示。

圖7 社交網絡模塊Fig.7 Social network module
(1)認證注冊(可選)。監管部門審核用戶信息后,更新鏈上驗證碼并發送給用戶。用戶注冊限制是防范社交網絡被濫用的重要功能。
(2)用戶注冊。為用戶創建初始存儲數據庫,保存用戶認證數據(加密形式),僅監管部門能夠查閱。
(3)創建吧。創建一個新的、以某個關鍵詞為話題的社區,并初始化信息。
(4)創建帖子。發布帶有言論的帖子,尋求幫助或者分享信息。其真實存儲在用戶存儲數據庫中,其他地方只記錄其所在地,這樣便于維護。
(5)評論(同創建帖子)。在創建帖子的基礎上,將自己的存儲地址緊跟在母貼評論區后,并將母貼地址存儲到自己的數據庫中。評論的存儲地位等同于帖子,相對于一個新帖子,多了母貼信息。
(6)點贊、踩等計數操作。帖子中帶有一個記錄某些操作次數的存儲,用于統計上熱榜。
(7)熱榜計算。依據帖子中單位時間的操作次數衡量熱度。
3.2.2 廣告模塊
為了吸引更多的內容生產者與資金,廣告模塊可讓內容生產者兌現自己的流量。廣告模塊如圖8 所示。

圖8 廣告模塊Fig.8 Advertisement module
內容生產者根據自己的流量,對帖子設置可購買的區域與價格。流量購買者使用虛擬貨幣購買即可獲得該區域編輯權限。
3.2.3 系統更新模塊
為讓系統可以去中心化的形式迭代更新,如圖9所示,使用投票形式通過更新方案。開發者以決策形式提交優化或新功能代碼,被更新并入系統后,系統會以虛擬貨幣作為獎勵發送給開發者。參與者/代理人也可以提出決策,并且對決策進行投票,投票通過后更新并入系統。

圖9 系統更新模塊Fig.9 System update module
3.2.4 交易模塊
每個吧都將發布一個代幣,代幣與維護系統的貨幣關聯交易。為實現去中心化的交易,本文借鑒Uniswap 運行機制[13],設計一款為社交媒體平臺代幣交換的交易所。
Uniswap 是一個解決eth 以及衍生代幣快速交易的去中心化交易所。方案與uniswap 不同的是,新代幣上架,會有一段時間的鎖定,該期間會以eth 的權益為主,初始化eth 與代幣間的流動性代幣總量;鎖定結束時,會以代幣價值最低比例為初始價值,隨后將其存儲為初始流動性資金,并且以這個參考值,開啟代幣間交易配對。若有人交易,則向流動性提供者交手續費。因為以eth 的權益為主,所以杜絕新代幣產生出現的虛假價值比例。
依據以下算法結算交換eth/代幣數量:
其中:x 和y 是兩種代幣的存儲量,交易時,z 是一個固定值。進行交易時,當用戶使用x 換取y 代幣,則z 值固定,其可交換數量算式如下:
交易完成后,x 與y 的比值會變化,當這個比值變化較大并出現利差時,就會有人為掙這個利差,反向交易以平衡這個交換比例。以此就能實現一個去中心化代幣交易所,并解決過去交易所存在的快速交易問題。
本節將對社交網絡平臺設計過程中遇到的關鍵問題的解決方案進行說明,主要包括區塊鏈上的身份認證注冊、熱榜函數設計、合約數據存儲設計等。
為了防止濫用社交網絡,本文設置了注冊限制功能。當用戶提交身份信息給監管部門時,監管部門只有審核通過后,才同步鏈上的驗證碼,并將驗證碼發送給用戶。
對于鏈上驗證碼的驗證方式,因為以太坊的算力需要消耗gas,而逐字對比將會消耗大量的gas,為此,根據參考文獻[14],如圖10 所示采用驗證碼哈希值對比的方式來進行驗證。

圖10 身份認證功能設計Fig.10 Design of identity authentication function
由于一個帖子包含多種信息,而且可能在吧、用戶、母貼以及熱榜中都有副本,此外智能合約語言Solidity 和C 語言不同,不能使用指針方式直接調取,因此這導致帖子存儲資源的消耗會花上好幾倍。以太坊上的存儲資源和算力一樣都是珍貴的,權衡利弊,本文設計了一種存儲方法用算力來換取存儲資源,如圖11 所示。
帖子的原本存儲在用戶中,其他副本中都只存儲帖子的地址信息,當用戶訪問副本時,需要跳轉訪問到帖子的原本,這樣每次訪問原本,只需要多一次訪問算力,就能節省所有副本的存儲資源。
為了讓用戶擁有更好的社交體驗,本文增加了熱榜功能。任何對帖子的操作都會觸發熱榜函數,為帖子添加熱度。為了節省算力資源,只有達到一定的間隔時間,才會與熱榜中的帖子進行對比,進行替代操作。熱榜函數設計如圖12 所示。

圖12 熱榜函數設計Fig.12 Hot list function design
熱榜函數設計中,最重要的問題就是熱度值的計算,改進基于用戶投票的排名算法hacker news[15]。設P表示總投票數,T 表示發布至今的時間間隔,G 表示重力加速度,它的數值大小決定了排名隨時間下降的速度快慢。根據hacker news 得到熱度值:
設△t 表示單位時間,Ci表示各種操作參數(例如點贊,評論等),Q 表示權重比,越小權重越大。單位時間內操作的熱度值為:
其中:k 為調節Score1與Score2的權重比。Hacker news算法可以防止熱度較高的文章一直處于前列,而埋沒新內容。但也可能會導致部分熱點文章在某一個時間點才備受關注,所以添加以平衡這種情況。
將全部數據都上鏈,完全實現去中心化,需要使用智能合約將數據寫入區塊鏈中,本節對智能合約數據和相關操作函數進行設計。
4.4.1 智能合約數據設計
為實現去中心化,程序中使用的所有數據都將以storage 狀態存儲在區塊鏈當中。智能合約相關主要數據設計如表1 所示。

表1 智能合約數據設計表Tab.1 Smart contract data structure
表1 中列出設計的帖子、吧、用戶等5 個結構體,以及與其中部分結構體相關聯的2 個映射。在智能合約中結構體和映射都以storage 類型存儲,并直接存儲在區塊鏈中。
4.4.2 智能合約函數設計
智能合約函數可實現對數據的訪問與修改,本文方案的主要智能合約函數如表2 所示。通過這些智能合約函數,方案可以實現所需的各項功能。

表2 智能合約函數設計表Tab.2 Smart contract functions
對提出的方案進行實驗測試,包括功能測試和性能測試,以及相關分析。
系統原型開發全部在Linux 上進行,具體環境配置如表3 所示。以太坊以公有鏈方式發布,也可以搭建私有鏈和聯盟鏈,本文采用的是搭建公有鏈的方式[16-17]。

表3 開發環境配置Tab.3 Development environment configuration
測試環境如表4 所示:

表4 測試環境配置Tab.4 Test environment configuration
5.2.1 功能測試
對于智能合約的測試,使用以太坊官方開源的Solidity 在線集成開發環境Remix 完成。以注冊功能為例,圖13 展示在Remix 中對智能合約的測試結果。在圖13 中,在功能測試區輸入所需的參數,點擊函數名稱或 transact 按鈕即可執行函數。對于user_check_change()驗證碼更新功能,只有監管部門賬號才能調用,用戶再使用更新的驗證碼并調用register()函數才能完成注冊,如果驗證碼錯誤會報錯并重置,以此杜絕暴力破解攻擊。如果注冊成功,則返回注冊信息(用戶賬號與id),如圖14 所示。可見,合約已經按照我們在合約定義的“event”輸出注冊時提交的一些信息,便于我們確認區塊鏈中進行寫操作的執行情況。該event 將會被web3 發起交易執行時提取到Node 對象中,進而再通過頁面展現給用戶,使操作可視化。

圖13 測試智能合約里的函數Fig.13 Testing smart contract functions

圖14 智能合約執行時控制臺輸出Fig.14 Console output
對于成員注冊、創建吧、發布帖子、帖子點贊等功能,測試用例及測試結果如表5 至表8 所示。

表5 成員注冊功能測試Tab.5 Member registration function test

表6 創建吧功能測試Tab.6 Creating bar function test

表7 發布帖子功能測試Tab.7 Posting function test

表8 帖子點贊等計數操作功能測試Tab.8 Count function test
5.2.2 性能測試與分析
為了減少gas 消耗,對不同的字符串驗證方式所消耗的gas 值進行對比。這里提供四種不同的字符串驗證方式:方式1:逐字對比;方式2:先對比字符串長度再用方式1;方式3:哈希值對比;方式4:先對比字符串長度再用方式3。表9 給出了不同字符串驗證方式gas 消耗對比,使用remix 可直接測試查看運算消耗gas 的差異。從表9 可以看出,直接使用方式1 進行哈希值對比在大部分情況下表現最優,但如果在實際驗證情況中,長度不等情況占大多數,則使用方式2更優。但方式2 存在一定的安全問題,攻擊者可能通過多次測試與對比gas 消耗來猜出驗證字符的長度。所以權衡各方面利弊下,本文選擇方式1。

表9 不同字符串驗證方式gas 消耗對比Tab.9 Comparison of gas consumption of different string authentication methods
現階段社交網絡平臺依賴中心化管理,容易受到單點瓶頸限制,并存在中心化管理者篡改用戶數據、控制輿論導向,侵害用戶權益的問題。針對這些問題。本文將具有去中心化、可追溯等特性的區塊鏈技術引入社交網絡平臺,提出了一種基于以太坊的社交網絡平臺設計方案。我們利用以太坊、智能合約與現有虛擬貨幣交易所實現了分布式的社交網絡平臺。設計身份認證方案實現對濫發不良信息用戶的管理。設計基于投票的監管機制,解決中心化管理單點瓶頸限制的問題。設計基于熱榜函數的“評價-流量兌現”雙模式激勵機制,確保用戶發布良好信息的收益高于發布惡意信息。方案的安全管理不再依賴于中心化管理者。系統原型測試與分析表明方案的可行性和有效性。