??前言:十二月份出個(gè)openGuass集合專(zhuān)欄,帶領(lǐng)大家淺淺的認(rèn)識(shí)一下國(guó)產(chǎn)數(shù)據(jù)庫(kù)吧??
1. 什么是賬本數(shù)據(jù)庫(kù)
區(qū)塊鏈大家想必都耳熟能詳,比特幣、以太坊甚至狗狗幣等代幣,作為區(qū)塊鏈的代名詞,不僅牽動(dòng)著某些人的賬戶盈虧,甚至影響著市面的顯卡、硬盤(pán)價(jià)格。但是作為數(shù)據(jù)庫(kù)相關(guān)的技術(shù)人員或者愛(ài)好者,對(duì)這一新技術(shù),我們更多的是關(guān)系其核心技術(shù)點(diǎn)。
區(qū)塊鏈作為一種分布式賬本技術(shù),克服了傳統(tǒng)集中式賬本的存儲(chǔ)效率低、可信度低、易受單點(diǎn)攻擊的劣勢(shì),從技術(shù)上保證了其具有分布式共享、多方共識(shí)、不可篡改和可追溯的特點(diǎn)。
那么區(qū)塊鏈這么好,我們能用它來(lái)替代數(shù)據(jù)庫(kù)嗎?答案當(dāng)然是NO!因?yàn)閰^(qū)塊鏈往往有著交易性能低下,查詢不便等諸多弊端。比特幣系統(tǒng)僅支持每秒處理7筆交易,如果用它來(lái)承擔(dān)主要的金融交易,效率自然是十分低下的。業(yè)界往往采用數(shù)據(jù)庫(kù)來(lái)提高區(qū)塊鏈的數(shù)據(jù)存儲(chǔ)、檢索能力。我們不妨換個(gè)角度,利用openGauss數(shù)據(jù)庫(kù)天然具有的高性能、高可靠、高安全等優(yōu)勢(shì),從openGauss出發(fā),融入一些區(qū)塊鏈的密碼學(xué)防篡改、多方共識(shí)等技術(shù),來(lái)提高數(shù)據(jù)庫(kù)自身的防篡改、可追溯能力。防篡改賬本數(shù)據(jù)庫(kù)的idea應(yīng)運(yùn)而生。
區(qū)塊鏈從基礎(chǔ)架構(gòu)模型上講,通常被分為七層:
-
應(yīng)用層
-
查詢層
-
合約層
-
激勵(lì)層
-
共識(shí)層
-
網(wǎng)絡(luò)層
-
數(shù)據(jù)層
每一層的詳細(xì)的技術(shù)點(diǎn)如下圖所示:
圖 1 區(qū)塊鏈基礎(chǔ)架構(gòu)模型
數(shù)據(jù)庫(kù)吸納區(qū)塊鏈防篡改的能力,首先想到的就是從區(qū)塊鏈技術(shù)的最底層:數(shù)據(jù)層出發(fā),讓數(shù)據(jù)庫(kù)提供數(shù)據(jù)的校驗(yàn)信息記錄以及數(shù)據(jù)的篡改校驗(yàn)的能力,保證數(shù)據(jù)庫(kù)在處理敏感信息時(shí)能夠忠實(shí)的記錄每一筆交易造成的數(shù)據(jù)更改,形成一個(gè)忠實(shí)、完整的數(shù)據(jù)變更“賬本”。我們本次要介紹的openGauss賬本數(shù)據(jù)庫(kù),即是在openGauss內(nèi)核中植入了在數(shù)據(jù)修改時(shí),對(duì)數(shù)據(jù)的變更操作進(jìn)行記錄這一功能,保證整個(gè)數(shù)據(jù)鏈路可查詢、可溯源;同時(shí)提供高效的篡改校驗(yàn)接口,提供給上層的應(yīng)用系統(tǒng)或者多個(gè)參與方之間互相校驗(yàn)數(shù)據(jù)的一致性。之后,我們將詳細(xì)介紹賬本數(shù)據(jù)庫(kù)的實(shí)現(xiàn)原理以及其對(duì)openGauss的改造。
2. openGauss賬本數(shù)據(jù)庫(kù)原理剖析
?圖 2 賬本數(shù)據(jù)庫(kù)新增模塊
客戶端發(fā)送SQL對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)進(jìn)行修改時(shí),要經(jīng)過(guò)通信模塊的接收,解析模塊的處理,轉(zhuǎn)成解析樹(shù),然后經(jīng)過(guò)優(yōu)化生成執(zhí)行計(jì)劃。執(zhí)行模塊拿到執(zhí)行計(jì)劃,會(huì)調(diào)用存儲(chǔ)層接口對(duì)數(shù)據(jù)進(jìn)行修改。如上圖所示,我們?cè)跀?shù)據(jù)的修改過(guò)程中,增加了篡改校驗(yàn)信息的記錄;同時(shí),提供了篡改校驗(yàn)?zāi)K,供用戶調(diào)用接口執(zhí)行校驗(yàn)。篡改信息記錄和篡改校驗(yàn)的基礎(chǔ)是我們針對(duì)數(shù)據(jù)庫(kù)增、刪、改操作設(shè)計(jì)的篡改校驗(yàn)信息。下面我們針對(duì)新增的篡改校驗(yàn)信息進(jìn)行介紹。
2.1 防篡改用戶表
圖 3 防篡改用戶表結(jié)構(gòu)
在賬本數(shù)據(jù)庫(kù)特性中,我們使用schema級(jí)別進(jìn)行防篡改表和普通表的隔離。在防篡改schema中的表,具有校驗(yàn)信息,且每次涉及到增、刪、改的操作均會(huì)記錄相應(yīng)的數(shù)據(jù)變化以及操作的語(yǔ)句,我們稱這些表為防篡改表。而普通的schema中的表,我們稱其為普通表。
防篡改表有如圖 3所示的結(jié)構(gòu)。在創(chuàng)建防篡改表時(shí),系統(tǒng)會(huì)增加一行hash列,該列在發(fā)生數(shù)據(jù)插入或者數(shù)據(jù)修改時(shí),都會(huì)實(shí)時(shí)計(jì)算數(shù)據(jù)的摘要。數(shù)據(jù)與摘要存在一個(gè)tuple中,密不可分。由hash函數(shù)的單向性,我們將每一行的摘要,作為該行數(shù)據(jù)在摘要空間的邏輯表示。
2.2 用戶歷史表
圖 4 用戶歷史表結(jié)構(gòu)
用戶歷史表結(jié)構(gòu)見(jiàn)上圖,主要包含四列:xid、hash_ins、hash_del、pre_hash。用戶歷史表的每一行對(duì)應(yīng)著用戶表的每一次行級(jí)數(shù)據(jù)更改,其中xid記錄數(shù)據(jù)更改時(shí)的xid號(hào),代表著操作進(jìn)行的邏輯時(shí)間順序。hash_ins記錄INSERT或者UPDATE操作插入的數(shù)據(jù)行的hash值,hash_del記錄著DELETE或者UPDATE刪除數(shù)據(jù)行的hash值。同時(shí),hash_ins和hash_del是否為空,代表著INSERT、DELETE、UPDATE三種不同的操作類(lèi)型,其對(duì)應(yīng)關(guān)系如下表。
hash_ins |
hash_del |
|
Insert |
√(插入數(shù)據(jù)hash) |
-- |
Delete |
-- |
√(刪除數(shù)據(jù)hash) |
Update |
√(新數(shù)據(jù)hash) |
√(刪除前數(shù)據(jù)hash) |
pre_hash將歷史表的當(dāng)前行數(shù)據(jù)和上一行的pre_hash數(shù)據(jù)進(jìn)行拼接,生成當(dāng)前用戶歷史表的數(shù)據(jù)整體摘要,計(jì)算公式如下:
這里i代表用戶歷史表的第i行,rowdatai為第i行xid||hash_ins||hash_del拼接的數(shù)據(jù)。
在校驗(yàn)用戶歷史表的完整性時(shí),通過(guò)使用rowdata數(shù)據(jù)從前往后依次計(jì)算pre_hash值,并與表中的pre_hash進(jìn)行比對(duì),如果數(shù)據(jù)不一致,則說(shuō)明用戶歷史表的完整性被破壞。
2.3 全局區(qū)塊表結(jié)構(gòu)
?圖 5 全局區(qū)塊表結(jié)構(gòu)
全局區(qū)塊表結(jié)構(gòu)見(jiàn)上圖,表中每一行對(duì)應(yīng)一次防篡改表修改行為,作為一個(gè)區(qū)塊保存。全局區(qū)塊表主要包括三部分內(nèi)容:區(qū)塊信息主要保存了區(qū)塊相關(guān)的標(biāo)記信息,包括區(qū)塊號(hào)、時(shí)間戳。操作信息包括了用戶對(duì)防篡改數(shù)據(jù)表的操作信息,包括數(shù)據(jù)庫(kù)名、用戶名、表名等標(biāo)識(shí)信息,以及對(duì)應(yīng)的SQL語(yǔ)句。校驗(yàn)信息保存用于一致性或完整性校驗(yàn)的hash信息,包括表級(jí)hash(rel_hash)、全局hash(global_hash)。
2.4 篡改校驗(yàn)算法
圖 6 防篡改用戶表校驗(yàn)信息生成
用戶在調(diào)用篡改校驗(yàn)接口時(shí),系統(tǒng)可以并行的使用防篡改用戶表生成表級(jí)的總校驗(yàn)信息;使用用戶表對(duì)應(yīng)的歷史表中的記錄,生成變更記錄整體的校驗(yàn)信息。然后通過(guò)比較生成的兩個(gè)校驗(yàn)信息是否一致,來(lái)判斷數(shù)據(jù)與操作是否一致。如果不一致,則說(shuō)明發(fā)生了繞過(guò)系統(tǒng)記錄的修改數(shù)據(jù)行為,即篡改行為。
通過(guò)防篡改用戶表中的行級(jí)校驗(yàn)信息生成表級(jí)校驗(yàn)的過(guò)程如圖 6 所示。在校驗(yàn)時(shí),會(huì)掃描表中的數(shù)據(jù),獲取每一行中的校驗(yàn)信息,并使用行校驗(yàn)信息對(duì)行數(shù)據(jù)進(jìn)行校驗(yàn)。在掃描完整體的行校信息的過(guò)程中,可以通過(guò)內(nèi)置的可交換校驗(yàn)信息聚合算法,不斷生成當(dāng)前已經(jīng)掃描的數(shù)據(jù)的整體校驗(yàn)信息。由于信息聚合算法的可交換性,這一過(guò)程可以完全并行執(zhí)行。
通過(guò)用戶歷史表生成變更記錄總體的校驗(yàn)信息如圖 7 所示。通過(guò)我們?cè)O(shè)計(jì)的用戶歷史表的結(jié)構(gòu),其hash_ins列中的非空元素代表了所有操作導(dǎo)致的數(shù)據(jù)校驗(yàn)信息的增加,hash_del列中的非空元素則代表了校驗(yàn)數(shù)據(jù)減少。我們通過(guò)對(duì)兩列元素做差集,得到剩余的校驗(yàn)信息的集合。然后利用可交換校驗(yàn)信息聚合算法得到用戶歷史表中記錄操作造成的變更記錄整體的校驗(yàn)信息。這一過(guò)程,由于聚合算法的可交換性,可以對(duì)每行先進(jìn)行hash_ins – hash_del,然后在掃描的時(shí)候不斷疊加生成。這里,變更記錄整體校驗(yàn)信息的生成也是完全可以并行的。
?圖 7 用戶歷史表校驗(yàn)信息生成
3. openGauss賬本數(shù)據(jù)庫(kù)發(fā)展展望
賬本數(shù)據(jù)庫(kù)作為openGauss防篡改數(shù)據(jù)的基礎(chǔ),目前支持了數(shù)據(jù)庫(kù)內(nèi)校驗(yàn)信息的記錄以及提供高性能校驗(yàn)接口。提供了區(qū)塊鏈技術(shù)層次中存儲(chǔ)層的部分功能。為了實(shí)現(xiàn)防篡改, 我們還需要增加多個(gè)數(shù)據(jù)庫(kù)間的高性能遠(yuǎn)程執(zhí)行能力,以及提供可插拔的高性能多方共識(shí)協(xié)議,這樣才能形成完整的openGauss多方可信防篡改能力。在數(shù)據(jù)庫(kù)融合區(qū)塊鏈的領(lǐng)域,openGauss會(huì)不斷進(jìn)化,為大家?guī)?lái)更加易用、更加高效的防篡改數(shù)據(jù)庫(kù)。
公眾實(shí)時(shí)更新:葉秋學(xué)長(zhǎng)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-779597.html
下一篇解密openGauss DB4AI框架的內(nèi)部機(jī)理文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-779597.html
到了這里,關(guān)于關(guān)于賬本數(shù)據(jù)庫(kù):你想知道的這里都有的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!