迅雷鏈在做什么?

隨著區(qū)塊鏈 3.0 的技術(shù)革新,在保證區(qū)塊鏈本身公開(kāi)、篡改、透明特性的基礎(chǔ)上,還需要能夠支持商業(yè)級(jí)別的高性能的底層平臺(tái)技術(shù)。迅雷鏈獨(dú)創(chuàng)同構(gòu)多鏈框架,實(shí)現(xiàn)鏈的平行擴(kuò)展,從而可達(dá)百萬(wàn)TPS,滿足商業(yè)級(jí)別的應(yīng)用。

迅雷鏈上最大規(guī)模的區(qū)塊鏈應(yīng)用也是目前國(guó)內(nèi)ToC端最大規(guī)模的應(yīng)用就是共享計(jì)算,目前共享計(jì)算節(jié)點(diǎn)已有百萬(wàn)量級(jí),這對(duì)于底層的區(qū)塊鏈技術(shù)也帶來(lái)了很大的挑戰(zhàn),這也是迅雷鏈做出高性能超級(jí)區(qū)塊鏈的動(dòng)力開(kāi)源。

共享計(jì)算是把老百姓家里閑置的帶寬跟企業(yè)所需要的帶寬有效的結(jié)合起來(lái),提升整個(gè)社會(huì)資源配置效率。那么,區(qū)塊鏈起到一個(gè)什么作用?區(qū)塊鏈記錄供給方和需求方的權(quán)力義務(wù)關(guān)系,讓分散的個(gè)體,能夠平等的與企業(yè)對(duì)話,并激勵(lì)用戶自發(fā)地更早期地參與到共享計(jì)算的體系中來(lái)。

迅雷鏈的系統(tǒng)架構(gòu)

下圖為迅雷區(qū)塊鏈的技術(shù)棧,可以直觀的看出各模塊的分工和協(xié)作。

(一)最上層的應(yīng)用層,是 C 端用戶直接接觸到產(chǎn)品和服務(wù),包括賬戶客戶端、第三方客戶端和合約應(yīng)用。

1. 賬戶客戶端:主要指迅雷鏈的鏈克口袋,負(fù)責(zé)管理鏈上資產(chǎn)。用戶可以通過(guò)鏈克獲取網(wǎng)絡(luò)加速、數(shù)字內(nèi)容等多種增值服務(wù)。而鏈克的查詢、兌換請(qǐng)求是通過(guò)服務(wù)層的“數(shù)據(jù)請(qǐng)求服務(wù)”提供的接口來(lái)完成。另一方面,鏈上資產(chǎn)如果是依托于某個(gè)智能合約,這部分資產(chǎn)的查詢和信息修改,就需要通過(guò)服務(wù)層提供的“合約調(diào)用”接口轉(zhuǎn)發(fā)到基礎(chǔ)層的鏈上執(zhí)行。

2. 第三方客戶端:主要指接入鏈克兌換的產(chǎn)品和服務(wù),比如迅雷直播。用戶在這些應(yīng)用中使用鏈克兌換產(chǎn)品和服務(wù),會(huì)命令鏈克口袋相應(yīng)鏈克。如果是在 pc、電視端等發(fā)出的請(qǐng)求,會(huì)彈出二維碼響應(yīng)。服務(wù)層的“數(shù)據(jù)請(qǐng)求服務(wù)”會(huì)跟第三方客戶端的后臺(tái)服務(wù)交互,通知兌換信息是否入鏈成功。

3. 合約應(yīng)用:指基于迅雷鏈開(kāi)發(fā)的 DAPP。應(yīng)用中使用的合約通過(guò)服務(wù)層的“合約部署”服務(wù)部署到區(qū)塊鏈上。DAPP 中的合約調(diào)用通過(guò)服務(wù)層的“合約調(diào)用”模塊進(jìn)行校驗(yàn),合法的才會(huì)轉(zhuǎn)到鏈上處理。

(二)中間的服務(wù)層作為應(yīng)用和鏈之間的橋梁,提供應(yīng)用層需要的接口和服務(wù)。包括安全控制、合約部署、合約請(qǐng)求和數(shù)據(jù)請(qǐng)求服務(wù)。

1. 安全控制:這一層類(lèi)似互聯(lián)網(wǎng)架構(gòu)的接入層,其核心功能就是做好鑒權(quán)、合法性校驗(yàn)等安全工作,將問(wèn)題擋在最外層。

