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