羅才華
(羅定職業技術學院信息工程系,羅定 527200)
在分布式系統中,分布式數據庫的共識管理是非常重要的核心技術,也是保證分布式數據庫可以像傳統數據庫一樣使用,而不需要應用去管理分布式系統中各個節點。隨著分布式技術的發展,分布式數據庫的共識管理方案不斷在進化,而以往的分布式數據庫并不考慮拜占庭容錯問題,只考慮節點所在主機的網絡故障、宕機等非人為問題。隨著互聯網發展,大數據時代的來臨,企業間合作模式也越來越復雜化,甚至出現多方共同維護一個賬本的場景,這時候就必須要考慮可能存在惡意節點的問題,建立網絡中記賬節點的選擇機制,保證賬本數據在全網中形成一致和正確的共識。在傳統的軟件結構中,因為中心服務器(主庫)的存在,這從來就不是個問題,其他的從庫向主庫看齊就可以,但是多方分布式賬本系統是一個對等網絡結構,此結構中沒有所謂的中心節點,一切都要商量著來[1]。
在分布式計算中,各計算機通過交換信息達成共識,并按照同一協作策略行動,但有時系統的成員計算機可能會因為硬件故障、遭到惡意攻擊或網絡異常而發送錯誤信息或損壞信息,使網絡中各成員得出不同結論,從而破壞系統的一致性。拜占庭將軍問題(Byzantine Generals Problem)是Leslie Lamport(萊斯利·蘭伯特)在1982年提出的分布式對等網絡通信容錯問題[2],是對分布式共識問題的情景化描述,描述在可能存在故障節點或惡意行為條件下,分布式系統如何達成一致的共識,Leslie Lamport同時提出了該問題基于口信消息和簽名消息的兩種解決方案。拜占庭將軍問題被認為是分布式系統容錯性問題中最難和最復雜容錯模型之一,是分布式共識的基礎,具有正確性和一致性兩個交互一致性條件。
Paxos算法是由拜占庭將軍問題提出者Leslie Lamport于 1989 年在論文“The part-time parliament”中提出的一種基于消息傳遞且具有高度容錯特性的分布式系統一致性算法[3-4],由于該論文內容過于晦澀,直到1998年才通過評審和發表。谷歌分布式鎖服務Chub-by就是基于Paxos算法的應用,Paxos算法后續衍生出Abstract Paxos、Classicpaxos、Byzantine Paxos 和 Disk Paxos等變種算法,是解決異步系統共識問題最重要的算法家族[5]。基礎Paxos算法定義了以下幾種角色,Paxos算法模型如圖1所示。

圖1 Paxos算法模型圖
(1)Client:客戶端,向分布式系統發起提議并等待結果。
(2)Proposer:協調者,負責接收客戶端發起的提議,然后嘗試讓接受者接受該提議,并且保證即使提議產生沖突,算法也能進行下去。
(3)Acceptor:接受者,負責對提議進行投票,同時會記錄自己的投票歷史。
(4)Learner:學習者,如果超過半數接受者達成共識,那么學習者就會接受該提議,并做出運算結果,返回給客戶端。
Raft算法是斯坦福大學的Diego Ongaro和John Ousterhout提出的一種分布式一致性算法,其本質是Multi-Paxos的一個變種,Raft為了避免Paxos的復雜性通過簡化模型,實現了一種更容易讓人理解的共識算法,它依靠狀態機和主從同步的方式,讓集群各個節點之間實現數據的一致性,如圖2所示。Raft主要分為選取主節點和同步數據兩個階段,首先通過多個節點之間的投票競爭來選取主節點(leader),然后在選舉出來的leader基礎上進行正常操作,例如日志復制、記賬等,Raft算法中的節點共有leader(主節點)、follower(從節點)和candidate(參與投票競爭的節點)三種角色,Raft將共識問題分為“leader選舉、記賬和安全”三個相對獨立的子問題[6]。
由于PoW(Proof of Work,工作量證明)算法存在算力浪費和生成新區塊周期較長等問題[7],Sunny King提出了PoS(Proof of Stake,權益證明)共識算法。該算法用股權(持有數字貨幣的數量與時間)證明能力,幣齡(持幣量*持幣時間)越大,記賬權利越大,分配到的利息就越多,類似于財產儲存在銀行,該算法的前提是要求各驗證者(活躍參與者)需要擁有一定的資產以供質押。PoS共識機制原理是節點把自身的貨幣投入PoS機制中,身份變為驗證者,PoS機制在所有驗證者中隨機選出一個節點產生區塊,投入的貨幣越多被選中的概率越大,通過競爭產生的記賬節點將區塊廣播,達成一致共識后上鏈,并且節點數據越多網絡越穩定。PoS算法設計者基于人性逐利的假設,通過用戶選擇了正確的區塊可能會得到一定的獎勵,反之支持拜占庭錯誤區塊則有可能受到懲罰的方式,認為大部分用戶都會傾向于選擇正確區塊,因此短期的投機行為和長期的收益基本是一致的,區塊鏈系統是穩定的[8]。

