自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文詳解區(qū)塊鏈的存儲(chǔ)體系

區(qū)塊鏈
而類似Hyperledger等通用區(qū)塊鏈框架則一般包含類似State Store等存儲(chǔ)最終結(jié)果數(shù)據(jù)的模塊。索引存儲(chǔ)則在當(dāng)前大部分區(qū)塊鏈項(xiàng)目中均不存在。

 [[354925]]

從數(shù)據(jù)庫(kù)的角度看待區(qū)塊鏈的存儲(chǔ)機(jī)制會(huì)簡(jiǎn)單直觀很多。在一個(gè)標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫(kù)中,存儲(chǔ)一般分為日志存儲(chǔ)、用戶數(shù)據(jù)存儲(chǔ)、以及索引存儲(chǔ)三大類(有些數(shù)據(jù)庫(kù)可能還包含大對(duì)象存儲(chǔ)等)。而區(qū)塊鏈項(xiàng)目中基本所有的“賬本”存儲(chǔ)其本質(zhì)就是交易日志存儲(chǔ)。用戶數(shù)據(jù)存儲(chǔ)則根據(jù)項(xiàng)目不同而有選擇性地采用。譬如說對(duì)于UTXO結(jié)構(gòu)的區(qū)塊鏈項(xiàng)目來說,其每個(gè)賬號(hào)對(duì)應(yīng)的余額直接保存在內(nèi)存哈希表中(或類似LevelDB等嵌入式KV數(shù)據(jù)庫(kù)中),因此不需要一個(gè)獨(dú)立的外接用戶數(shù)據(jù)存儲(chǔ)模塊。而類似Hyperledger等通用區(qū)塊鏈框架則一般包含類似State Store等存儲(chǔ)最終結(jié)果數(shù)據(jù)的模塊。索引存儲(chǔ)則在當(dāng)前大部分區(qū)塊鏈項(xiàng)目中均不存在。

1.賬本格式

區(qū)塊鏈的鏈?zhǔn)浇Y(jié)構(gòu)筆者在這里不再贅述,其每個(gè)塊包含上一個(gè)塊的哈希值,而內(nèi)容則使用默克爾樹進(jìn)行校驗(yàn)以實(shí)現(xiàn)快速驗(yàn)證,每條記錄則使用數(shù)字簽名的方式保證其一定來自擁有私鑰的用戶。

 

(圖1:區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu))

對(duì)比傳統(tǒng)數(shù)據(jù)庫(kù)的日志結(jié)構(gòu),區(qū)塊鏈結(jié)構(gòu)并不復(fù)雜。一般來說,所有傳統(tǒng)數(shù)據(jù)庫(kù)日志結(jié)構(gòu)都比較相似,每個(gè)日志文件包含日志頭與多個(gè)日志數(shù)據(jù)頁(yè),其中日志頭代表其起始交易號(hào)(Oracle中叫做SCN,DB2中叫做LSN),也就是該日志文件中第一條日志記錄在整個(gè)日志空間中的起始字節(jié)數(shù),以及日志文件大小,日志頁(yè)大小等元數(shù)據(jù)信息。緊接著真實(shí)的日志記錄則以二進(jìn)制碼流的方式依次存放在文件中,每一條日志記錄頭包含該條記錄的交易號(hào)、事務(wù)號(hào)、同一事務(wù)中上一條記錄的交易號(hào)(反向指針),以及變更前與變更后的數(shù)據(jù)(滿足回滾要求)。


因此,從結(jié)構(gòu)上來看,區(qū)塊鏈賬本與數(shù)據(jù)庫(kù)日志本質(zhì)上沒有任何區(qū)別,僅僅在數(shù)據(jù)結(jié)構(gòu)上為了滿足一些特定要求做了部分優(yōu)化。

2. 存儲(chǔ)內(nèi)容

