布比區塊鏈的多鏈分片技術是一種“二層擴容技術”,可從一條主鏈平滑地擴充套件多條子鏈,每條子鏈都負責部分計算和儲存業務,即鏈的數量可以隨著業務量和資料的增加而增加。主鏈負責管理子鏈,保障鏈的安全性;子鏈繼承主鏈的安全性,並且承載業務執行,子鏈的資料增長不會影響到主鏈及其他子鏈的效率,有效實現了資源隔離。
布比多鏈設計了主鏈與子鏈雙層體系,讓區塊鏈更容易擴充套件。布比多鏈將不同業務的交易處理、狀態儲存、交易下載和廣播進行拆分,不同子鏈的節點處理各自的業務。
布比多鏈包括兩種型別的鏈,一種是主鏈 Main Chain,負責子鏈驗證節點選取、子鏈區塊提案人選取、子鏈狀態儲存、惡意行為懲罰等;一種是子鏈 Child Chain,可以存在多個子鏈,根據不同業務特點搭建不同子鏈。不同型別、不同業務的主鏈與子鏈體現出多型特點。
布比多鏈還設計了多層體系化安全保證機制:在子鏈驗證節點選舉過程中採用混洗等機制,使得驗證節點在子鏈的分佈均勻化、隨機化;設計了可校驗的主鏈子鏈關鍵資料關聯機制,在不提取子鏈全部資料的前提下,即可校驗子鏈資料合法性;設計挑戰者機制和子鏈區塊確認機制,有效抵禦賄賂攻擊、惡意提交等攻擊行為。
2. 多鏈分片的防重放攻擊
為了防止重放攻擊,布比多鏈提出了統一賬號,只需要一個賬號就能在多鏈之間傳送交易以及轉移資產。在多鏈場景下,理論上攻擊者可以將同一份交易分別傳送給不同的鏈以獲取不當利益,從而形成多鏈之間的重放攻擊。使用者去查詢賬戶資訊時,僅需一個賬號就能看到所有鏈的資產資訊,使得重放攻擊無法開展。
上圖展示了防重放攻擊的過程:普通使用者Alice 傳送交易,比如交易為Tx-1,內容為Alice轉移10個資產給Bob。Alice對交易Tx-1進行簽名,隨後將交易傳送給Main Chain。Main Chain透過Unified Identity—0x1000識別出這是發給自己的交易,因為只有Main Chain的id為0x1000,則打包交易Tx-1。
Hacker擷取該交易並嘗試重放攻擊。Hacker 複製 Tx-1這筆交易併傳送到Chain N,Chain N透過Unified Identity:0x1000識別出Chain N的id不是0x1000,判定該交易是無效交易。
3. 多鏈賬本的資料結構
布比多鏈賬本透過資料結構的最佳化實現高可擴充套件性,具體包括:統一賬戶結構、區塊結構、交易樹、收據樹等。詳細的賬本結構如下:
布比多鏈可以視為同構鏈體系,採用全域性統一賬戶結構,目的是讓使用者在只生成一對公私鑰的情況下,即可在所有鏈上發起交易,且多鏈之間的交易不會有重放攻擊問題存在。賬戶樹包括了從地址到賬戶狀態之間的對映, 賬戶儲存樹儲存了與智慧合約相關的資料資訊。 賬戶樹的根節點雜湊值由區塊儲存(在 account_tree_hash 欄位),標示了區塊建立時的當前狀態。每個賬戶都有一個賬戶儲存樹。
4. 挑戰者機制設計
在布比區塊鏈中,挑戰者對子鏈進行監督,一旦發現子鏈提交的區塊資料存在問題,即可向主鏈傳送抵押金對子鏈發起挑戰,並提交SPV資訊用於演算校驗。由於子鏈驗證節點抵押了大量押金,一旦Challenger挑戰成功,則惡意節點的驗證節點押金將獎勵給挑戰者。透過這種激勵方法鼓勵所有節點參與子鏈監督。
如果惡意節點透過賄賂攻擊方式攻擊子鏈,則需收買該子鏈的所有驗證節點或行賄挑戰者,下面分別進行分析。首先是收買子鏈驗證節點的情況,假設總的賄賂金為ε,則ε至少為驗證節點的質押金之和Pt,否則驗證節點沒有作惡動機。其次是行賄挑戰者情況,惡意節點需要找到所有的挑戰者,考慮到任何一個節點都可以充當子鏈的挑戰者角色,並且挑戰者的獎勵是Pt,挑戰者有足夠的動力去挑戰,因此惡意節點很難對子鏈發起賄賂攻擊。
布比多鏈挑戰者工作過程如下:
挑戰者發現當前同步的區塊出現異常,同時發現主鏈已經收錄此次區塊資訊,挑戰者發起對異常區塊的挑戰。
挑戰者將上一個區塊的狀態資料和此次交易資料打包組成SPV證明資料傳送給主鏈合約去進行校驗。
主鏈驗證節點進行輕節點演算過程成功後,重新到子鏈中下載相關的SPV資料進行比對校驗。
校驗正確表示挑戰成功,之後對該子鏈的驗證節點保證金進行懲罰,並獎勵Challenger。
主鏈確定提交的區塊資料無效後,啟動取消後續區塊確認的過程,子鏈區塊頭確認在最後一個安全的區塊頭位置,直到重新提交正確區塊資訊,保證子鏈恢復健康執行。