2. 合約部署:合約部署的觸發(fā)主要是迅雷鏈內(nèi)部的審核系統(tǒng)觸發(fā),只有企業(yè)資質(zhì)審核通過(guò)并且產(chǎn)品內(nèi)容合法合規(guī),才會(huì)被部署到迅雷鏈上。同時(shí),迅雷鏈?zhǔn)峭瑯?gòu)多鏈框架,合約會(huì)有自己所屬的鏈,并在該鏈上完成合約創(chuàng)建。而普通鏈上的用戶發(fā)起合約調(diào)用時(shí),用戶所在鏈請(qǐng)求入塊后,需要知道將該請(qǐng)求和區(qū)塊路由到哪個(gè)鏈上,所以合約部署時(shí)還需將合約的路由信息通知到所有鏈。

3. 合約調(diào)用:檢查合約調(diào)用接口中參數(shù)的合法性,比如合約地址是否存在等。對(duì)于不合法的請(qǐng)求直接返回失敗,合法的請(qǐng)求會(huì)轉(zhuǎn)發(fā)給基礎(chǔ)層。

4. 數(shù)據(jù)請(qǐng)求服務(wù):該模塊包含鏈克相關(guān)的所有請(qǐng)求,包括查詢余額、查詢兌換記錄、執(zhí)行兌換等。對(duì)于余額、兌換記錄這類(lèi)請(qǐng)求量很大的模塊,會(huì)在所有接入節(jié)點(diǎn)上做緩存,每個(gè)節(jié)點(diǎn)通過(guò)基礎(chǔ)層的“訂閱及通知服務(wù)”訂閱區(qū)塊信息。當(dāng)收到區(qū)塊產(chǎn)生的通知后,可以立即解析區(qū)塊內(nèi)信息,并修改緩存中的余額和兌換記錄。對(duì)于執(zhí)行兌換的請(qǐng)求先校驗(yàn)合法性,再將合法請(qǐng)求轉(zhuǎn)到基礎(chǔ)層。

(三) 最底層也叫基礎(chǔ)層,是構(gòu)成迅雷鏈最核心的組成部分,由 11 個(gè)模塊組成。

1. 路由模塊:包括普通請(qǐng)求路由和合約路由。當(dāng)請(qǐng)求到達(dá)時(shí),路由模塊會(huì)根據(jù)請(qǐng)求中 from(發(fā)起方)地址,將請(qǐng)求路由到該用戶所屬的鏈;另一方面,當(dāng)請(qǐng)求入塊,需要鏈間通信將請(qǐng)求和區(qū)塊信息同步到目的鏈時(shí),也需要路由模塊的信息。

2. 跨鏈模塊:包括鏈間通信和跨鏈確認(rèn)。該模塊將已入鏈的區(qū)塊中,需要跨鏈的請(qǐng)求、證明信息、區(qū)塊信息同步到對(duì)應(yīng)鏈。

3. 訂閱通知模塊:該模塊是為了支持“數(shù)據(jù)請(qǐng)求服務(wù)”功能,需要及時(shí)拿到新入鏈的區(qū)塊數(shù)據(jù),比如監(jiān)控服務(wù)、余額查詢服務(wù)等。

4. 共識(shí):包括共識(shí)算法和校驗(yàn)。這是區(qū)塊鏈與分布式存儲(chǔ)服務(wù)共同的核心模塊,區(qū)塊鏈的共識(shí)比普通的分布式存儲(chǔ)服務(wù)多了一些安全上的校驗(yàn),比如日志。所有參與共識(shí)的節(jié)點(diǎn)需要對(duì)區(qū)塊校驗(yàn)其內(nèi)部數(shù)據(jù)的合法性。至于如何達(dá)成共識(shí)就跟共識(shí)算法有關(guān)了,迅雷鏈采用的共識(shí)算法是 pbft,具體算法的原理和選擇理由下一次分享會(huì)繼續(xù)介紹。

5. 賬戶管理:主要是賬戶密鑰的生成,這部分會(huì)做成庫(kù)給賬戶客戶端使用。另一方面是對(duì)賬戶的權(quán)限管理。

6. 請(qǐng)求池:收到的請(qǐng)求需要在這里等待校驗(yàn)合法性,通過(guò)后被放入等待入塊的隊(duì)列。