通用型數(shù)據(jù)庫(kù)與當(dāng)前大部分區(qū)塊鏈賬本項(xiàng)目(例如比特幣、以太坊等,而Hyperledger這類區(qū)塊鏈平臺(tái)則不包含在內(nèi))從日志的角度看,最大的區(qū)別在于區(qū)塊鏈賬本項(xiàng)目對(duì)于日志格式進(jìn)行了高度定制化與業(yè)務(wù)綁定。

一般來說,傳統(tǒng)的數(shù)據(jù)庫(kù)日志包含的是數(shù)據(jù)頁(yè)的變更信息,我們叫做“寫前鏡像”和“寫后鏡像”,代表新的數(shù)據(jù)寫入前這條記錄長(zhǎng)什么樣子,同時(shí)新數(shù)據(jù)寫入后這個(gè)記錄長(zhǎng)什么樣子。通過這種方式,可以很輕易地在磁盤中的某個(gè)數(shù)據(jù)頁(yè)的指定偏移上進(jìn)行數(shù)據(jù)前滾與回滾操作。

譬如說一條數(shù)據(jù)庫(kù)日志并不會(huì)記錄一個(gè)INSERT操作的具體命令,而是以“X數(shù)據(jù)頁(yè)的第Y個(gè)槽位,其所對(duì)應(yīng)的偏移地址數(shù)據(jù)由ABC變化為DEF,總長(zhǎng)度Z”的方式體現(xiàn)出來。因此,數(shù)據(jù)庫(kù)的日志幾乎可以記錄任何信息,這也是為什么通用數(shù)據(jù)庫(kù)可以被用來實(shí)現(xiàn)任何業(yè)務(wù)邏輯的原因。

而大部分的賬本項(xiàng)目則高度定制化其日志結(jié)構(gòu),例如以太坊的每一條交易信息都會(huì)包含輸入金額、輸出金額、燃料等信息,然后每一個(gè)節(jié)點(diǎn)在進(jìn)行驗(yàn)證時(shí)必須判斷其符合某種規(guī)則,否則不予通過。這種機(jī)制可以看做是一個(gè)完全高度定制化的數(shù)據(jù)庫(kù)業(yè)務(wù),每一條日志記錄不僅僅記錄數(shù)據(jù)內(nèi)容的變更,而是與業(yè)務(wù)邏輯緊密耦合,記錄每個(gè)賬戶的余額變化。

因此,從可擴(kuò)展性來看,盡管以太坊等項(xiàng)目支持“智能合約”,但是其核心本質(zhì)還是一個(gè)高度定制化的賬本系統(tǒng),其業(yè)務(wù)邏輯與交易結(jié)算進(jìn)行了非常緊密的綁定。

3. 設(shè)計(jì)思路

從設(shè)計(jì)哲學(xué)上看,當(dāng)前的區(qū)塊鏈與數(shù)據(jù)庫(kù)在對(duì)通用業(yè)務(wù)的支持上采用了兩種不同的策略。對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù)來說,其秉承的設(shè)計(jì)理念是“業(yè)務(wù)與數(shù)據(jù)分離”的思路,也就是說數(shù)據(jù)庫(kù)僅負(fù)責(zé)數(shù)據(jù)的存放,通過提供一種靈活的查詢語(yǔ)言能夠讓應(yīng)用程序直接訪問數(shù)據(jù)庫(kù)進(jìn)行增刪改查,但是基本所有的業(yè)務(wù)邏輯由應(yīng)用程序自行定義。

但是,對(duì)于區(qū)塊鏈來說則是存儲(chǔ)與業(yè)務(wù)邏輯緊耦合的思路。在區(qū)塊鏈,尤其是公鏈的設(shè)計(jì)哲學(xué)中,因?yàn)槊總€(gè)存儲(chǔ)節(jié)點(diǎn)和應(yīng)用都是不可信的,因此大部分業(yè)務(wù)邏輯需要在協(xié)議層進(jìn)行高度定制。一個(gè)區(qū)塊鏈節(jié)點(diǎn)即需要對(duì)協(xié)議層進(jìn)行解析和封裝,同時(shí)也需要負(fù)責(zé)對(duì)數(shù)據(jù)本地化落盤和存儲(chǔ)。

