本發(fā)明涉及區(qū)塊鏈技術(shù)領(lǐng)域,尤其涉及一種區(qū)塊鏈數(shù)據(jù)訪問方法和裝置。
背景技術(shù):
現(xiàn)有的區(qū)塊鏈數(shù)據(jù)按節(jié)點分布,每個區(qū)塊鏈節(jié)點存儲全量或局部的區(qū)塊鏈數(shù)據(jù)。當(dāng)區(qū)塊鏈里有多個節(jié)點時,每個區(qū)塊鏈節(jié)點都有一份獨立完整的數(shù)據(jù)。目前區(qū)塊鏈數(shù)據(jù)存儲在存儲介質(zhì)上,一般采用文件型本地數(shù)據(jù)庫存儲,數(shù)據(jù)基于文件裝置實現(xiàn)key-value結(jié)構(gòu)保存在區(qū)塊鏈節(jié)點的物理硬盤中,一般不提供跨網(wǎng)絡(luò)的存儲結(jié)構(gòu)。
在這種區(qū)塊鏈數(shù)據(jù)存儲方案里,每個區(qū)塊鏈節(jié)點是相對獨立的工作的,有多少個區(qū)塊鏈節(jié)點就有多少份數(shù)據(jù),區(qū)塊鏈節(jié)點和區(qū)塊鏈節(jié)點之間并不能通過數(shù)據(jù)訪問接口直接共享各自所存儲的數(shù)據(jù)。
技術(shù)實現(xiàn)要素:
本發(fā)明的主要目的在于提供一種區(qū)塊鏈數(shù)據(jù)訪問方法和裝置,旨在解決現(xiàn)有區(qū)塊鏈節(jié)點的數(shù)據(jù)需要單獨存儲,不能實現(xiàn)區(qū)塊鏈節(jié)點之間數(shù)據(jù)的共享的技術(shù)問題。
為實現(xiàn)上述目的,本發(fā)明提供一種區(qū)塊鏈數(shù)據(jù)訪問方法,所述區(qū)塊鏈數(shù)據(jù)訪問方法包括步驟:
當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行所述執(zhí)行指令的區(qū)塊鏈節(jié)點;
將所述區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù);
設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)。
優(yōu)選地,所述設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)的步驟之后,還包括:
采用跨進(jìn)程訪問技術(shù)定義所述區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口;
通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作或?qū)懭氩僮鳌?/p>
優(yōu)選地,所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的寫入操作的步驟之前,還包括:
判斷所述區(qū)塊鏈節(jié)點是否已緩存待寫入共享數(shù)據(jù);
若所述區(qū)塊鏈節(jié)點未緩存所述待寫入共享數(shù)據(jù),或所述區(qū)塊鏈節(jié)點中已緩存所述待寫入共享數(shù)據(jù),但所述待寫入共享數(shù)據(jù)對應(yīng)的值需要更新,則執(zhí)行所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的寫入操作的步驟。
優(yōu)選地,所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的寫入操作的步驟包括:
當(dāng)通過所述數(shù)據(jù)訪問接口偵測到所述寫入操作對應(yīng)的寫入請求時,獲取所述待寫入共享數(shù)據(jù)的標(biāo)識;
根據(jù)所述標(biāo)識將所述待寫入共享數(shù)據(jù)寫入所述數(shù)據(jù)存儲空間中。
優(yōu)選地,所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作的步驟之前,還包括:
判斷所述區(qū)塊鏈節(jié)點中是否緩存有待讀取共享數(shù)據(jù);
若所述區(qū)塊鏈節(jié)點中未緩存所述待讀取共享數(shù)據(jù),則執(zhí)行所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作的步驟。
優(yōu)選地,所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作或?qū)懭氩僮鞯牟襟E之后,還包括:
若根據(jù)在所述數(shù)據(jù)訪問接口中設(shè)置的緩存策略確定所寫入或所讀取的共享數(shù)據(jù)可被緩存,則在所述區(qū)塊鏈節(jié)點的緩存空間中緩存所寫入或所讀取的共享數(shù)據(jù)。
優(yōu)選地,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括:同一區(qū)塊鏈分組內(nèi)的任一區(qū)塊鏈節(jié)點分別對應(yīng)著一份節(jié)點獨立數(shù)據(jù)。
優(yōu)選地,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括:
獲取所述數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)量,以及所述數(shù)據(jù)存儲空間的訪問性能;
根據(jù)所述數(shù)據(jù)量和所述訪問性能對所述數(shù)據(jù)存儲空間進(jìn)行擴(kuò)容,并在間隔預(yù)設(shè)時間對所述數(shù)據(jù)存儲空間所存儲的所述節(jié)點獨立數(shù)據(jù)和所述共享數(shù)據(jù)進(jìn)行備份。
此外,為實現(xiàn)上述目的,本發(fā)明還提供一種區(qū)塊鏈數(shù)據(jù)訪問裝置,所述區(qū)塊鏈數(shù)據(jù)訪問裝置包括:
獲取模塊,用于當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行所述執(zhí)行指令的區(qū)塊鏈節(jié)點;
配置模塊,用于將所述區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù);
設(shè)置模塊,用于設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)。
優(yōu)選地,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
定義模塊,用于采用跨進(jìn)程訪問技術(shù)定義所述區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口;
執(zhí)行模塊,用于通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作或?qū)懭氩僮鳌?/p>
優(yōu)選地,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
第一判斷模塊,用于判斷所述區(qū)塊鏈節(jié)點是否已緩存待寫入共享數(shù)據(jù);
所述執(zhí)行模塊還用于若所述區(qū)塊鏈節(jié)點未緩存所述待寫入共享數(shù)據(jù),或所述區(qū)塊鏈節(jié)點中已緩存所述待寫入共享數(shù)據(jù),但所述待寫入共享數(shù)據(jù)對應(yīng)的值需要更新,則通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的寫入操作。
優(yōu)選地,所述執(zhí)行模塊包括:
獲取單元,用于當(dāng)通過所述數(shù)據(jù)訪問接口偵測到所述寫入操作對應(yīng)的寫入請求時,獲取所述待寫入共享數(shù)據(jù)的標(biāo)識;
寫入單元,用于根據(jù)所述標(biāo)識將所述待寫入共享數(shù)據(jù)寫入所述數(shù)據(jù)存儲空間中。
優(yōu)選地,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
第二判斷模塊,還用于判斷所述區(qū)塊鏈節(jié)點中是否緩存有待讀取共享數(shù)據(jù);
所述執(zhí)行模塊還用于若所述區(qū)塊鏈節(jié)點中未緩存所述待讀取共享數(shù)據(jù),則通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作。
優(yōu)選地,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
緩存模塊,用于若根據(jù)在所述數(shù)據(jù)訪問接口中設(shè)置的緩存策略確定所寫入或所讀取的共享數(shù)據(jù)可被緩存,則在所述區(qū)塊鏈節(jié)點的緩存空間中緩存所寫入或所讀取的共享數(shù)據(jù)。
優(yōu)選地,同一區(qū)塊鏈分組內(nèi)的任一區(qū)塊鏈節(jié)點分別對應(yīng)著一份節(jié)點獨立數(shù)據(jù)。
優(yōu)選地,所述獲取模塊還用于獲取所述數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)量,以及所述數(shù)據(jù)存儲空間的訪問性能;
所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
擴(kuò)容模塊,用于根據(jù)所述數(shù)據(jù)量和所述訪問性能對所述數(shù)據(jù)存儲空間進(jìn)行擴(kuò)容;
備份模塊,用于在間隔預(yù)設(shè)時間對所述數(shù)據(jù)存儲空間所存儲的所述節(jié)點獨立數(shù)據(jù)和所述共享數(shù)據(jù)進(jìn)行備份。
本發(fā)明通過當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行所述執(zhí)行指令的區(qū)塊鏈節(jié)點;將所述區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù);設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)。在區(qū)塊鏈節(jié)點數(shù)據(jù)已經(jīng)分布式存儲的基礎(chǔ)上,對區(qū)塊鏈節(jié)點進(jìn)行分組,使同一區(qū)塊鏈分組內(nèi)的區(qū)塊鏈節(jié)點共同訪問同一份共享數(shù)據(jù),實現(xiàn)了區(qū)塊鏈節(jié)點之間數(shù)據(jù)的共享。
附圖說明
圖1為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問方法第一實施例的流程示意圖;
圖2為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問方法第二實施例的流程示意圖;
圖3為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置第一實施例的功能模塊示意圖;
圖4為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置第二實施例的功能模塊示意圖;
圖5為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置第三實施例的功能模塊示意圖;
圖6為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置第四實施例的功能模塊示意圖。
本發(fā)明目的的實現(xiàn)、功能特點及優(yōu)點將結(jié)合實施例,參照附圖做進(jìn)一步說明。
具體實施方式
應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明提供一種區(qū)塊鏈數(shù)據(jù)訪問方法。
參照圖1,圖1為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問方法第一實施例的流程示意圖。
在本實施例中,所述區(qū)塊鏈數(shù)據(jù)訪問方法包括:
步驟s10,當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行所述執(zhí)行指令的區(qū)塊鏈節(jié)點;
在本發(fā)明實施例中,區(qū)塊鏈節(jié)點存在對等網(wǎng)絡(luò)中。在對等網(wǎng)絡(luò)中,區(qū)塊鏈節(jié)點之間可以互相通信,構(gòu)成一個對等的網(wǎng)狀結(jié)構(gòu),以減少中心網(wǎng)絡(luò)的開銷;當(dāng)一個區(qū)塊鏈節(jié)點產(chǎn)生數(shù)據(jù)時,可以同時向?qū)Φ染W(wǎng)絡(luò)中的其它區(qū)塊鏈節(jié)點發(fā)送廣播,區(qū)塊鏈節(jié)點也可以在其它任意區(qū)塊鏈節(jié)點中查詢和獲取數(shù)據(jù)。區(qū)塊鏈節(jié)點是指參與到區(qū)塊鏈網(wǎng)絡(luò)里,進(jìn)行交易和數(shù)據(jù)交換的網(wǎng)絡(luò)節(jié)點,每個獨立機(jī)構(gòu)可以擁有一個或者多個交易節(jié)點,每個交易節(jié)點是一組物理網(wǎng)絡(luò)、計算機(jī)、區(qū)塊鏈應(yīng)用軟件以及數(shù)據(jù)庫的組合。在區(qū)塊鏈節(jié)點中,可以執(zhí)行區(qū)塊鏈業(yè)務(wù)邏輯,如執(zhí)行交易驗證、共識計算等。
當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行該執(zhí)行指令的區(qū)塊鏈節(jié)點。需要說明的是,在一個機(jī)構(gòu)中,每個業(yè)務(wù)使用不同的區(qū)塊鏈實例,一個業(yè)務(wù)(一個區(qū)塊鏈實例)可對應(yīng)著一個或者多個區(qū)塊鏈節(jié)點。
步驟s20,將所述區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù);
當(dāng)確定執(zhí)行該執(zhí)行指令的區(qū)塊鏈節(jié)點時,將區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù)。需要說明的是,若一個區(qū)塊鏈實例對應(yīng)著至少兩個區(qū)塊鏈節(jié)點,則在將區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組的過程中,要將同一個區(qū)塊鏈實例對應(yīng)著的至少兩個區(qū)塊鏈節(jié)點配置到同一區(qū)塊鏈分組中。共享數(shù)據(jù)包括但不限于區(qū)塊數(shù)據(jù)、智能合約數(shù)據(jù)和索引數(shù)據(jù)。區(qū)塊數(shù)據(jù)為區(qū)塊鏈節(jié)點運行時所需數(shù)據(jù),包括區(qū)塊頭;智能合約數(shù)據(jù)包括智能合約代碼和智能合約狀態(tài)數(shù)據(jù)。
進(jìn)一步地,對于同一區(qū)塊鏈分組內(nèi)的各個區(qū)塊鏈節(jié)點,可以重復(fù)寫入共享數(shù)據(jù),可以讀取共享數(shù)據(jù),以及同時寫入相同的共享數(shù)據(jù)。
步驟s30,設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)。
設(shè)置與區(qū)塊鏈分組對應(yīng)數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的區(qū)塊鏈節(jié)點,在數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)??梢岳斫獾氖?,不同機(jī)構(gòu)之間的區(qū)塊鏈節(jié)點不允許訪問同一份共享數(shù)據(jù),不同區(qū)塊鏈分組的區(qū)塊鏈節(jié)點也不允許訪問同一份共享數(shù)據(jù),不同區(qū)塊鏈分組的區(qū)塊鏈節(jié)點也不能訪問其它區(qū)塊鏈分組中的其它數(shù)據(jù),如不能訪問其它區(qū)塊鏈分組中的節(jié)點獨立數(shù)據(jù)。
進(jìn)一步地,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括:同一區(qū)塊鏈分組內(nèi)的任一區(qū)塊鏈節(jié)點分別對應(yīng)著一份節(jié)點獨立數(shù)據(jù)。
同一區(qū)塊鏈分組內(nèi)的任一區(qū)塊鏈節(jié)點都分別對應(yīng)著一份節(jié)點獨立數(shù)據(jù)。其中,同一區(qū)塊鏈分組內(nèi)的各個區(qū)塊鏈節(jié)點的節(jié)點獨立數(shù)據(jù)是互相隔離的。需要說明的是,節(jié)點獨立數(shù)據(jù)是和區(qū)塊鏈節(jié)點屬性相關(guān)的數(shù)據(jù),每個區(qū)塊鏈節(jié)點都有其對應(yīng)的節(jié)點獨立數(shù)據(jù),不允許其它區(qū)塊鏈節(jié)點讀取不屬于它的節(jié)點獨立數(shù)據(jù)。隔離節(jié)點獨立數(shù)據(jù)的方法包括但不限于物理隔離、權(quán)限隔離和訪問標(biāo)識隔離。
需要說明的是,為了防止在數(shù)據(jù)存儲空間讀取和寫入數(shù)據(jù)過程中,出現(xiàn)節(jié)點獨立數(shù)據(jù)被錯誤覆蓋的情況,在數(shù)據(jù)存儲空間中,節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)是隔離存儲的,即節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)所在的存儲區(qū)域是不一樣。
進(jìn)一步地,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括:
步驟a,獲取所述數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)量,以及所述數(shù)據(jù)存儲空間的訪問性能;
步驟b,根據(jù)所述數(shù)據(jù)量和所述訪問性能對所述數(shù)據(jù)存儲空間進(jìn)行擴(kuò)容,并在間隔預(yù)設(shè)時間對所述數(shù)據(jù)存儲空間所存儲的所述節(jié)點獨立數(shù)據(jù)和所述共享數(shù)據(jù)進(jìn)行備份。
進(jìn)一步地,獲取數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)量、以及數(shù)據(jù)存儲空間的訪問性能,根據(jù)所獲取的數(shù)據(jù)量和訪問性能對數(shù)據(jù)存儲空間進(jìn)行擴(kuò)容,并在間隔預(yù)設(shè)時間對數(shù)據(jù)存儲空間所存儲的節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)進(jìn)行備份。其中,訪問性能可以理解為數(shù)據(jù)存儲空間可同時接收多少個區(qū)塊鏈節(jié)點的訪問請求。預(yù)設(shè)時間可根據(jù)具體需要而設(shè)置,如可設(shè)置間隔10天對數(shù)據(jù)存儲空間所存儲的節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)進(jìn)行備份。
本實施例通過當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行所述執(zhí)行指令的區(qū)塊鏈節(jié)點;將所述區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù);設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)。在區(qū)塊鏈節(jié)點數(shù)據(jù)已經(jīng)分布式存儲的基礎(chǔ)上,對區(qū)塊鏈節(jié)點進(jìn)行分組,使同一區(qū)塊鏈分組內(nèi)的區(qū)塊鏈節(jié)點共同訪問同一份共享數(shù)據(jù),實現(xiàn)了區(qū)塊鏈節(jié)點之間數(shù)據(jù)的共享。
進(jìn)一步地,提出本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問方法第二實施例。
所述區(qū)塊鏈數(shù)據(jù)訪問方法第二實施例與所述區(qū)塊鏈數(shù)據(jù)訪問方法第一實施例的區(qū)別在于,參照圖2,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括:
步驟s40,采用跨進(jìn)程訪問技術(shù)定義所述區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口;
步驟s50,通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作或?qū)懭氩僮鳌?/p>
采用跨進(jìn)程訪問技術(shù)定義區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口,通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的讀取操作或?qū)懭氩僮?。需要說明的是,區(qū)塊鏈節(jié)點和數(shù)據(jù)存儲空間可能不在同一個進(jìn)程里面,或者不在同一臺物理服務(wù)器上。因此,需要通過跨進(jìn)程訪問技術(shù)實現(xiàn)不同的區(qū)塊鏈節(jié)點訪問同一個數(shù)據(jù)存儲空間。跨進(jìn)程訪問技術(shù)包括但不限于ipc(inter-processcommunication,進(jìn)程間通信)技術(shù)、socket網(wǎng)絡(luò)編程技術(shù)和數(shù)據(jù)序列化協(xié)議技術(shù)。
在區(qū)塊鏈節(jié)點在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)和節(jié)點獨立數(shù)據(jù)的讀取操作或?qū)懭氩僮鬟^程中,需要調(diào)用數(shù)據(jù)訪問接口。在對數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)進(jìn)行的讀取操作分為單個共享數(shù)據(jù)或單個節(jié)點獨立數(shù)據(jù)的讀取,以及批量共享數(shù)據(jù)或批量節(jié)點獨立數(shù)據(jù)的讀取。
單個共享數(shù)據(jù)或或者節(jié)點獨立數(shù)據(jù)的讀取過程可為:result=get(key,value,useindex=false,cachepolicy=cached)。即獲取待讀取數(shù)據(jù)的標(biāo)識key,從數(shù)據(jù)緩存空間中獲取與key對應(yīng)的待讀取數(shù)據(jù)的value值,并將讀取是否成功的標(biāo)志位添加至result里,其中,待讀取數(shù)據(jù)可為共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)。result是根據(jù)操作結(jié)果來確定,如0表示待讀取數(shù)據(jù)讀取失敗,1表示待讀取數(shù)據(jù)讀取成功。當(dāng)useindex取值為false時,key為直接指向數(shù)據(jù);當(dāng)useindex取值為true時,key為索引數(shù)據(jù)的標(biāo)識,此時,區(qū)塊鏈節(jié)點先在數(shù)據(jù)存儲空間中的數(shù)據(jù)索引區(qū)域檢索key所對應(yīng)的值datakey,再用datakey去數(shù)據(jù)存儲空間獲取真正的待讀取數(shù)據(jù)。當(dāng)cachepolicy取值為cached時,從區(qū)塊鏈節(jié)點的緩存空間中讀取待讀取數(shù)據(jù);當(dāng)cachepolicy取值為nocache時,直接從數(shù)據(jù)存儲空間中讀取待讀取數(shù)據(jù)。
在本實施例中,區(qū)塊鏈節(jié)點可分為業(yè)務(wù)邏輯層和緩存層,即區(qū)塊鏈節(jié)點包括業(yè)務(wù)邏輯層和緩存層,緩存層即為本發(fā)明實施例中所提及的緩存空間。
批量共享數(shù)據(jù)或批量節(jié)點獨立數(shù)據(jù)的讀取過程可為:successcount=getbatch(list[key,useindex],valuelist[values],cachepolicy=cached)。即獲取一個或多個待讀取數(shù)據(jù)的key,根據(jù)所獲取的key從數(shù)據(jù)存儲空間里獲取對應(yīng)的待讀取數(shù)據(jù)的value值,將所獲取的value值存入valuelist里。需要說明的是,在進(jìn)行多個待讀取數(shù)據(jù)的讀取過程中,可能一部分的待讀取數(shù)據(jù)會處于錯誤或缺失狀態(tài),此時,區(qū)塊鏈節(jié)點的業(yè)務(wù)邏輯層需要對所讀取的待讀取數(shù)據(jù)的完整性,有效性進(jìn)行檢查。在進(jìn)行完整性檢查過程中,當(dāng)所獲取的key的個數(shù)和所獲取的value值的個數(shù)不一致時,確定所讀取的待讀取數(shù)據(jù)不完整;當(dāng)所獲取的key的個數(shù)和所獲取的value值的個數(shù)一致時,確定所讀取的待讀取數(shù)據(jù)完整。在進(jìn)行有效性檢查過程中,可通過檢查所讀取的待讀取數(shù)據(jù)的格式來確定有效性,如通過檢查待讀取數(shù)據(jù)字符串長度、以及對應(yīng)的變量范圍等確定有效性。useindex以及cachepolicy與單個共享數(shù)據(jù)或單個節(jié)點獨立數(shù)據(jù)的讀取過程中的useindex以及cachepolicy相同,在此不再贅述。
單個共享數(shù)據(jù)或單個節(jié)點獨立數(shù)據(jù)的寫入過程可為:put(key,value,cachepolicy=cached)。在寫入待寫入數(shù)據(jù)的過程中,設(shè)置待寫入數(shù)據(jù)的標(biāo)識key和對應(yīng)的value值,然后將key和value值關(guān)聯(lián)寫入數(shù)據(jù)緩存空間中。其中,待寫入數(shù)據(jù)為共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)。在將待寫入數(shù)據(jù)寫入數(shù)據(jù)存儲空間的過程中,可先判斷數(shù)據(jù)緩存空間中是否已存在與key對應(yīng)的待寫入數(shù)據(jù),即判斷數(shù)據(jù)緩存空間中是否已存在與key對應(yīng)的value值。若數(shù)據(jù)緩存空間中已存在與key對應(yīng)的數(shù)據(jù)并且value值不同時,則可覆蓋寫入待寫入數(shù)據(jù);若數(shù)據(jù)緩存空間中未存在與key對應(yīng)的數(shù)據(jù),則在數(shù)據(jù)存儲空間中建立一個新的數(shù)據(jù)存儲項,在所建立的數(shù)據(jù)存儲項中寫入待寫入數(shù)據(jù)。當(dāng)待寫入數(shù)據(jù)為共享數(shù)據(jù)時,將待寫入數(shù)據(jù)寫入共享數(shù)據(jù)所在的存儲區(qū)域;當(dāng)待寫入數(shù)據(jù)為節(jié)點獨立數(shù)據(jù)時,將待寫入數(shù)據(jù)寫入節(jié)點屬性數(shù)據(jù)所在的存儲的區(qū)域。需要說明的是,put操作可以進(jìn)行隊列緩存,在批量寫入待寫入數(shù)據(jù)時,不用每次發(fā)生put操作時都調(diào)用數(shù)據(jù)存儲空間,而是在待寫入數(shù)據(jù)的批量寫入操作完成時一次提交到數(shù)據(jù)存儲空間即可。當(dāng)cachepolicy取值為cached時,在區(qū)塊鏈節(jié)點的緩存空間中寫入待寫入數(shù)據(jù);當(dāng)cachepolicy取值為nocache時,直接在數(shù)據(jù)存儲空間中寫入待寫入數(shù)據(jù)。
在批量寫入共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)過程中,將發(fā)生變化的待寫入數(shù)據(jù)批量提交給緩存空間和數(shù)據(jù)存儲空間。在批量寫入待寫入數(shù)據(jù)過程中,要保證待寫入數(shù)據(jù)是全部寫入成功,或者全部寫入不成功。當(dāng)待寫入數(shù)據(jù)部分寫入成功,部分寫入失敗時,會將寫入成功的待寫入數(shù)據(jù)返回至未寫入緩存空間或數(shù)據(jù)存儲空間前的狀態(tài)。
進(jìn)一步地,步驟s60包括:
步驟c,當(dāng)通過所述數(shù)據(jù)訪問接口偵測到所述寫入操作對應(yīng)的寫入請求時,獲取所述待寫入共享數(shù)據(jù)的標(biāo)識;
步驟d,根據(jù)所述標(biāo)識將所述待寫入共享數(shù)據(jù)寫入所述數(shù)據(jù)存儲空間中。
進(jìn)一步地,當(dāng)通過數(shù)據(jù)訪問接口偵測到寫入操作對應(yīng)的寫入請求時,獲取待寫入共享數(shù)據(jù)的標(biāo)識,根據(jù)待寫入共享數(shù)據(jù)的標(biāo)識將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中。
當(dāng)通過數(shù)據(jù)訪問接口偵測到讀取操作對應(yīng)的讀取請求時,獲取讀取待讀取共享數(shù)據(jù)的標(biāo)識,根據(jù)待讀取共享數(shù)據(jù)的標(biāo)識從數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)。
需要說明的是,將待寫入共享數(shù)據(jù)寫入緩存空間,以及從緩存空間讀取待讀取共享數(shù)據(jù)的過程中,都需要通過共享數(shù)據(jù)的標(biāo)識來完成寫入操作和讀取操作。節(jié)點獨立數(shù)據(jù)的讀取操作和寫入操作過程與共享數(shù)據(jù)的讀取操作和寫入操作過程相似,在此不再贅述。節(jié)點獨立數(shù)據(jù)的讀取操作和寫入操作所用的標(biāo)識是由所操作的數(shù)據(jù)標(biāo)識和區(qū)塊鏈節(jié)點標(biāo)識組成,而共享數(shù)據(jù)的讀取操作和寫入操作所用的標(biāo)識不包括區(qū)塊鏈節(jié)點標(biāo)識,只是所操作數(shù)據(jù)的數(shù)據(jù)標(biāo)識。
進(jìn)一步地,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括::
步驟e,若根據(jù)在所述數(shù)據(jù)訪問接口中設(shè)置的緩存策略確定所寫入或所讀取的共享數(shù)據(jù)可被緩存,則在所述區(qū)塊鏈節(jié)點的緩存空間中緩存所寫入或所讀取的共享數(shù)據(jù)。
進(jìn)一步地,當(dāng)定義數(shù)據(jù)訪問接口后,可在數(shù)據(jù)訪問接口中設(shè)置緩存策略。緩存策略可為:當(dāng)生成區(qū)塊數(shù)據(jù)后,將區(qū)塊數(shù)據(jù)寫入緩存空間中(區(qū)塊數(shù)據(jù)生成之后就不會再改變);由于一部分智能合約狀態(tài)數(shù)據(jù)在智能合約運行過程中會被改變,而另一部分的智能合約狀態(tài)數(shù)據(jù)不一定會被改變,因此,可將智能合約狀態(tài)數(shù)據(jù)設(shè)置為可緩存數(shù)據(jù)等。需要說明的是,在智能合約狀態(tài)數(shù)據(jù)更新時,應(yīng)同時更新區(qū)塊鏈節(jié)點緩存空間中的智能合約狀態(tài)數(shù)據(jù)。在本發(fā)明實施例中,緩存算法為lru(leastrecentlyused,近期最少使用算法),在根據(jù)lru緩存數(shù)據(jù)過程中,可根據(jù)緩存空間中數(shù)據(jù)量的增長和使用情況,調(diào)整lru緩存的大小。
在執(zhí)行共享數(shù)據(jù)的寫入操作或讀取操作過程中,若根據(jù)在數(shù)據(jù)訪問接口中設(shè)置的緩存策略確定所寫入或讀取的共享數(shù)據(jù)可被緩存,則在區(qū)塊鏈節(jié)點的緩存空間中緩存所寫入或所讀取的共享數(shù)據(jù)。
需要說明的是,緩存空間是負(fù)載共享數(shù)據(jù)和節(jié)點獨立數(shù)據(jù)的落盤存儲。在緩存空間中,包括物理數(shù)據(jù)服務(wù)器、存儲設(shè)備、操作裝置和數(shù)據(jù)庫軟件等組件,緩存空間支持key-value格式的存儲。
需要說明的是,節(jié)點獨立數(shù)據(jù)的緩存過程與共享數(shù)據(jù)的緩存過程相似,在此不再贅述。
本實施例通過采用跨進(jìn)程訪問技術(shù)定義區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口,提高了區(qū)塊鏈節(jié)點數(shù)據(jù)的讀寫性能。
進(jìn)一步地,提出本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問方法第三實施例。
所述區(qū)塊鏈數(shù)據(jù)訪問方法第三實施例與所述區(qū)塊鏈數(shù)據(jù)訪問方法第二實施例的區(qū)別在于,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括:
步驟f,判斷所述區(qū)塊鏈節(jié)點是否已緩存待寫入共享數(shù)據(jù);
步驟g,若所述區(qū)塊鏈節(jié)點未緩存所述待寫入共享數(shù)據(jù),或所述區(qū)塊鏈節(jié)點中已緩存所述待寫入共享數(shù)據(jù),但所述待寫入共享數(shù)據(jù)對應(yīng)的值需要更新,則執(zhí)行所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的寫入操作的步驟。
將共享數(shù)據(jù)寫入?yún)^(qū)塊鏈節(jié)點對應(yīng)的數(shù)據(jù)存儲空間的具體過程為:判斷區(qū)塊鏈節(jié)點的緩存空間是否緩存有待寫入共享數(shù)據(jù)。若區(qū)塊鏈節(jié)點的緩存空間未緩存待寫入共享數(shù)據(jù),則通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的寫入操作,將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中;若區(qū)塊鏈節(jié)點的緩存空間已緩存待寫入共享數(shù)據(jù),則判斷緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值是否需要更新。若緩存空間中已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值需要更新,則通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的寫入操作,將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中;若緩存空間中已緩存的待寫入節(jié)點共享戶數(shù)對應(yīng)的值不需要更新,則不執(zhí)行共享數(shù)據(jù)的寫入操作,即不將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中。
可以理解的是,可通過判斷緩存空間所緩存的待寫入共享數(shù)據(jù)對應(yīng)的值與需要寫入的待寫入共享數(shù)據(jù)對應(yīng)的值是否一致,來確定緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值是否需要更新。當(dāng)緩存空間所緩存的待寫入共享數(shù)據(jù)對應(yīng)的值與需要寫入的待寫入共享數(shù)據(jù)對應(yīng)的值一致時,緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值不需要更新;當(dāng)緩存空間所緩存的待寫入共享數(shù)據(jù)對應(yīng)的值與需要寫入的待寫入共享數(shù)據(jù)對應(yīng)的值不一致時,緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值需要更新。
進(jìn)一步地,通過數(shù)據(jù)訪問接口分離數(shù)據(jù)存儲空間和緩存空間,即通過數(shù)據(jù)訪問接口實現(xiàn)區(qū)塊鏈節(jié)點和數(shù)據(jù)存儲空間的分離部署。
進(jìn)一步地,在將節(jié)點獨立數(shù)據(jù)中的節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間過程中,需要將節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間中的節(jié)點獨立數(shù)據(jù)存儲區(qū)域。在通過數(shù)據(jù)訪問接口將節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間過程中,可在數(shù)據(jù)訪問接口中,在節(jié)點屬性數(shù)據(jù)中添加區(qū)塊鏈節(jié)點標(biāo)識,以保證該節(jié)點屬性數(shù)據(jù)在數(shù)據(jù)存儲空間的節(jié)點獨立數(shù)據(jù)存儲區(qū)域中不會被其它區(qū)塊鏈節(jié)點的節(jié)點屬性數(shù)據(jù)覆蓋。在本發(fā)明實施例中,區(qū)塊鏈節(jié)點標(biāo)識是區(qū)塊鏈節(jié)點的私鑰。區(qū)塊鏈節(jié)點標(biāo)識用于區(qū)分不同區(qū)塊鏈節(jié)點的節(jié)點屬性數(shù)據(jù),數(shù)據(jù)標(biāo)識用于標(biāo)識不同的區(qū)塊鏈節(jié)點數(shù)據(jù),即用于標(biāo)識共享數(shù)據(jù)和節(jié)點獨立數(shù)據(jù)。通過數(shù)據(jù)標(biāo)識可以找到對應(yīng)的共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)。
需要說明的是,節(jié)點屬性數(shù)據(jù)包括但不限于區(qū)塊鏈節(jié)點的名稱、區(qū)塊鏈節(jié)點的配置信息、區(qū)塊鏈節(jié)點的運行狀態(tài)信息和統(tǒng)計信息。節(jié)點屬性數(shù)據(jù)的寫入操作是由節(jié)點屬性數(shù)據(jù)所在的區(qū)塊鏈節(jié)點觸發(fā)的,其它區(qū)塊鏈節(jié)點不能觸發(fā)不屬于它自己的節(jié)點屬性數(shù)據(jù)的寫入操作,因此,在將節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間后,可將該節(jié)點屬性數(shù)據(jù)緩存至對應(yīng)的緩存空間中。
在將區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間的過程中,區(qū)塊數(shù)據(jù)的標(biāo)識key是區(qū)塊數(shù)據(jù)的hash值,區(qū)塊數(shù)據(jù)的hash值是區(qū)塊數(shù)據(jù)值的體現(xiàn)。在將區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間的過程中,可通過區(qū)塊數(shù)據(jù)的hash值來判斷數(shù)據(jù)存儲空間是否已存在該區(qū)塊數(shù)據(jù)??梢岳斫獾氖牵?dāng)數(shù)據(jù)存儲空間中已存在與該區(qū)塊數(shù)據(jù)對應(yīng)的hash值,則確認(rèn)數(shù)據(jù)存儲空間中已存在該區(qū)塊數(shù)據(jù),且在該區(qū)塊數(shù)據(jù)對應(yīng)的值不需要更新時,不執(zhí)行區(qū)塊數(shù)據(jù)的寫入操作。當(dāng)數(shù)據(jù)存儲空間中未存在與該區(qū)塊數(shù)據(jù)對應(yīng)的hash值,則確認(rèn)數(shù)據(jù)存儲空間中未存在該區(qū)塊數(shù)據(jù)。當(dāng)數(shù)據(jù)存儲空間中未存在該區(qū)塊數(shù)據(jù),或數(shù)據(jù)存儲空間中的該區(qū)塊數(shù)據(jù)對應(yīng)的值需要更新時,執(zhí)行區(qū)塊數(shù)據(jù)的寫入操作,將該區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間中。由于將區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間后,就不會再改變,因此可將寫入數(shù)據(jù)儲存空間的區(qū)塊數(shù)據(jù)緩存至緩存空間中。
在區(qū)塊鏈節(jié)點部署智能合約后,需要將智能合約的字節(jié)碼寫入數(shù)據(jù)存儲空間??梢岳斫獾氖?,智能合約的字節(jié)碼屬于智能合約代碼。在將智能合約的字節(jié)碼寫入數(shù)據(jù)存儲空間過程中,字節(jié)碼的標(biāo)識key是智能合約數(shù)據(jù)的hash值,可以根據(jù)智能合約數(shù)據(jù)的hash值判斷該字節(jié)碼是否已存在數(shù)據(jù)存儲空間中。具體地,當(dāng)數(shù)據(jù)存儲空間中已存在該字節(jié)碼對應(yīng)的hash值時,確認(rèn)數(shù)據(jù)存儲空間中已存在該字節(jié)碼,且當(dāng)該字節(jié)碼對應(yīng)的值不需要更新時,不執(zhí)行字節(jié)碼的寫入操作;當(dāng)數(shù)據(jù)存儲空間中未存在該字節(jié)碼對應(yīng)的hash值,或數(shù)據(jù)存儲空間中存在該字節(jié)碼對應(yīng)的hash值,但該字節(jié)碼對應(yīng)的值需要更新時,執(zhí)行字節(jié)碼的寫入操作,將該字節(jié)碼寫入數(shù)據(jù)存儲空間中。
需要說明的是,在智能合約的字節(jié)碼生成之后,該字節(jié)碼就不會再改變。因此,在將字節(jié)碼寫入數(shù)據(jù)存儲空間后,可將字節(jié)碼緩存至緩存空間。
當(dāng)運行智能合約后,需要將智能合約狀態(tài)數(shù)據(jù)寫入數(shù)據(jù)存儲空間。智能合約狀態(tài)數(shù)據(jù)在智能合約運行過程中,可能會頻繁改變,每個智能合約狀態(tài)數(shù)據(jù)都對應(yīng)著唯一的標(biāo)識key。需要說明的是,智能合約狀態(tài)數(shù)據(jù)的操作類型比較復(fù)雜,不恰當(dāng)?shù)木彺娌呗钥赡軙?dǎo)致錯誤的運算結(jié)果。因此,可根據(jù)區(qū)塊鏈節(jié)點對應(yīng)的業(yè)務(wù)規(guī)則確定某個智能合約或者某個智能合約狀態(tài)數(shù)據(jù)可以被緩存。
索引數(shù)據(jù)中存儲的是區(qū)塊鏈節(jié)點的區(qū)塊高度和區(qū)塊hash,以及交易和交易所在區(qū)塊鏈節(jié)點的對應(yīng)關(guān)系。索引數(shù)據(jù)是由區(qū)塊鏈節(jié)點在新區(qū)塊生成時產(chǎn)生,索引數(shù)據(jù)生成之后就不會改變,因此,可通過索引數(shù)據(jù)的標(biāo)識key來判斷索引數(shù)據(jù)是否存在數(shù)據(jù)存儲空間中。
本實施例通過將區(qū)塊鏈節(jié)點對應(yīng)的共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中,提高了區(qū)塊鏈節(jié)點數(shù)據(jù)的寫性能。
進(jìn)一步地,提出本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問方法第四實施例。
所述區(qū)塊鏈數(shù)據(jù)訪問方法第四實施例與所述區(qū)塊鏈數(shù)據(jù)訪問方法第二實施例的區(qū)別在于,所述區(qū)塊鏈數(shù)據(jù)訪問方法還包括:
步驟h,判斷所述區(qū)塊鏈節(jié)點中是否緩存有待讀取共享數(shù)據(jù);
步驟i,若所述區(qū)塊鏈節(jié)點中未緩存所述待讀取共享數(shù)據(jù),則執(zhí)行所述通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作的步驟。
在數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)之前,先在緩存空間中進(jìn)行檢索,根據(jù)檢索所得的檢索結(jié)果判斷區(qū)塊鏈節(jié)點中是否已緩存有待讀取共享數(shù)據(jù)。若區(qū)塊鏈節(jié)點的緩存空間中已緩存待讀取共享數(shù)據(jù),則不執(zhí)行通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的讀取操作,即不在數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù);若區(qū)塊鏈節(jié)點的緩存空間中未緩存待讀取共享數(shù)據(jù),則執(zhí)行通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的讀取操作,在數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)??梢岳斫獾氖牵跀?shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)的過程中,通過待讀取數(shù)據(jù)的標(biāo)識key讀取待讀取共享數(shù)據(jù)。
需要說明的是,節(jié)點獨立數(shù)據(jù)的讀取操作和共享數(shù)據(jù)的讀取操作過程相似,在此不再贅述。
進(jìn)一步地,當(dāng)在數(shù)據(jù)存儲空間中讀取到待讀取共享數(shù)據(jù)后,若根據(jù)緩存策略確定所讀取的待讀取共享數(shù)據(jù)可被緩存,則將所讀取的待讀取共享數(shù)據(jù)緩存至緩存空間中。
當(dāng)在數(shù)據(jù)存儲空間讀取區(qū)塊數(shù)據(jù)過程中,可使用區(qū)塊高度讀取區(qū)塊數(shù)據(jù)。在使用區(qū)塊高度讀取區(qū)塊數(shù)據(jù)過程中,將區(qū)塊hash作為標(biāo)識key讀取區(qū)塊數(shù)據(jù)。在使用交易hash在數(shù)據(jù)存儲空間中查詢交易數(shù)據(jù)時,先查詢交易的索引信息,通過交易索引信息查找到區(qū)塊hash和交易在區(qū)塊里的位置,把交易所在的區(qū)塊先讀取出來,再在區(qū)塊的交易列表里讀取交易數(shù)據(jù)。在讀取智能合約的字節(jié)碼過程中,根據(jù)智能合約的hash值作為標(biāo)識key在數(shù)據(jù)存儲空間中讀取字節(jié)碼。在讀取智能合約狀態(tài)數(shù)據(jù)過程中,根據(jù)智能合約狀態(tài)數(shù)據(jù)的標(biāo)識key在數(shù)據(jù)存儲空間中讀取智能合約狀態(tài)數(shù)據(jù)。
本實施例通過在數(shù)據(jù)存儲空間讀取數(shù)據(jù)中,提高了區(qū)塊鏈節(jié)點數(shù)據(jù)的°性能。
本發(fā)明進(jìn)一步提供一種區(qū)塊鏈數(shù)據(jù)訪問裝置。
參照圖3,圖3為本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置的較佳實施例的功能模塊示意圖。
需要強調(diào)的是,對本領(lǐng)域的技術(shù)人員來說,圖3所示模塊圖僅僅是一個較佳實施例的示例圖,本領(lǐng)域的技術(shù)人員圍繞圖3所示的區(qū)塊鏈數(shù)據(jù)訪問裝置的模塊,可輕易進(jìn)行新的模塊的補充;各模塊的名稱是自定義名稱,僅用于輔助理解該區(qū)塊鏈數(shù)據(jù)訪問裝置的各個程序功能塊,不用于限定本發(fā)明的技術(shù)方案,本發(fā)明技術(shù)方案的核心是,各自定義名稱的模塊所要達(dá)成的功能。
在本實施例中,所述區(qū)塊鏈數(shù)據(jù)訪問裝置包括:
獲取模塊10,用于當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行所述執(zhí)行指令的區(qū)塊鏈節(jié)點;
在本發(fā)明實施例中,區(qū)塊鏈節(jié)點存在對等網(wǎng)絡(luò)中。在對等網(wǎng)絡(luò)中,區(qū)塊鏈節(jié)點之間可以互相通信,構(gòu)成一個對等的網(wǎng)狀結(jié)構(gòu),以減少中心網(wǎng)絡(luò)的開銷;當(dāng)一個區(qū)塊鏈節(jié)點產(chǎn)生數(shù)據(jù)時,可以同時向?qū)Φ染W(wǎng)絡(luò)中的其它區(qū)塊鏈節(jié)點發(fā)送廣播,區(qū)塊鏈節(jié)點也可以在其它任意區(qū)塊鏈節(jié)點中查詢和獲取數(shù)據(jù)。區(qū)塊鏈節(jié)點是指參與到區(qū)塊鏈網(wǎng)絡(luò)里,進(jìn)行交易和數(shù)據(jù)交換的網(wǎng)絡(luò)節(jié)點,每個獨立機(jī)構(gòu)可以擁有一個或者多個交易節(jié)點,每個交易節(jié)點是一組物理網(wǎng)絡(luò)、計算機(jī)、區(qū)塊鏈應(yīng)用軟件以及數(shù)據(jù)庫的組合。在區(qū)塊鏈節(jié)點中,可以執(zhí)行區(qū)塊鏈業(yè)務(wù)邏輯,如執(zhí)行交易驗證、共識計算等。
當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行該執(zhí)行指令的區(qū)塊鏈節(jié)點。需要說明的是,在一個機(jī)構(gòu)中,每個業(yè)務(wù)使用不同的區(qū)塊鏈實例,一個業(yè)務(wù)(一個區(qū)塊鏈實例)可對應(yīng)著一個或者多個區(qū)塊鏈節(jié)點。
配置模塊20,用于將所述區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù);
當(dāng)確定執(zhí)行該執(zhí)行指令的區(qū)塊鏈節(jié)點時,將區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù)。需要說明的是,若一個區(qū)塊鏈實例對應(yīng)著至少兩個區(qū)塊鏈節(jié)點,則在將區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組的過程中,要將同一個區(qū)塊鏈實例對應(yīng)著的至少兩個區(qū)塊鏈節(jié)點配置到同一區(qū)塊鏈分組中。共享數(shù)據(jù)包括但不限于區(qū)塊數(shù)據(jù)、智能合約數(shù)據(jù)和索引數(shù)據(jù)。區(qū)塊數(shù)據(jù)為區(qū)塊鏈節(jié)點運行時所需數(shù)據(jù),包括區(qū)塊頭;智能合約數(shù)據(jù)包括智能合約代碼和智能合約狀態(tài)數(shù)據(jù)。
進(jìn)一步地,對于同一區(qū)塊鏈分組內(nèi)的各個區(qū)塊鏈節(jié)點,可以重復(fù)寫入共享數(shù)據(jù),可以讀取共享數(shù)據(jù),以及同時寫入相同的共享數(shù)據(jù)。
設(shè)置模塊30,用于設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)。
設(shè)置與區(qū)塊鏈分組對應(yīng)數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的區(qū)塊鏈節(jié)點,在數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)??梢岳斫獾氖?,不同機(jī)構(gòu)之間的區(qū)塊鏈節(jié)點不允許訪問同一份共享數(shù)據(jù),不同區(qū)塊鏈分組的區(qū)塊鏈節(jié)點也不允許訪問同一份共享數(shù)據(jù),不同區(qū)塊鏈分組的區(qū)塊鏈節(jié)點也不能訪問其它區(qū)塊鏈分組中的其它數(shù)據(jù),如不能訪問其它區(qū)塊鏈分組中的節(jié)點獨立數(shù)據(jù)。
進(jìn)一步地,同一區(qū)塊鏈分組內(nèi)的任一區(qū)塊鏈節(jié)點分別對應(yīng)著一份節(jié)點獨立數(shù)據(jù)。
同一區(qū)塊鏈分組內(nèi)的任一區(qū)塊鏈節(jié)點都分別對應(yīng)著一份節(jié)點獨立數(shù)據(jù)。其中,同一區(qū)塊鏈分組內(nèi)的各個區(qū)塊鏈節(jié)點的節(jié)點獨立數(shù)據(jù)是互相隔離的。需要說明的是,節(jié)點獨立數(shù)據(jù)是和區(qū)塊鏈節(jié)點屬性相關(guān)的數(shù)據(jù),每個區(qū)塊鏈節(jié)點都有其對應(yīng)的節(jié)點獨立數(shù)據(jù),不允許其它區(qū)塊鏈節(jié)點讀取不屬于它的節(jié)點獨立數(shù)據(jù)。隔離節(jié)點獨立數(shù)據(jù)的方法包括但不限于物理隔離、權(quán)限隔離和訪問標(biāo)識隔離。
需要說明的是,為了防止在數(shù)據(jù)存儲空間讀取和寫入數(shù)據(jù)過程中,出現(xiàn)節(jié)點獨立數(shù)據(jù)被錯誤覆蓋的情況,在數(shù)據(jù)存儲空間中,節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)是隔離存儲的,即節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)所在的存儲區(qū)域是不一樣。
進(jìn)一步地,所述獲取模塊10還用于獲取所述數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)量,以及所述數(shù)據(jù)存儲空間的訪問性能;
所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
擴(kuò)容模塊,用于根據(jù)所述數(shù)據(jù)量和所述訪問性能對所述數(shù)據(jù)存儲空間進(jìn)行擴(kuò)容;
備份模塊,用于在間隔預(yù)設(shè)時間對所述數(shù)據(jù)存儲空間所存儲的所述節(jié)點獨立數(shù)據(jù)和所述共享數(shù)據(jù)進(jìn)行備份。
進(jìn)一步地,獲取數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)量、以及數(shù)據(jù)存儲空間的訪問性能,根據(jù)所獲取的數(shù)據(jù)量和訪問性能對數(shù)據(jù)存儲空間進(jìn)行擴(kuò)容,并在間隔預(yù)設(shè)時間對數(shù)據(jù)存儲空間所存儲的節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)進(jìn)行備份。其中,訪問性能可以理解為數(shù)據(jù)存儲空間可同時接收多少個區(qū)塊鏈節(jié)點的訪問請求。預(yù)設(shè)時間可根據(jù)具體需要而設(shè)置,如可設(shè)置間隔10天對數(shù)據(jù)存儲空間所存儲的節(jié)點獨立數(shù)據(jù)和共享數(shù)據(jù)進(jìn)行備份。
本實施例通過當(dāng)偵測到執(zhí)行區(qū)塊鏈實例的執(zhí)行指令時,獲取執(zhí)行所述執(zhí)行指令的區(qū)塊鏈節(jié)點;將所述區(qū)塊鏈節(jié)點配置到預(yù)設(shè)的區(qū)塊鏈分組中,其中,同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點對應(yīng)著同一份共享數(shù)據(jù);設(shè)置與所述區(qū)塊鏈分組對應(yīng)的數(shù)據(jù)存儲空間,以使同一區(qū)塊鏈分組內(nèi)的所述區(qū)塊鏈節(jié)點,在所述數(shù)據(jù)存儲空間中訪問同一份共享數(shù)據(jù)。在區(qū)塊鏈節(jié)點數(shù)據(jù)已經(jīng)分布式存儲的基礎(chǔ)上,對區(qū)塊鏈節(jié)點進(jìn)行分組,使同一區(qū)塊鏈分組內(nèi)的區(qū)塊鏈節(jié)點共同訪問同一份共享數(shù)據(jù),實現(xiàn)了區(qū)塊鏈節(jié)點之間數(shù)據(jù)的共享。
進(jìn)一步地,提出本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置第二實施例。
所述區(qū)塊鏈數(shù)據(jù)訪問裝置第二實施例與所述區(qū)塊鏈數(shù)據(jù)訪問裝置第一實施例的區(qū)別在于,參照圖4,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
定義模塊40,用于采用跨進(jìn)程訪問技術(shù)定義所述區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口;
執(zhí)行模塊50,用于通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作或?qū)懭氩僮鳌?/p>
采用跨進(jìn)程訪問技術(shù)定義區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口,通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的讀取操作或?qū)懭氩僮?。需要說明的是,區(qū)塊鏈節(jié)點和數(shù)據(jù)存儲空間可能不在同一個進(jìn)程里面,或者不在同一臺物理服務(wù)器上。因此,需要通過跨進(jìn)程訪問技術(shù)實現(xiàn)不同的區(qū)塊鏈節(jié)點訪問同一個數(shù)據(jù)存儲空間??邕M(jìn)程訪問技術(shù)包括但不限于ipc(inter-processcommunication,進(jìn)程間通信)技術(shù)、socket網(wǎng)絡(luò)編程技術(shù)和數(shù)據(jù)序列化協(xié)議技術(shù)。
在區(qū)塊鏈節(jié)點在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)和節(jié)點獨立數(shù)據(jù)的讀取操作或?qū)懭氩僮鬟^程中,需要調(diào)用數(shù)據(jù)訪問接口。在對數(shù)據(jù)存儲空間所存儲的數(shù)據(jù)進(jìn)行的讀取操作分為單個共享數(shù)據(jù)或單個節(jié)點獨立數(shù)據(jù)的讀取,以及批量共享數(shù)據(jù)或批量節(jié)點獨立數(shù)據(jù)的讀取。
單個共享數(shù)據(jù)或或者節(jié)點獨立數(shù)據(jù)的讀取過程可為:result=get(key,value,useindex=false,cachepolicy=cached)。即獲取待讀取數(shù)據(jù)的標(biāo)識key,從數(shù)據(jù)緩存空間中獲取與key對應(yīng)的待讀取數(shù)據(jù)的value值,并將讀取是否成功的標(biāo)志位添加至result里,其中,待讀取數(shù)據(jù)可為共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)。result是根據(jù)操作結(jié)果來確定,如0表示待讀取數(shù)據(jù)讀取失敗,1表示待讀取數(shù)據(jù)讀取成功。當(dāng)useindex取值為false時,key為直接指向數(shù)據(jù);當(dāng)useindex取值為true時,key為索引數(shù)據(jù)的標(biāo)識,此時,區(qū)塊鏈節(jié)點先在數(shù)據(jù)存儲空間中的數(shù)據(jù)索引區(qū)域檢索key所對應(yīng)的值datakey,再用datakey去數(shù)據(jù)存儲空間獲取真正的待讀取數(shù)據(jù)。當(dāng)cachepolicy取值為cached時,從區(qū)塊鏈節(jié)點的緩存空間中讀取待讀取數(shù)據(jù);當(dāng)cachepolicy取值為nocache時,直接從數(shù)據(jù)存儲空間中讀取待讀取數(shù)據(jù)。
在本實施例中,區(qū)塊鏈節(jié)點可分為業(yè)務(wù)邏輯層和緩存層,即區(qū)塊鏈節(jié)點包括業(yè)務(wù)邏輯層和緩存層,緩存層即為本發(fā)明實施例中所提及的緩存空間。
批量共享數(shù)據(jù)或批量節(jié)點獨立數(shù)據(jù)的讀取過程可為:successcount=getbatch(list[key,useindex],valuelist[values],cachepolicy=cached)。即獲取一個或多個待讀取數(shù)據(jù)的key,根據(jù)所獲取的key從數(shù)據(jù)存儲空間里獲取對應(yīng)的待讀取數(shù)據(jù)的value值,將所獲取的value值存入valuelist里。需要說明的是,在進(jìn)行多個待讀取數(shù)據(jù)的讀取過程中,可能一部分的待讀取數(shù)據(jù)會處于錯誤或缺失狀態(tài),此時,區(qū)塊鏈節(jié)點的業(yè)務(wù)邏輯層需要對所讀取的待讀取數(shù)據(jù)的完整性,有效性進(jìn)行檢查。在進(jìn)行完整性檢查過程中,當(dāng)所獲取的key的個數(shù)和所獲取的value值的個數(shù)不一致時,確定所讀取的待讀取數(shù)據(jù)不完整;當(dāng)所獲取的key的個數(shù)和所獲取的value值的個數(shù)一致時,確定所讀取的待讀取數(shù)據(jù)完整。在進(jìn)行有效性檢查過程中,可通過檢查所讀取的待讀取數(shù)據(jù)的格式來確定有效性,如通過檢查待讀取數(shù)據(jù)字符串長度、以及對應(yīng)的變量范圍等確定有效性。useindex,以及cachepolicy與單個共享數(shù)據(jù)或單個節(jié)點獨立數(shù)據(jù)的讀取過程中的useindex以及cachepolicy相同,在此不再贅述。
單個共享數(shù)據(jù)或單個節(jié)點獨立數(shù)據(jù)的寫入過程可為:put(key,value,cachepolicy=cached)。在寫入待寫入數(shù)據(jù)的過程中,設(shè)置待寫入數(shù)據(jù)的標(biāo)識key和對應(yīng)的value值,然后將key和value值關(guān)聯(lián)寫入數(shù)據(jù)緩存空間中。其中,待寫入數(shù)據(jù)為共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)。在將待寫入數(shù)據(jù)寫入數(shù)據(jù)存儲空間的過程中,可先判斷數(shù)據(jù)緩存空間中是否已存在與key對應(yīng)的待寫入數(shù)據(jù),即判斷數(shù)據(jù)緩存空間中是否已存在與key對應(yīng)的value值。若數(shù)據(jù)緩存空間中已存在與key對應(yīng)的數(shù)據(jù)并且value值不同時,則可覆蓋寫入待寫入數(shù)據(jù);若數(shù)據(jù)存儲空間中未存在與key對應(yīng)的數(shù)據(jù),則在數(shù)據(jù)存儲空間中建立一個新的數(shù)據(jù)存儲項,在所建立的數(shù)據(jù)存儲項中寫入待寫入數(shù)據(jù)。當(dāng)待寫入數(shù)據(jù)為共享數(shù)據(jù)時,將待寫入數(shù)據(jù)寫入共享數(shù)據(jù)所在的存儲區(qū)域;當(dāng)待寫入數(shù)據(jù)為節(jié)點獨立數(shù)據(jù)時,將待寫入數(shù)據(jù)寫入節(jié)點屬性數(shù)據(jù)所在的存儲的區(qū)域。需要說明的是,put操作可以進(jìn)行隊列緩存,在批量寫入待寫入數(shù)據(jù)時,不用每次發(fā)生put操作時都調(diào)用數(shù)據(jù)存儲空間,而是在待寫入數(shù)據(jù)的批量寫入操作完成時一次提交到數(shù)據(jù)存儲空間即可。當(dāng)cachepolicy取值為cached時,在區(qū)塊鏈節(jié)點的緩存空間中寫入待寫入數(shù)據(jù);當(dāng)cachepolicy取值為nocache時,直接在數(shù)據(jù)存儲空間中寫入待寫入數(shù)據(jù)。
在批量寫入共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)過程中,將發(fā)生變化的待寫入數(shù)據(jù)批量提交給緩存空間和數(shù)據(jù)存儲空間。在批量寫入待寫入數(shù)據(jù)過程中,要保證待寫入數(shù)據(jù)是全部寫入成功,或者全部寫入不成功。當(dāng)待寫入數(shù)據(jù)部分寫入成功,部分寫入失敗時,會將寫入成功的待寫入數(shù)據(jù)返回至未寫入緩存空間或數(shù)據(jù)存儲空間前的狀態(tài)。
進(jìn)一步地,所述執(zhí)行模塊50包括:
獲取單元,用于當(dāng)通過所述數(shù)據(jù)訪問接口偵測到所述寫入操作對應(yīng)的寫入請求時,獲取所述待寫入共享數(shù)據(jù)的標(biāo)識;
寫入單元,用于根據(jù)所述標(biāo)識將所述待寫入共享數(shù)據(jù)寫入所述數(shù)據(jù)存儲空間中。
進(jìn)一步地,當(dāng)通過數(shù)據(jù)訪問接口偵測到寫入操作對應(yīng)的寫入請求時,獲取待寫入共享數(shù)據(jù)的標(biāo)識,根據(jù)待寫入共享數(shù)據(jù)的標(biāo)識將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中。
當(dāng)通過數(shù)據(jù)訪問接口偵測到讀取操作對應(yīng)的讀取請求時,獲取讀取待讀取共享數(shù)據(jù)的標(biāo)識,根據(jù)待讀取共享數(shù)據(jù)的標(biāo)識從數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)。
需要說明的是,將待寫入共享數(shù)據(jù)寫入緩存空間,以及從緩存空間讀取待讀取共享數(shù)據(jù)的過程中,都需要通過共享數(shù)據(jù)的標(biāo)識來完成寫入操作和讀取操作。節(jié)點獨立數(shù)據(jù)的讀取操作和寫入操作過程與共享數(shù)據(jù)的讀取操作和寫入操作過程相似,在此不再贅述。節(jié)點獨立數(shù)據(jù)的讀取操作和寫入操作所用的標(biāo)識是由所操作的數(shù)據(jù)標(biāo)識和區(qū)塊鏈節(jié)點標(biāo)識組成,而共享數(shù)據(jù)的讀取操作和寫入操作所用的標(biāo)識不包括區(qū)塊鏈節(jié)點標(biāo)識,只是所操作數(shù)據(jù)的數(shù)據(jù)標(biāo)識。
進(jìn)一步地,,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
緩存模塊,用于若根據(jù)在所述數(shù)據(jù)訪問接口中設(shè)置的緩存策略確定所寫入或所讀取的共享數(shù)據(jù)可被緩存,則在所述區(qū)塊鏈節(jié)點的緩存空間中緩存所寫入或所讀取的共享數(shù)據(jù)。
進(jìn)一步地,當(dāng)定義數(shù)據(jù)訪問接口后,可在數(shù)據(jù)訪問接口中設(shè)置緩存策略。緩存策略可為:當(dāng)生成區(qū)塊數(shù)據(jù)后,將區(qū)塊數(shù)據(jù)寫入緩存空間中(區(qū)塊數(shù)據(jù)生成之后就不會再改變);由于一部分智能合約狀態(tài)數(shù)據(jù)在智能合約運行過程中會被改變,而另一部分的智能合約狀態(tài)數(shù)據(jù)不一定會被改變,因此,可將智能合約狀態(tài)數(shù)據(jù)設(shè)置為可緩存數(shù)據(jù)等。需要說明的是,在智能合約狀態(tài)數(shù)據(jù)更新時,應(yīng)同時更新區(qū)塊鏈節(jié)點緩存空間中的智能合約狀態(tài)數(shù)據(jù)。在本發(fā)明實施例中,緩存算法為lru(leastrecentlyused,近期最少使用算法),在根據(jù)lru緩存數(shù)據(jù)過程中,可根據(jù)緩存空間中數(shù)據(jù)量的增長和使用情況,調(diào)整lru緩存的大小。
在執(zhí)行共享數(shù)據(jù)的寫入操作或讀取操作過程中,若根據(jù)在數(shù)據(jù)訪問接口中設(shè)置的緩存策略確定所寫入或讀取的共享數(shù)據(jù)可被緩存,則在區(qū)塊鏈節(jié)點的緩存空間中緩存所寫入或所讀取的共享數(shù)據(jù)。
需要說明的是,緩存空間是負(fù)載共享數(shù)據(jù)和節(jié)點獨立數(shù)據(jù)的落盤存儲。在緩存空間中,包括物理數(shù)據(jù)服務(wù)器、存儲設(shè)備、操作裝置和數(shù)據(jù)庫軟件等組件,緩存空間支持key-value格式的存儲。
需要說明的是,節(jié)點獨立數(shù)據(jù)的緩存過程與共享數(shù)據(jù)的緩存過程相似,在此不再贅述。
本實施例通過采用跨進(jìn)程訪問技術(shù)定義區(qū)塊鏈節(jié)點的數(shù)據(jù)訪問接口,提高了區(qū)塊鏈節(jié)點數(shù)據(jù)的讀寫性能。
進(jìn)一步地,提出本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置第三實施例。
所述區(qū)塊鏈數(shù)據(jù)訪問裝置第三實施例與所述區(qū)塊鏈數(shù)據(jù)訪問裝置第二實施例的區(qū)別在于,參照圖5,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
第一判斷模塊60,用于判斷所述區(qū)塊鏈節(jié)點是否已緩存待寫入共享數(shù)據(jù);
所述執(zhí)行模塊50還用于若所述區(qū)塊鏈節(jié)點未緩存所述待寫入共享數(shù)據(jù),或所述區(qū)塊鏈節(jié)點中已緩存所述待寫入共享數(shù)據(jù),但所述待寫入共享數(shù)據(jù)對應(yīng)的值需要更新,則通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的寫入操作。
將共享數(shù)據(jù)寫入?yún)^(qū)塊鏈節(jié)點對應(yīng)的數(shù)據(jù)存儲空間的具體過程為:判斷區(qū)塊鏈節(jié)點的緩存空間是否緩存有待寫入共享數(shù)據(jù)。若區(qū)塊鏈節(jié)點的緩存空間未緩存待寫入共享數(shù)據(jù),則通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的寫入操作,將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中;若區(qū)塊鏈節(jié)點的緩存空間已緩存待寫入共享數(shù)據(jù),則判斷緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值是否需要更新。若緩存空間中已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值需要更新,則通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的寫入操作,將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中;若緩存空間中已緩存的待寫入節(jié)點共享戶數(shù)對應(yīng)的值不需要更新,則不執(zhí)行共享數(shù)據(jù)的寫入操作,即不將待寫入共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中。
可以理解的是,可通過判斷緩存空間所緩存的待寫入共享數(shù)據(jù)對應(yīng)的值與需要寫入的待寫入共享數(shù)據(jù)對應(yīng)的值是否一致,來確定緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值是否需要更新。當(dāng)緩存空間所緩存的待寫入共享數(shù)據(jù)對應(yīng)的值與需要寫入的待寫入共享數(shù)據(jù)對應(yīng)的值一致時,緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值不需要更新;當(dāng)緩存空間所緩存的待寫入共享數(shù)據(jù)對應(yīng)的值與需要寫入的待寫入共享數(shù)據(jù)對應(yīng)的值不一致時,緩存空間已緩存的待寫入共享數(shù)據(jù)對應(yīng)的值需要更新。
進(jìn)一步地,通過數(shù)據(jù)訪問接口分離數(shù)據(jù)存儲空間和緩存空間,即通過數(shù)據(jù)訪問接口實現(xiàn)區(qū)塊鏈節(jié)點和數(shù)據(jù)存儲空間的分離部署。
進(jìn)一步地,在將節(jié)點獨立數(shù)據(jù)中的節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間過程中,需要將節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間中的節(jié)點獨立數(shù)據(jù)存儲區(qū)域。在通過數(shù)據(jù)訪問接口將節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間過程中,可在數(shù)據(jù)訪問接口中,在節(jié)點屬性數(shù)據(jù)中添加區(qū)塊鏈節(jié)點標(biāo)識,以保證該節(jié)點屬性數(shù)據(jù)在數(shù)據(jù)存儲空間的節(jié)點獨立數(shù)據(jù)存儲區(qū)域中不會被其它區(qū)塊鏈節(jié)點的節(jié)點屬性數(shù)據(jù)覆蓋。在本發(fā)明實施例中,區(qū)塊鏈節(jié)點標(biāo)識是區(qū)塊鏈節(jié)點的私鑰。區(qū)塊鏈節(jié)點標(biāo)識用于區(qū)分不同區(qū)塊鏈節(jié)點的節(jié)點屬性數(shù)據(jù),數(shù)據(jù)標(biāo)識用于標(biāo)識不同的區(qū)塊鏈節(jié)點數(shù)據(jù),即用于標(biāo)識共享數(shù)據(jù)和節(jié)點獨立數(shù)據(jù)。通過數(shù)據(jù)標(biāo)識可以找到對應(yīng)的共享數(shù)據(jù)或節(jié)點獨立數(shù)據(jù)。
需要說明的是,節(jié)點屬性數(shù)據(jù)包括但不限于區(qū)塊鏈節(jié)點的名稱、區(qū)塊鏈節(jié)點的配置信息、區(qū)塊鏈節(jié)點的運行狀態(tài)信息和統(tǒng)計信息。節(jié)點屬性數(shù)據(jù)的寫入操作是由節(jié)點屬性數(shù)據(jù)所在的區(qū)塊鏈節(jié)點觸發(fā)的,其它區(qū)塊鏈節(jié)點不能觸發(fā)不屬于它自己的節(jié)點屬性數(shù)據(jù)的寫入操作,因此,在將節(jié)點屬性數(shù)據(jù)寫入數(shù)據(jù)存儲空間后,可將該節(jié)點屬性數(shù)據(jù)緩存至對應(yīng)的緩存空間中。
在將區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間的過程中,區(qū)塊數(shù)據(jù)的標(biāo)識key是區(qū)塊數(shù)據(jù)的hash值,區(qū)塊數(shù)據(jù)的hash值是區(qū)塊數(shù)據(jù)值的體現(xiàn)。在將區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間的過程中,可通過區(qū)塊數(shù)據(jù)的hash值來判斷數(shù)據(jù)存儲空間是否已存在該區(qū)塊數(shù)據(jù)。可以理解的是,當(dāng)數(shù)據(jù)存儲空間中已存在與該區(qū)塊數(shù)據(jù)對應(yīng)的hash值,則確認(rèn)數(shù)據(jù)存儲空間中已存在該區(qū)塊數(shù)據(jù),且在該區(qū)塊數(shù)據(jù)對應(yīng)的值不需要更新時,不執(zhí)行區(qū)塊數(shù)據(jù)的寫入操作。當(dāng)數(shù)據(jù)存儲空間中未存在與該區(qū)塊數(shù)據(jù)對應(yīng)的hash值,則確認(rèn)數(shù)據(jù)存儲空間中未存在該區(qū)塊數(shù)據(jù)。當(dāng)數(shù)據(jù)存儲空間中未存在該區(qū)塊數(shù)據(jù),或數(shù)據(jù)存儲空間中的該區(qū)塊數(shù)據(jù)對應(yīng)的值需要更新時,執(zhí)行區(qū)塊數(shù)據(jù)的寫入操作,將該區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間中。由于將區(qū)塊數(shù)據(jù)寫入數(shù)據(jù)存儲空間后,就不會再改變,因此可將寫入數(shù)據(jù)儲存空間的區(qū)塊數(shù)據(jù)緩存至緩存空間中。
在區(qū)塊鏈節(jié)點部署智能合約后,需要將智能合約的字節(jié)碼寫入數(shù)據(jù)存儲空間??梢岳斫獾氖?,智能合約的字節(jié)碼屬于智能合約代碼。在將智能合約的字節(jié)碼寫入數(shù)據(jù)存儲空間過程中,字節(jié)碼的標(biāo)識key是智能合約數(shù)據(jù)的hash值,可以根據(jù)智能合約數(shù)據(jù)的hash值判斷該字節(jié)碼是否已存在數(shù)據(jù)存儲空間中。具體地,當(dāng)數(shù)據(jù)存儲空間中已存在該字節(jié)碼對應(yīng)的hash值時,確認(rèn)數(shù)據(jù)存儲空間中已存在該字節(jié)碼,且當(dāng)該字節(jié)碼對應(yīng)的值不需要更新時,不執(zhí)行字節(jié)碼的寫入操作;當(dāng)數(shù)據(jù)存儲空間中未存在該字節(jié)碼對應(yīng)的hash值,或數(shù)據(jù)存儲空間中存在該字節(jié)碼對應(yīng)的hash值,但該字節(jié)碼對應(yīng)的值需要更新時,執(zhí)行字節(jié)碼的寫入操作,將該字節(jié)碼寫入數(shù)據(jù)存儲空間中。
需要說明的是,在智能合約的字節(jié)碼生成之后,該字節(jié)碼就不會再改變。因此,在將字節(jié)碼寫入數(shù)據(jù)存儲空間后,可將字節(jié)碼緩存至緩存空間。
當(dāng)運行智能合約后,需要將智能合約狀態(tài)數(shù)據(jù)寫入數(shù)據(jù)存儲空間。智能合約狀態(tài)數(shù)據(jù)在智能合約運行過程中,可能會頻繁改變,每個智能合約狀態(tài)數(shù)據(jù)都對應(yīng)著唯一的標(biāo)識key。需要說明的是,智能合約狀態(tài)數(shù)據(jù)的操作類型比較復(fù)雜,不恰當(dāng)?shù)木彺娌呗钥赡軙?dǎo)致錯誤的運算結(jié)果。因此,可根據(jù)區(qū)塊鏈節(jié)點對應(yīng)的業(yè)務(wù)規(guī)則確定某個智能合約或者某個智能合約狀態(tài)數(shù)據(jù)可以被緩存。
索引數(shù)據(jù)中存儲的是區(qū)塊鏈節(jié)點的區(qū)塊高度和區(qū)塊hash,以及交易和交易所在區(qū)塊鏈節(jié)點的對應(yīng)關(guān)系。索引數(shù)據(jù)是由區(qū)塊鏈節(jié)點在新區(qū)塊生成時產(chǎn)生,索引數(shù)據(jù)生成之后就不會改變,因此,可通過索引數(shù)據(jù)的標(biāo)識key來判斷索引數(shù)據(jù)是否存在數(shù)據(jù)存儲空間中。
本實施例通過將區(qū)塊鏈節(jié)點對應(yīng)的共享數(shù)據(jù)寫入數(shù)據(jù)存儲空間中,提高了區(qū)塊鏈節(jié)點數(shù)據(jù)的寫性能。
進(jìn)一步地,提出本發(fā)明區(qū)塊鏈數(shù)據(jù)訪問裝置第四實施例。
所述區(qū)塊鏈數(shù)據(jù)訪問裝置第四實施例與所述區(qū)塊鏈數(shù)據(jù)訪問裝置第二實施例的區(qū)別在于,參照圖6,所述區(qū)塊鏈數(shù)據(jù)訪問裝置還包括:
第二判斷模塊70,還用于判斷所述區(qū)塊鏈節(jié)點中是否緩存有待讀取共享數(shù)據(jù);
所述執(zhí)行模塊50還用于若所述區(qū)塊鏈節(jié)點中未緩存所述待讀取共享數(shù)據(jù),則通過所述數(shù)據(jù)訪問接口在所述數(shù)據(jù)存儲空間中執(zhí)行所述共享數(shù)據(jù)的讀取操作。
在數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)之前,先在緩存空間中進(jìn)行檢索,根據(jù)檢索所得的檢索結(jié)果判斷區(qū)塊鏈節(jié)點中是否已緩存有待讀取共享數(shù)據(jù)。若區(qū)塊鏈節(jié)點的緩存空間中已緩存待讀取共享數(shù)據(jù),則不執(zhí)行通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的讀取操作,即不在數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù);若區(qū)塊鏈節(jié)點的緩存空間中未緩存待讀取共享數(shù)據(jù),則執(zhí)行通過數(shù)據(jù)訪問接口在數(shù)據(jù)存儲空間中執(zhí)行共享數(shù)據(jù)的讀取操作,在數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)。可以理解的是,在數(shù)據(jù)存儲空間中讀取待讀取共享數(shù)據(jù)的過程中,通過待讀取數(shù)據(jù)的標(biāo)識key讀取待讀取共享數(shù)據(jù)。
需要說明的是,節(jié)點獨立數(shù)據(jù)的讀取操作和共享數(shù)據(jù)的讀取操作過程相似,在此不再贅述。
進(jìn)一步地,當(dāng)在數(shù)據(jù)存儲空間中讀取到待讀取共享數(shù)據(jù)后,若根據(jù)緩存策略確定所讀取的待讀取共享數(shù)據(jù)可被緩存,則將所讀取的待讀取共享數(shù)據(jù)緩存至緩存空間中。
當(dāng)在數(shù)據(jù)存儲空間讀取區(qū)塊數(shù)據(jù)過程中,可使用區(qū)塊高度讀取區(qū)塊數(shù)據(jù)。在使用區(qū)塊高度讀取區(qū)塊數(shù)據(jù)過程中,將區(qū)塊hash作為標(biāo)識key讀取區(qū)塊數(shù)據(jù)。在使用交易hash在數(shù)據(jù)存儲空間中查詢交易數(shù)據(jù)時,先查詢交易的索引信息,通過交易索引信息查找到區(qū)塊hash和交易在區(qū)塊里的位置,把交易所在的區(qū)塊先讀取出來,再在區(qū)塊的交易列表里讀取交易數(shù)據(jù)。在讀取智能合約的字節(jié)碼過程中,根據(jù)智能合約的hash值作為標(biāo)識key在數(shù)據(jù)存儲空間中讀取字節(jié)碼。在讀取智能合約狀態(tài)數(shù)據(jù)過程中,根據(jù)智能合約狀態(tài)數(shù)據(jù)的標(biāo)識key在數(shù)據(jù)存儲空間中讀取智能合約狀態(tài)數(shù)據(jù)。
本實施例通過在數(shù)據(jù)存儲空間讀取數(shù)據(jù)中,提高了區(qū)塊鏈節(jié)點數(shù)據(jù)的°性能。
需要說明的是,在本文中,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者裝置不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括該要素的過程、方法、物品或者裝置中還存在另外的相同要素。
上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到上述實施例方法可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當(dāng)然也可以通過硬件,但很多情況下前者是更佳的實施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機(jī)軟件產(chǎn)品存儲在一個存儲介質(zhì)(如rom/ram、磁碟、光盤)中,包括若干指令用以使得一臺終端設(shè)備(可以是手機(jī),計算機(jī),服務(wù)器,空調(diào)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述的方法。
以上僅為本發(fā)明的優(yōu)選實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。