7. 智能合約:迅雷鏈上有越來(lái)越多的應(yīng)用在接入,這些應(yīng)用的業(yè)務(wù)邏輯代碼其實(shí)就是智能合約。而智能合約代碼是獨(dú)立于區(qū)塊鏈程序的,所以需要在區(qū)塊鏈程序中運(yùn)行虛擬機(jī)來(lái)解釋和執(zhí)行。再者,智能合約里面需要讀取和修改區(qū)塊鏈上的數(shù)據(jù),所以虛擬機(jī)還要提供方法來(lái)與區(qū)塊鏈交互。

8. 數(shù)據(jù)存儲(chǔ):包括區(qū)塊、原始請(qǐng)求和用戶數(shù)據(jù)。相比于以比特幣為代表的 UTXO 模型,迅雷鏈選擇了基于賬戶模型,方便支持智能合約。迅雷鏈的本地存儲(chǔ)系統(tǒng)選擇的是 leveldb,在數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)上借鑒了以太坊的精髓,包括交易樹(shù)、賬戶樹(shù)、事件樹(shù)。每種樹(shù)都是一個(gè) merkletree,在區(qū)塊頭部只存儲(chǔ)樹(shù)的 root 的 hash。

9. 密碼學(xué):包括簽名和加密。這也是區(qū)塊鏈非常核心和獨(dú)特的模塊,區(qū)塊鏈的不可篡改、隱私保護(hù)等特點(diǎn)都是源于此,涉及簽名、摘要計(jì)算、公私鑰對(duì)的生成等。

10. 網(wǎng)絡(luò)通信:包括 P2P 和 RPC。區(qū)塊鏈中所有參與的記賬節(jié)點(diǎn)都是對(duì)等的,記賬節(jié)點(diǎn)之間包括請(qǐng)求、區(qū)塊等信息都需要網(wǎng)絡(luò)送達(dá),當(dāng)然要做一個(gè)健壯的區(qū)塊鏈網(wǎng)絡(luò),在網(wǎng)絡(luò)通信模塊還需要不斷優(yōu)化。

11. 通用模塊:包括壓縮和事件機(jī)制。因?yàn)橘~戶模型里要存儲(chǔ)的數(shù)據(jù)信息相對(duì)較多,而且隨著時(shí)間推移,鏈的長(zhǎng)度也越來(lái)越大,所以數(shù)據(jù)落盤(pán)前需要壓縮。事件機(jī)制主要是為外圍系統(tǒng)提供鏈上執(zhí)行合約、鏈上區(qū)塊產(chǎn)生等底層支持。

案例:上鏈請(qǐng)求的執(zhí)行過(guò)程

以用戶在客戶端應(yīng)用中發(fā)起鏈克兌換為例。

1.鏈克口袋將請(qǐng)求發(fā)到鏈的服務(wù)層–從架構(gòu)角度看的最外層就是接入層;

2.接入層會(huì)根據(jù) from(發(fā)起方)地址將請(qǐng)求路由到對(duì)應(yīng)鏈的鏈,接入層也會(huì)判斷請(qǐng)求的合法性,針對(duì)非法的請(qǐng)求直接返回失敗;

3.外層驗(yàn)證 ok 后,會(huì)進(jìn)入服務(wù)層–從架構(gòu)角度看的內(nèi)層,會(huì)驗(yàn)證請(qǐng)求是否為重放、余額是否不足等;

4.服務(wù)層驗(yàn)證通過(guò)的請(qǐng)求到達(dá)基礎(chǔ)層–從架構(gòu)角度看就是我們的記賬節(jié)點(diǎn),也叫驗(yàn)證人;

5.記賬節(jié)點(diǎn)之間轉(zhuǎn)發(fā)請(qǐng)求,記賬節(jié)點(diǎn)中本輪的 proposer 負(fù)責(zé)發(fā)起區(qū)塊,區(qū)塊數(shù)據(jù)在幾個(gè)記賬節(jié)點(diǎn)之間也相互轉(zhuǎn)發(fā),收到區(qū)塊的節(jié)點(diǎn)進(jìn)行投票,并把投票信息廣播,根據(jù)我們的 pbft 共識(shí)算法記賬節(jié)點(diǎn)達(dá)成共識(shí),區(qū)塊入鏈;

6.新區(qū)塊產(chǎn)生后,記賬節(jié)點(diǎn)中鏈間通信的模塊會(huì)針對(duì)新區(qū)塊中涉及跨鏈的請(qǐng)求,依次根據(jù)請(qǐng)求的目的鏈,將跟該目的鏈有關(guān)的請(qǐng)求原始數(shù)據(jù)、本鏈的區(qū)塊頭信息、本鏈的交易證明信息等轉(zhuǎn)發(fā)給目的鏈的記賬節(jié)點(diǎn);