因而,盡管站在高層面可以將區(qū)塊鏈看做是多活數(shù)據(jù)庫(kù),但是如果從具體實(shí)現(xiàn)層面來看,每個(gè)區(qū)塊鏈節(jié)點(diǎn)又不能簡(jiǎn)單地看做是一個(gè)傳統(tǒng)數(shù)據(jù)庫(kù)的多活替代品,而是一套包含協(xié)議解析封裝和一部分業(yè)務(wù)邏輯的應(yīng)用軟件。

4. 用戶數(shù)據(jù)存儲(chǔ)

如果未來區(qū)塊鏈的目標(biāo)是作為通用平臺(tái),用以存儲(chǔ)多種類型的數(shù)據(jù),則其日志格式與存儲(chǔ)必須回歸數(shù)據(jù)庫(kù)的通用性本源。當(dāng)前的賬本模式可以作為該體系中的一個(gè)特別模塊存在用以進(jìn)行賬戶間結(jié)算,但是無法將其擴(kuò)展為通用業(yè)務(wù)平臺(tái)。

既然要成為通用數(shù)據(jù)存儲(chǔ)平臺(tái),那么UTXO模型存在一定局限性。在一個(gè)典型的銀行業(yè)務(wù)中,零售業(yè)務(wù)可能會(huì)包含千萬甚至億級(jí)別的賬戶,不同賬戶可能使用不同的利息計(jì)算規(guī)則,也可能存在凍結(jié)等特殊狀態(tài)。而交易流水信息每天可能達(dá)到千萬筆,如果將其業(yè)務(wù)擴(kuò)展到非金融行業(yè),流水信息每天幾億也是可能的。因此,從一個(gè)通用賬戶+流水的業(yè)務(wù)模型中,一般企業(yè)會(huì)建立一個(gè)賬戶表與一個(gè)流水表,以不同的策略進(jìn)行管理。

賬戶表俗稱余額類數(shù)據(jù),在典型的數(shù)據(jù)治理體系中需要做到定期快照備份(例如月初數(shù)和月末數(shù));而流水表則成為流水類數(shù)據(jù),一般來說以原始交易格式直接存儲(chǔ)和備份。通過對(duì)余額類數(shù)據(jù)快照備份的恢復(fù),對(duì)指定賬號(hào)重做某個(gè)時(shí)間范圍內(nèi)的全部交易流水,可以得到該賬號(hào)任意時(shí)間點(diǎn)的余額信息。

而UTXO的本質(zhì)在于日志存放的信息不是記錄的最終結(jié)果,而是變化行為。在傳統(tǒng)數(shù)據(jù)庫(kù)中,每條事務(wù)記錄的是數(shù)據(jù)的寫前與寫后內(nèi)容。例如將一條記錄從5更改為8,其數(shù)據(jù)庫(kù)日志記錄原始數(shù)據(jù)為5且新數(shù)據(jù)為8,而不是記錄“+3”的操作。但是UTXO記錄的是變更信息,其主要的目的是解決雙花問題(例如對(duì)于一個(gè)有100塊錢的賬號(hào),一個(gè)人在中國(guó)轉(zhuǎn)走10塊錢,另一個(gè)人在美國(guó)同時(shí)轉(zhuǎn)走10塊錢,如果記錄的是最終結(jié)果,那么中國(guó)的服務(wù)器會(huì)認(rèn)為這個(gè)人有90塊,美國(guó)的服務(wù)器在沒有全局鎖的情況下也會(huì)認(rèn)為這個(gè)人有90塊,最終寫到區(qū)塊中就變成90塊余額,而非80)。

UTXO的機(jī)制可以有效地在無鎖的情況下避免雙花問題,但是其劣勢(shì)則在于不存儲(chǔ)余額表,所有的信息均通過重做流水?dāng)?shù)據(jù),從零開始生成。對(duì)于一個(gè)存在了十年以上,包含幾百億筆交易的系統(tǒng)來說,這樣的做法就好比每次重啟都要從都重做幾百筆交易并存入內(nèi)存中(或KV數(shù)據(jù)庫(kù)里),是一種非常原始且不經(jīng)濟(jì)的方式。

