腾讯十年老兵:区块链本质上是一个异地多活的分布式数据库
區(qū)塊鏈前哨導(dǎo)讀:本文整理自 9 月 8 日“騰訊技術(shù)工程—區(qū)塊鏈技術(shù)沙龍”上的演講。
講師介紹:潘安群,騰訊 TEG 計費平臺部賬戶中心總監(jiān),專家工程師;中國計算機學會 CCF 區(qū)塊鏈專業(yè)委員會委員;有近 10 年分布式存儲研發(fā)經(jīng)驗,目前負責分布式 Cache 系統(tǒng)厚德(Hold)、分布式數(shù)據(jù)庫 TDSQL,以及騰訊云區(qū)塊鏈 TBaaS 平臺的技術(shù)研發(fā)工作。
本文主要有四個部分的內(nèi)容:
\\- 從分布式數(shù)據(jù)庫角度看區(qū)塊鏈\\t
- 騰訊云區(qū)塊鏈服務(wù) TBaaS 技術(shù)介紹\\t
- 智能合約開發(fā)及示例\\t
- 快速部署及運營配套\
1. 從分布式數(shù)據(jù)庫角度看區(qū)塊鏈
\\區(qū)塊鏈是源于比特幣中的底層技術(shù),用于實現(xiàn)一個無中心的點對點現(xiàn)金系統(tǒng),因為沒有權(quán)威中心機構(gòu)的參與,比特幣以區(qū)塊鏈的形式來組織交易數(shù)據(jù),防止“雙花”,達成交易共識。
\\傳統(tǒng)意義上的數(shù)字資產(chǎn),比如游戲幣,是以集中式的方式管理的,僅能在單個系統(tǒng)中流轉(zhuǎn),由某個中心化機構(gòu)負責協(xié)調(diào),通常以數(shù)據(jù)庫的方式來存儲。宏觀上看,區(qū)塊鏈和數(shù)據(jù)庫一樣,都是用來保存數(shù)據(jù),只是數(shù)據(jù)存取的形式有所不同。
\\區(qū)塊鏈本質(zhì)上是一個異地多活的分布式數(shù)據(jù)庫。異地多活的提出,原本是為了在解決系統(tǒng)的容災(zāi)問題,多年來也一直是分布式數(shù)據(jù)庫領(lǐng)域在探索的方向,但鮮有成效,因為異地多活需要解決數(shù)據(jù)沖突的問題,這個問題其實不好解決。然而誕生于比特幣的區(qū)塊鏈以一種全新的方式實現(xiàn)了全球最大的異地多活數(shù)據(jù)庫,它完全開放,沒有邊界,支持上萬節(jié)點并可隨機的加入和退出。
\\\\在區(qū)塊鏈中數(shù)據(jù)沖突問題就更加突出了,區(qū)塊鏈里每個節(jié)點是完全對等的多活架構(gòu),上萬個節(jié)點要達成一致,數(shù)據(jù)以誰為準呢?比特幣采用的方式是 POW,大家來算一個謎題,誰先算出來,就擁有記賬權(quán),在這個周期,就以他所記的賬為準,下一個周期大家重新計算。爭奪記賬權(quán)的節(jié)點決定將哪些交易打包進區(qū)塊,并將區(qū)塊同步給其他節(jié)點,其他節(jié)點仍然需要基于本地數(shù)據(jù)對區(qū)塊中的交易做驗證,并不像數(shù)據(jù)庫的主從節(jié)點間那樣無條件接受,這就是區(qū)塊鏈里的共識算法。POW 雖然消耗大量算力,好處是在爭奪記賬權(quán)的過程中 POW 只要在自身節(jié)點中計算 hash,不需要經(jīng)過網(wǎng)絡(luò)投票來選舉,網(wǎng)絡(luò)通信的代價小,適合大規(guī)模節(jié)點之間共識。POW 是目前公有鏈里最完備最簡單最粗暴做法,最經(jīng)得起考驗,但問題是效率太低。
\\\\所以后面發(fā)展出了 PoS、DPoS,誰擁有資產(chǎn)最多,誰就擁有記賬權(quán),或者大家投票,但這樣又引入了經(jīng)濟學方面的問題,比如所謂的賄選的問題,這就不太好控制了。在傳統(tǒng)分布式數(shù)據(jù)庫里,不叫共識算法,而叫一致性算法,本質(zhì)上也是一回事。但分布式數(shù)據(jù)庫里一般節(jié)點數(shù)都很少,而且網(wǎng)絡(luò)是可信的,通常節(jié)點都是安全可靠的,我們基本上可以相信每一個節(jié)點,即使它出現(xiàn)故障,不給應(yīng)答,但絕對不會給出假應(yīng)答。所以在傳統(tǒng)公司分布式數(shù)據(jù)里,都用 Raft 或 Paxos 協(xié)議去做這種一致性算法。
\\后來產(chǎn)生了聯(lián)盟鏈,若干企業(yè)組成一個聯(lián)盟,加入聯(lián)盟的組織或機構(gòu)需要進行身份認證,基本上能夠確認它們的身份是可信的。所以聯(lián)盟鏈跟公有鏈的共識算法是不太一樣的,聯(lián)盟鏈主要采用 PBFT 或更簡單的 Raft。
\\以太坊提出了智能合約的概念,可以實現(xiàn)各種邏輯, 而在分布式數(shù)據(jù)庫中可以利用存儲過程來實現(xiàn)類似功能。
\\區(qū)塊鏈在解決橫向擴展問題上,可以采取分片 / 跨鏈等方式,和分布式數(shù)據(jù)庫里中的 Auto-Sharding 技術(shù)類似, 在處理過程中,都需要保證事務(wù)的完整性。
\\\\整體從純技術(shù)角度來看,本質(zhì)上區(qū)塊鏈跟分布式數(shù)據(jù)庫沒什么太大的區(qū)別。但他們的路線,或者要解決的問題是不一樣的,區(qū)塊鏈側(cè)重于抵御審查和安全性,而分布式數(shù)據(jù)庫側(cè)重于用戶體驗和性能效率。
\\產(chǎn)品上來看二者的側(cè)重點有著顯著的不同。抵御審查是以比特幣為代表的區(qū)塊鏈最重要的特性,也是比特幣賴以生存的基礎(chǔ),因為比特幣不屬于任何人或組織,沒有誰能代表比特幣,比特幣沒有主體,所以各國政府或權(quán)威部門都無法關(guān)停比特幣。然后是安全性,區(qū)塊鏈賬本有成千上萬份副本分散在全球各地,數(shù)據(jù)幾乎永不丟失,同時利用所有節(jié)點的相互制約,沒人能夠惡意篡改數(shù)據(jù)。這兩者是區(qū)塊鏈的重心,表現(xiàn)出來就是大家常說的去中心化。
\\用戶體驗和性能相對于前兩個核心目標來說,不是區(qū)塊鏈最側(cè)重的,比特幣動用巨大的算力來運行秒只有幾個 TPS 的系統(tǒng),數(shù)據(jù)冗余了上萬份副本,一筆交易可能需要數(shù)十分鐘才能提交,提交后的交易還可能因為被判定為“雙花”而取消,而這些問題在數(shù)據(jù)庫上都是不能接受的。二者產(chǎn)品上的側(cè)重點不同,從而導(dǎo)致技術(shù)實現(xiàn)上的差異.
\\2. 騰訊云區(qū)塊鏈服務(wù) TBaaS 技術(shù)介紹
\\\\該架構(gòu)有以下幾個主要模塊:
\\- 成員管理,要對成員有準入的控制,提供身份保證、內(nèi)容保密、交易審計等功能\\t
- 區(qū)塊的服務(wù),要有一些底層基礎(chǔ)的服務(wù)、共識算法和 P2P 的通訊協(xié)議,用于維護分布式賬本\\t
- 頁面封裝,提供 RESTFul API 來訪問各種服務(wù),提供 CLI 客戶端工具,使開發(fā)人員能夠快速測試賬鏈代碼\\t
- 賬鏈代碼,用于構(gòu)成智能合同,它嵌在交易中,所有確認節(jié)點確認交易前都必須執(zhí)行它\
在 Fabric 架構(gòu)中拆分了幾個模塊,最重要的是 Peer 和 Orderer, Order 主要處理共識過程,而其他所有業(yè)務(wù)邏輯是在 peer 執(zhí)行。
\\\\在部署方面的話,是按照不同的組織部署自己的環(huán)境,然后通過共識網(wǎng)絡(luò)組合成聯(lián)盟鏈。Fabric 支持共識算法、身份認證和加密算法的插件化,背書和驗證程序的插件化,以及可配置 state 數(shù)據(jù)庫。
\\\\不同場景不同行業(yè)對區(qū)塊鏈的需求不同,側(cè)重點不同,如共識算法、安全級別、加密算法、賬戶模型等,作為一個 BaaS 平臺,需要支持模塊插件式的架構(gòu)設(shè)計以應(yīng)對行業(yè)的不同需求,TBaaS 基于 fabric 開發(fā)。
\\共識算法: 基于 kafka-zookeeper, raft,pbft。
\\身份認證 是聯(lián)盟鏈重要的部分,用來區(qū)分不同的聯(lián)盟成員,實現(xiàn)不同類型的權(quán)限控制(channel 的創(chuàng)建,修改,chaincode 的讀寫權(quán)限等)。
\\通用的 編程語言 可以方便區(qū)塊鏈與鏈外系統(tǒng)的交互(有限制,鏈外數(shù)據(jù)經(jīng)常變化,會導(dǎo)致不同 peer 讀到不同的結(jié)果)。智能合約語言方面,我們支持通用的 golang、JS、Java。私有數(shù)據(jù)隔離保護:私有數(shù)據(jù)不公開在鏈上賬本中,僅公開私有數(shù)據(jù)的 hash,私有數(shù)據(jù)通過 gossip 協(xié)議點對點傳遞到指定節(jié)點。安全隱私方面,支持硬件加密機,支持國密算法,在多鏈設(shè)計上做了數(shù)據(jù)的物理隔離,私有數(shù)據(jù)也做了隔離保護。
\\\\TBaaS 邏輯上分成三個組件:背書節(jié)點,共識節(jié)點,驗證節(jié)點,其中背書節(jié)點是驗證節(jié)點的一個子集。
\\交易依次在三個組件上執(zhí)行,采用三階段的交易流程:執(zhí)行合約—打包區(qū)塊—交易驗證。
\\Execute:背書節(jié)點模擬合約執(zhí)行,執(zhí)行成功后對結(jié)果簽名背書, 背書策略就是定義什么樣背書節(jié)點的組合是有效的背書。
\\Order:共識節(jié)點對背書后的交易打包成區(qū)塊,生成全局交易序列。
\\Validate: 驗證節(jié)點驗證區(qū)塊生成者的簽名,驗證交易發(fā)起者的簽名,驗證背書策略是否符合,驗證數(shù)據(jù)版本號等,驗證通過后最終提交到賬本。
\\把背書節(jié)點從驗證節(jié)點中分離,方便設(shè)置靈活的背書策略,不需要每個節(jié)點都參與背書,聯(lián)盟中有權(quán)威的機構(gòu)可參與背書,只有背書節(jié)點才需要查看合約,便于保護合約的隱私。
\\把共識節(jié)點從驗證節(jié)點中分離,是為了更好的可擴展性,不需要全部節(jié)點都參與共識,否則聯(lián)盟中節(jié)點數(shù)過多,會導(dǎo)致共識代價過大(pbft 需要大量的節(jié)點間通信來達成共識)。
\\如果全節(jié)點參與智能合約的執(zhí)行,全節(jié)點參與共識,就類似以太坊等公有鏈行為,采用三階段方式是出于靈活性、可擴展性、隱私等方面考慮。
\\\\在最后的驗證階段, 有大量的加解密計算和 IO 操作,容易形成性能瓶頸。區(qū)塊的計算是有順序的,是串行的過程。所以我們把驗證與提交階段拆成了五個階段,像流水線的方式去執(zhí)行。
\\Pipeline 方案保證交易順序全局一致的情況下,可以將區(qū)塊提交分成 N 個階段,每階段可并行執(zhí)行,區(qū)塊間的處理順序不變,但同一時刻最多有 N 個區(qū)塊并行,交易吞吐量最高可提升 N 倍并發(fā)必然引入數(shù)據(jù)競爭,比如某一數(shù)據(jù)在相鄰兩個區(qū)塊中執(zhí)行先讀后寫,在不同節(jié)點的執(zhí)行環(huán)境中,多線程的執(zhí)行時序存在差異,有可能部分節(jié)點讀到新版本,部分讀到舊版本(mvcc 沖突),同時還有幻讀等一系列數(shù)據(jù)庫常見問題。
\\通過預(yù)處理方式,可以讓每個節(jié)點在執(zhí)行到 pipeline 的同一階段時能看到同樣的數(shù)據(jù)視圖
\\3. 智能合約開發(fā)及示例
\\\\這是我們跟合作伙伴做的一個通兌積分的產(chǎn)品。現(xiàn)在很多機構(gòu)都有自己的積分,但數(shù)量少的話沒什么用,我們想把這些積分能夠整合起來,做到通兌積分,解決積分的出口問題。
\\4. 快速部署及運營配套
\\\\做聯(lián)盟鏈,配套設(shè)施很重要。因為面對的是銀行客戶,或者是企業(yè)級客戶,需要給他們提供完整的配套設(shè)施, 比如說 IDE、監(jiān)控, 這些技術(shù)難度雖然不是特別大,但是必須要做到配套完善。
\\5. 答疑:
\\問:我看到一組數(shù)據(jù),比特幣弱中心化趨勢越來越明顯。比如,全球有 77% 的算力都掌握在中國,從某種意義上來說的話,看上去好像比 dpos 更集中化了。您是怎么看的?
\\答:就目前來看,整體雖然越來越集中,但還算可控,因為 POW 是一個純粹的計算問題。它的設(shè)計初衷假定人是獨立的。如果你控制整個計算,損害了其他人的利益的,別人就會逃離這個平臺,你也不會獲得收益。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的腾讯十年老兵:区块链本质上是一个异地多活的分布式数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Python-dataframe中如何
- 下一篇: onsubmit校验表单时利用ajax的