7.目的鏈的記賬節(jié)點(diǎn)將收到的信息轉(zhuǎn)發(fā),并達(dá)成共識(shí),將請(qǐng)求寫(xiě)入目的鏈區(qū)塊的同時(shí)也完成了目的鏈對(duì)應(yīng)地址的余額增加。

從使用的角度再看同構(gòu)多鏈框架

所謂同構(gòu)多鏈框架,顧名思義就是有多條鏈,每條鏈上都運(yùn)行相同的程序。不同用戶的請(qǐng)求會(huì)發(fā)到不同的鏈上進(jìn)行處理。

當(dāng) A、B、C、D 同時(shí)發(fā)起請(qǐng)求,比如有 A->B,A->C,A->D , 同時(shí)有 B->C, C->D,D->E。A、B、C、D 根據(jù)路由規(guī)則落到不同的鏈上,四條鏈可以并行進(jìn)行處理,如果一條鏈每秒的打包請(qǐng)求并落區(qū)塊的速度是 1000,那么上千條鏈,就可以達(dá)到百萬(wàn) TPS。

對(duì)于普通請(qǐng)求,消耗的鏈克 gas 是固定的,這種鏈間的處理是相對(duì)容易的,而支持智能合約,需要一些額外的處理。因?yàn)橐乐箰阂獾暮霞s或者合約本身的 bug 導(dǎo)致占用大量資源,所以需要根據(jù)合約執(zhí)行情況扣除相應(yīng)的鏈克 gas。

消耗的鏈克 gas 是需要從請(qǐng)求發(fā)起方的賬戶里扣除的,而真正執(zhí)行合約的是在合約所在的另一條鏈,所以最終需要的具體數(shù)量,在發(fā)起請(qǐng)求方所在鏈入鏈這筆請(qǐng)求的時(shí)候尚未可知,這怎么辦呢?

解決辦法是在發(fā)起方所在鏈扣除請(qǐng)求中傳入的 gasLimit 值,也就是用戶指定的上限值,這個(gè)請(qǐng)求入塊后同步到合約所在鏈,合約執(zhí)行后請(qǐng)求入塊能知道這筆請(qǐng)求真正扣掉的通證數(shù)量,再通過(guò)鏈間通信將鏈里面入塊的合約調(diào)用請(qǐng)求同步到發(fā)起方所在鏈,發(fā)起方確認(rèn)合約鏈的區(qū)塊數(shù)據(jù),并把多扣掉的通證退回給發(fā)起方。這些對(duì)賬戶余額的操作在鏈上都有相應(yīng)的操作記錄寫(xiě)入,方便對(duì)賬。

迅雷鏈整體性能如何按需進(jìn)行水平擴(kuò)展?

前文介紹了整體吞吐的提升主要通過(guò)增加新鏈的方式,那怎么能做到輕量地增加新鏈呢?

迅雷鏈的路由規(guī)則選擇的是最簡(jiǎn)單直接的針對(duì)地址取模,比如針對(duì) 1024 取模,因?yàn)榈刂肥歉鶕?jù)公鑰經(jīng)過(guò) hash 運(yùn)算出來(lái)的,整體隨機(jī)分布,所以基本上所有用戶會(huì)平均分布到這些鏈上。

以當(dāng)前有 1024 條鏈舉例,其編號(hào)從 0 到 1023,地址取模結(jié)果是 1、1025、2049、3073、……會(huì)落到 1 號(hào)鏈。 那么當(dāng)我們想擴(kuò)容到 2048 條鏈的時(shí)候,實(shí)際上是原來(lái)每條鏈上的一半用戶遷移到新鏈。新鏈啟動(dòng)時(shí)區(qū)塊數(shù)據(jù)來(lái)自原來(lái)的鏈,比如 1025 號(hào)鏈的數(shù)據(jù)來(lái)自原來(lái)的 1 號(hào)鏈,原來(lái)在 1 號(hào)鏈上地址取模為 1025、3073、……的用戶數(shù)據(jù)之后會(huì)都落在 1025 這條鏈;而原來(lái)在 1 號(hào)鏈上地址取模為 1、2049、……的用戶數(shù)據(jù)之后還在 1 號(hào)這條鏈上。

通過(guò)這樣的方式,可以讓擴(kuò)鏈的整體變動(dòng)最小化。

文/來(lái)鑫

 

分享到

songjy

相關(guān)推薦