另一方面,區(qū)塊鏈日志的結(jié)構(gòu)看來,由于多活系統(tǒng)中全局鎖很難實(shí)現(xiàn),因此需要通過交易日志結(jié)構(gòu)的調(diào)整來滿足傳統(tǒng)數(shù)據(jù)庫(kù)中事務(wù)的功能。傳統(tǒng)數(shù)據(jù)庫(kù)中當(dāng)涉及到兩賬戶之間轉(zhuǎn)賬操作時(shí)需要開啟一個(gè)事務(wù)。在事務(wù)日志中一個(gè)賬戶增加一個(gè)賬戶減少的業(yè)務(wù)邏輯,需要體現(xiàn)為包含三條記錄的鏈表(最后的提交操作也是一個(gè)記錄)。在數(shù)據(jù)庫(kù)崩潰或發(fā)生異常后,只要通過重做所有的任務(wù),并最后對(duì)全部沒有提交記錄的事務(wù)進(jìn)行反向操作,即可得到原子性(Atomic)與持久性(Durability)。

而在區(qū)塊鏈體系中由于不存在事務(wù)的概念,同時(shí)操作日志與結(jié)算業(yè)務(wù)進(jìn)行了緊密耦合,因此每條交易記錄都會(huì)包含一個(gè)輸入賬號(hào)以及若干個(gè)輸出賬號(hào),也就是說只要一條事務(wù)記錄被成功發(fā)送給一個(gè)節(jié)點(diǎn),則可以保證在該記錄內(nèi)部的全部輸入輸出賬戶統(tǒng)一進(jìn)行了變更。可以說,區(qū)塊鏈通過定制化交易日志簡(jiǎn)化了事務(wù)操作的復(fù)雜性,但是帶來的影響便在于業(yè)務(wù)與代碼的緊密耦合不可分割。

但是無論如何,首先UTXO并不是通用數(shù)據(jù)結(jié)構(gòu),而是為交易業(yè)務(wù)高度定制化的數(shù)據(jù)結(jié)構(gòu),如果想要運(yùn)行圖靈完備的智能合約(或者說存儲(chǔ)過程),使用UTXO會(huì)有很多局限性。第二,對(duì)長(zhǎng)期運(yùn)行的大型系統(tǒng)(相比起大中型銀行核心交易系統(tǒng)所產(chǎn)生的交易流水,比特幣從誕生到現(xiàn)在的交易量少得可以忽略不計(jì)),UTXO每次初始化需要全部的歷史交易日志。這種模式完全不可能適用于大型交易系統(tǒng)。

因此,可以存在兩種做法解決該問題。第一種方式使用傳統(tǒng)賬戶表與流水表的機(jī)制,將UTXO以流水的方式體現(xiàn)出來,同時(shí)定期保存賬戶快照,以避免每次重構(gòu)數(shù)據(jù)庫(kù)都需要重做全部交易(這種機(jī)制需要考慮到賬戶與流水表在多活系統(tǒng)中,沒有全局鎖的情況下如何實(shí)現(xiàn)一致性的問題)。而對(duì)于非結(jié)算類交易,通用型區(qū)塊鏈項(xiàng)目則可能采用日志結(jié)合用戶數(shù)據(jù)存儲(chǔ)的模式,才能夠普適性地滿足通用業(yè)務(wù)需求(這種機(jī)制需要依靠比nonce更好的排序機(jī)制避免雙花)。

5. 索引存儲(chǔ)

當(dāng)前基本沒有任何區(qū)塊鏈項(xiàng)目支持用戶數(shù)據(jù)的自定義索引。這種機(jī)制在未來的通用型區(qū)塊鏈項(xiàng)目一定會(huì)被彌補(bǔ)。從本質(zhì)上看當(dāng)前的區(qū)塊鏈項(xiàng)目結(jié)構(gòu)沒有任何理由無法在其上構(gòu)建通用索引能力(包括B樹索引、位圖索引、全文檢索等)。