圖2 Raft算法模型圖
像比特幣這樣的數字貨幣,用巨量的算力來加強網絡的安全性,因為PoW算法的存在,挖礦需要消耗大量的算力,工作量證明的概念1993年首次出現在學術論文“Pricing via Processing or Combatting Junk Mail”中,而PoW算法是在1999年才被正式提出,但是直到2009年中本聰創立了比特幣之后,這種技術才被大規模使用。中本聰意識到這種機制可以用來達成多節點網絡環境的共識,從而保證了比特幣的安全。但是,PoW算法需要所有的節點都去運算解決一個加密學的問題,這些運算者就是礦工,而第一個得到正確答案的礦工就可以得到獎勵,這些獎勵導致了一個情況,那就是礦工們正在建造越來越大的礦場,反而導致了區塊鏈的算力越來越向礦池集中化,違反了去中心化的原則。為了解決這一問題,Sunny King提出了Proof of Stake的股權證明算法,PoS算法使用一種選舉機制,隨機在網絡節點中選取一個,并且不再需要礦工,取而代之的是Validators,為了成為Validators,節點必須先抵押一定數量的Token作為Stake,抵押的數量決定了下一次選舉時被選為Validators的概率大小。如果Validators讓非法的交易計入區塊中,那么它將付出損失部分押金的代價,只要押金比獲得的交易手續費高,作弊就是不經濟的,因此PoS算法總體來說是安全的。但是也不是沒有缺點,PoW算法中,如果掌控了51%的算力,就可以進行欺騙的交易;而PoS算法中,如果掌控了51%的股權,同樣可以做到,但是掌控51%的股權遠比掌控51%的算力要困難得多,所以實際上針對PoS機制發起攻擊的可能性遠比PoW小。
傳統分布式系統一致性算法Paxos、Raft不考慮拜占庭容錯,即假設不存在惡意篡改和偽造數據的拜占庭節點,認為所有節點都是可信任的。因此,在很長一段時間里,傳統分布式一致性算法的應用場景大多是節點數量有限且相對可信的分布式數據庫環境[9]。隨著社會經濟轉型和“大智云物移”技術的快速發展,企業間合作方式也越來越復雜化和多樣化,多運營方共用一個賬本的需求越來越多,例如多方企業的物聯網共享數據、金融行業多方交易轉賬和電商平臺與商家賬本同步等等,每一方都有自己的機房存儲賬本。現在最普遍的做法就是約定時間對賬清算,這種方式效率不高,如果出現賬本不一致,可能還會引發信任問題。因此,迫切需要一種解決方案來保障開放、多節點(可能存在惡意拜占庭節點)和賬本場景復雜環境下多方分布式賬本可靠和一致問題。
從本質來看,Paxos、Raft、PoW、PoS 算法都是為了解決“誰來寫”的問題,實際就是為了決定把誰作為持久化日志存儲的基準,這四種共識算法對比情況如表1所示。在多活架構中,每個節點都可以進行寫入操作,為了讓所有節點達成一致,就必須在某個時刻所有節點向一個節點看齊。而PoS共識算法就是為了解決拜占庭容錯問題、實現去中心化,也就是“異地多活”的實現。PoS共識算法不僅決定了“誰應該寫”的問題,并且還能確定“寫的東西是不是真實”(拜占庭問題),實現了多方賬本數據真實、可靠、一致。基于此,本文對多方企業的物聯網共享數據和金融行業多方交易轉賬提出了新的解決方案,如圖3、圖4所示。

表1 四種共識算法對比

圖3 多方企業的物聯網共享數據模型

圖4 金融行業多方交易轉賬模型
基于PoS共識算法能有效解決分多方布式賬本中“誰來寫”和“寫的東西是不是真實”等問題,實現多方賬本數據的真實、可靠、一致。本文以多方企業的物聯網共享數據和金融行業多方交易轉賬為例,提出了基于PoS共識算法的多方分布式賬本解決方案,有助于解決多方賬本企業場景下信任合作的痛點,相對于傳統定時對賬清算,效率更高、選舉更加透明公正,結合分布式數據庫,實現多方異地數據一致性。