小結(jié)

區(qū)塊鏈的存儲(chǔ)體系現(xiàn)在還處于數(shù)據(jù)庫(kù)上世紀(jì)80年代的階段,其當(dāng)前最大的問題在于日志結(jié)構(gòu)與業(yè)務(wù)邏輯的緊密耦合(讀者可以理解為應(yīng)用程序?yàn)槊糠N業(yè)務(wù)邏輯都要從頭實(shí)現(xiàn)一遍Oracle)。而這樣做的本質(zhì)原因在于多活數(shù)據(jù)庫(kù)中事務(wù)的原子性與鎖極難保障,因此當(dāng)涉及到多個(gè)賬戶的轉(zhuǎn)賬原子操作時(shí),當(dāng)前大部分賬本類區(qū)塊鏈項(xiàng)目均不得不定制日志結(jié)構(gòu),將每一筆交易的全部信息放在一條記錄中。從數(shù)據(jù)庫(kù)的角度看,在區(qū)塊鏈項(xiàng)目中實(shí)現(xiàn)跨記錄的原子操作(包括全局鎖)極為復(fù)雜,而這也正是區(qū)塊鏈技術(shù)向通用型數(shù)據(jù)存儲(chǔ)進(jìn)化的關(guān)鍵所在。

筆者認(rèn)為,隨著區(qū)塊鏈應(yīng)用越發(fā)廣泛,人們?cè)诓痪玫膶硪欢〞?huì)將各類區(qū)塊鏈應(yīng)用泛化出一系列典型的場(chǎng)景和需求。基于這些場(chǎng)景和需求,一定會(huì)出現(xiàn)一批優(yōu)秀高效的多活數(shù)據(jù)存儲(chǔ)。不論這些機(jī)制的后臺(tái)到底是否基于“區(qū)塊”的架構(gòu)實(shí)現(xiàn),其這正需要突破的是現(xiàn)有數(shù)據(jù)庫(kù)體系中無法做到active-active的局限(也就是去中心化)。

 

責(zé)任編輯:姜華 來源: 中國(guó)IDC圈
相關(guān)推薦

2022-04-20 10:25:18

量子區(qū)塊鏈計(jì)算機(jī)

2022-04-26 13:41:16

區(qū)塊鏈比特幣數(shù)據(jù)庫(kù)

2020-05-11 07:57:33

區(qū)塊鏈分布式鏈上

2022-01-22 00:29:36

區(qū)塊鏈食品技術(shù)

2018-03-17 09:00:21

大數(shù)據(jù) 區(qū)塊鏈

2020-01-22 16:50:32

區(qū)塊鏈技術(shù)智能

2021-04-06 15:23:46

區(qū)塊鏈國(guó)防技術(shù)

2020-11-30 12:50:26

SRE運(yùn)維可觀測(cè)性系統(tǒng)

2020-12-30 11:05:51

SRE運(yùn)維可觀測(cè)性系統(tǒng)

2021-03-04 00:09:31

MySQL體系架構(gòu)

2020-09-03 06:35:44

Linux權(quán)限文件

2021-03-31 22:33:21

區(qū)塊鏈人工智能貨幣

2018-05-29 16:20:55

區(qū)塊鏈比特幣

2021-02-20 15:55:16

區(qū)塊鏈數(shù)字經(jīng)濟(jì)新基建

2024-08-09 12:44:45

JavaScript原型鏈鏈條

2020-05-13 09:45:08

區(qū)塊鏈公共區(qū)塊鏈私有區(qū)塊鏈

2023-10-22 12:00:37

數(shù)據(jù)運(yùn)營(yíng)

2021-12-28 20:13:59

區(qū)塊鏈黑客安全

2022-03-14 20:55:54

區(qū)塊鏈元宇宙

2025-03-25 09:06:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)