區(qū)塊鏈是分布式的、去中心化存儲(chǔ)的一種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)。它是一個(gè)分布式的帳本,所有的記錄由多個(gè)節(jié)點(diǎn)共同完成,每個(gè)節(jié)點(diǎn)都有完整的帳本。區(qū)塊鏈本身具有的最顯著的特征是:分布式、去中心化、信息不可篡改。
數(shù)據(jù)庫(kù)是按照一定數(shù)據(jù)結(jié)構(gòu)來(lái)組織、存儲(chǔ)和管理數(shù)據(jù)的建立在計(jì)算機(jī)存儲(chǔ)設(shè)備上的倉(cāng)庫(kù)。數(shù)據(jù)庫(kù)的特性有:減少數(shù)據(jù)的冗余度、數(shù)據(jù)的獨(dú)立性、數(shù)據(jù)實(shí)現(xiàn)集中控制。
區(qū)塊鏈從本質(zhì)上來(lái)講也是一個(gè)數(shù)據(jù)庫(kù),是一個(gè)去中心化的數(shù)據(jù)庫(kù)。但是對(duì)數(shù)據(jù)的查找速度、數(shù)據(jù)格式化處理方面有天生的不足。
本文將結(jié)合區(qū)塊鏈與傳統(tǒng)數(shù)據(jù)庫(kù),設(shè)計(jì)一種全新的基于區(qū)塊鏈技術(shù)的數(shù)據(jù)庫(kù)應(yīng)用平臺(tái),該技術(shù)不僅具有區(qū)塊鏈的分布式、去中心化、可審計(jì)的特性,同時(shí)兼?zhèn)鋫鹘y(tǒng)數(shù)據(jù)庫(kù)的快速查詢、數(shù)據(jù)結(jié)構(gòu)優(yōu)美的特性。兩者的結(jié)合使得數(shù)據(jù)庫(kù)的恢復(fù)變得快速、數(shù)據(jù)可靠性得到質(zhì)的飛躍。
設(shè)計(jì)原理
區(qū)塊鏈上所存儲(chǔ)的數(shù)據(jù),我們統(tǒng)一稱為交易。
在本設(shè)計(jì)中,把對(duì)數(shù)據(jù)庫(kù)操作的每一條指令都記錄到一條交易中,即一個(gè)交易對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)操作,區(qū)塊鏈網(wǎng)絡(luò)會(huì)以交易的形式記錄下所有對(duì)數(shù)據(jù)庫(kù)的操作。
對(duì)于配置了數(shù)據(jù)庫(kù)的區(qū)塊鏈節(jié)點(diǎn),在區(qū)塊鏈網(wǎng)絡(luò)記錄交易的同時(shí)會(huì)完成對(duì)數(shù)據(jù)庫(kù)的操作。對(duì)于未配置數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)結(jié)點(diǎn),交易只會(huì)記錄到本節(jié)點(diǎn)的區(qū)塊中。
已經(jīng)配置數(shù)據(jù)庫(kù)的節(jié)點(diǎn),可以通過(guò)配置從區(qū)塊鏈網(wǎng)絡(luò)上的第一個(gè)區(qū)塊開始搜索,去獲取數(shù)據(jù)庫(kù)表對(duì)應(yīng)的交易,根據(jù)這些交易去再次執(zhí)行數(shù)據(jù)庫(kù)操作,從而生成對(duì)應(yīng)的表,獲得與其它區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)一致的數(shù)據(jù)庫(kù)表內(nèi)容。
設(shè)計(jì)方案
· 區(qū)塊鏈網(wǎng)絡(luò)的選擇:
最常見的區(qū)塊鏈網(wǎng)絡(luò)就是BitCoin網(wǎng)絡(luò),但是BitCoin網(wǎng)絡(luò)在實(shí)際應(yīng)用中有兩個(gè)缺點(diǎn):
1. 速度慢:一筆交易被全網(wǎng)驗(yàn)證通過(guò)需要大約10分鐘的時(shí)間,真正得到安全地確認(rèn)需要大約一個(gè)小時(shí)。
2. 區(qū)塊的生成需要礦工來(lái)完成,這個(gè)過(guò)程要經(jīng)過(guò)大量的計(jì)算,對(duì)資源浪費(fèi)比較嚴(yán)重。作為改進(jìn),Ripple的出現(xiàn)解決了BitCoin網(wǎng)絡(luò)存在的不足,Ripple網(wǎng)絡(luò)通過(guò)自己獨(dú)有的UNL方案的引入,使得Ripple網(wǎng)絡(luò)的節(jié)點(diǎn)能有效地驗(yàn)證自己收到消息的真?zhèn)?,不需要?jīng)過(guò)大量的計(jì)算即可生成區(qū)塊,其每一條交易從發(fā)出去驗(yàn)證只需要3-8秒。
基于Ripple與BitCoin的對(duì)比,我們選擇Ripple作為本系統(tǒng)的區(qū)塊鏈網(wǎng)絡(luò)。
· 整體結(jié)構(gòu)及流程
ChainSQL的實(shí)現(xiàn)主要分成三個(gè)部分:
區(qū)塊鏈網(wǎng)絡(luò):各個(gè)節(jié)點(diǎn)N構(gòu)成Ripple網(wǎng)絡(luò),完成區(qū)塊鏈網(wǎng)絡(luò)的架設(shè)。
普通數(shù)據(jù)庫(kù):在需要生成數(shù)據(jù)庫(kù)表的節(jié)點(diǎn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行配置。
客戶端:可選擇自己創(chuàng)建一個(gè)區(qū)塊鏈節(jié)點(diǎn)接入網(wǎng)絡(luò),然后向這個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù),如圖1中C2。也可以直接向網(wǎng)絡(luò)發(fā)送交易,如圖1中C1。
我們先架設(shè)區(qū)塊鏈網(wǎng)絡(luò),這時(shí)已經(jīng)可以向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)庫(kù)操作的交易了,不需要配置任何的數(shù)據(jù)庫(kù),如圖1中C1。
客戶需要查看網(wǎng)絡(luò)上的數(shù)據(jù)庫(kù)表或者想真實(shí)看到傳統(tǒng)意義上的數(shù)據(jù)庫(kù)表時(shí),需要在本地創(chuàng)建一個(gè)區(qū)塊鏈節(jié)點(diǎn)NC2,連入網(wǎng)絡(luò),同時(shí)在NC2配置數(shù)據(jù)庫(kù)DB,這時(shí)發(fā)往區(qū)塊鏈上的數(shù)據(jù)庫(kù)操作就會(huì)實(shí)時(shí)地在DB中反應(yīng)出來(lái),如圖1中C2。
客戶不想對(duì)表進(jìn)行操作,僅想查看其它客戶創(chuàng)建的表時(shí),需要在本地創(chuàng)建一個(gè)區(qū)塊鏈節(jié)點(diǎn)NC1,同時(shí)在NC1配置數(shù)據(jù)庫(kù),在配置文件中設(shè)置需要同步的數(shù)據(jù)庫(kù)表名與所屬用戶,即可得到對(duì)應(yīng)的數(shù)據(jù)庫(kù)表。

· 具體設(shè)計(jì)
在區(qū)塊鏈的應(yīng)用層提供API接口供用戶調(diào)用,用戶向區(qū)塊鏈發(fā)出交易命令就像操作數(shù)據(jù)庫(kù)一樣。
2. 先入庫(kù)再共識(shí):
基于區(qū)塊鏈的應(yīng)用有個(gè)基本的做法就是交易要先經(jīng)過(guò)區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行共識(shí),然后交易才能知道是否有效。我們?cè)谔幚頃r(shí):在一定條件下,先由本地節(jié)點(diǎn)驗(yàn)證交易,然后寫入數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)寫入成功后,再發(fā)到區(qū)塊鏈網(wǎng)絡(luò)上進(jìn)行共識(shí)。如果共識(shí)不能通過(guò),則回滾數(shù)據(jù)庫(kù)操作。這樣的設(shè)計(jì)以便于用戶快速地得知自己SQL語(yǔ)句執(zhí)行的結(jié)果。
如果節(jié)點(diǎn)已經(jīng)配置了數(shù)據(jù)庫(kù)及對(duì)應(yīng)的表。區(qū)塊鏈網(wǎng)絡(luò)在接收到數(shù)據(jù)庫(kù)操作交易的數(shù)據(jù)時(shí),會(huì)直接傳導(dǎo)到對(duì)應(yīng)的數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)庫(kù)操作,這樣就實(shí)時(shí)反應(yīng)用戶對(duì)數(shù)據(jù)庫(kù)的操作。

3. 根據(jù)配置進(jìn)行數(shù)據(jù)庫(kù)表的恢復(fù)
在某一區(qū)塊鏈節(jié)點(diǎn)配置數(shù)據(jù)庫(kù),把存放在區(qū)塊鏈網(wǎng)絡(luò)中的數(shù)據(jù)庫(kù)交易取出,按這些操作去執(zhí)行數(shù)據(jù)庫(kù),達(dá)到重建一張表的目的。
區(qū)塊鏈網(wǎng)絡(luò)上的某一個(gè)節(jié)點(diǎn),可以是全記錄節(jié)點(diǎn)(擁有區(qū)塊鏈網(wǎng)絡(luò)中的所有交易數(shù)據(jù)),也可以是部分記錄節(jié)點(diǎn)。
本地節(jié)點(diǎn)獲取數(shù)據(jù)的時(shí)候,如果有對(duì)應(yīng)表的數(shù)據(jù)庫(kù),則直接從本地獲取數(shù)據(jù)庫(kù)操作交易數(shù)據(jù);如果本地是部分記錄節(jié)點(diǎn)時(shí),本地缺少某個(gè)區(qū)間的區(qū)塊,這時(shí)只要從其它節(jié)點(diǎn)去獲取對(duì)應(yīng)范圍內(nèi)的數(shù)據(jù)庫(kù)操作交易數(shù)據(jù)即可。
· 設(shè)計(jì)要點(diǎn)
安全性設(shè)計(jì):以用戶為管理單元,即一張表默認(rèn)只隸屬于一個(gè)用戶(表的創(chuàng)建者),其它用戶想對(duì)本張表進(jìn)行操作,得讓表的所有者對(duì)其授權(quán)。
數(shù)據(jù)庫(kù)的操作與數(shù)據(jù)庫(kù)表的分離:操作以交易的形式記錄在區(qū)塊鏈網(wǎng)絡(luò)中,而真實(shí)數(shù)據(jù)在數(shù)據(jù)庫(kù)中查看。
特性與應(yīng)用場(chǎng)景
· 歷史記錄不可更改
傳統(tǒng)的數(shù)據(jù)庫(kù)中,對(duì)于記錄的更改及刪除可由管理員或者黑客隨意操作。在 ChainSQL 中,由于在區(qū)塊鏈網(wǎng)絡(luò)上記錄了對(duì)數(shù)據(jù)庫(kù)某張表的所有操作記錄,則單獨(dú)對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改不會(huì)改變區(qū)塊鏈網(wǎng)絡(luò)上的記錄。區(qū)塊鏈網(wǎng)絡(luò)交易的不可更改性決定了 ChainSQL數(shù)據(jù)的不可篡改。
· 數(shù)據(jù)可在任意時(shí)間恢復(fù)到任意地點(diǎn)
只要啟動(dòng)一個(gè)區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn),與區(qū)塊鏈網(wǎng)絡(luò)連接,配置好對(duì)應(yīng)的數(shù)據(jù)庫(kù),即可恢復(fù)區(qū)塊鏈網(wǎng)絡(luò)中存在的任意一張表。
· 數(shù)據(jù)的插件式管理
本 地 可 以 配 置 任 意 常 用 的 數(shù) 據(jù) 庫(kù),包 括:MySQL,SQLite, Oracle 等。
· 簡(jiǎn)單編程模式
通過(guò)簡(jiǎn)單的 API 或者 JSON,可以在網(wǎng)頁(yè)或者APP 上對(duì)數(shù)據(jù)庫(kù)進(jìn)行寫入及讀取。
· 滿足審計(jì)要求
對(duì)數(shù)據(jù)庫(kù)表的操作記錄全部記錄在了區(qū)塊鏈網(wǎng)絡(luò)中,區(qū)塊鏈對(duì)交易存儲(chǔ)的特性使得我們可以知道交易發(fā)生的時(shí)間、具體內(nèi)容。審計(jì)人員只需要從可靠的區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)中去恢復(fù)一張數(shù)據(jù)庫(kù)表即可完成對(duì)數(shù)據(jù)的審計(jì)。
· 快速區(qū)塊鏈應(yīng)用的開發(fā)
任何想用真實(shí)數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)的應(yīng)用,同時(shí)想兼顧區(qū)塊鏈特性的應(yīng)用,都可以應(yīng)用 ChainSQL,通過(guò)調(diào)用 ChainSQL 提供的接口來(lái)快速完成。
總結(jié)
ChainSQL 將區(qū)塊鏈與傳統(tǒng)數(shù)據(jù)庫(kù)相結(jié)合,構(gòu)建了一種基于區(qū)塊鏈網(wǎng)絡(luò)的日志式數(shù)據(jù)庫(kù)應(yīng)用平臺(tái)。該技術(shù)兼?zhèn)淞藘煞N系統(tǒng)的優(yōu)點(diǎn),能隨時(shí)隨地恢復(fù)數(shù)據(jù)庫(kù)表。ChainSQL 不僅將傳統(tǒng)數(shù)據(jù)庫(kù)的特性進(jìn)行了增加,同時(shí)將基于區(qū)塊鏈的應(yīng)用開發(fā)變得簡(jiǎn)易。
ChainSQL 中采用的先入庫(kù)再共識(shí)的做法大大增加了數(shù)據(jù)入庫(kù)的速度,增強(qiáng)了用戶體驗(yàn)??梢噪S時(shí)隨地對(duì)數(shù)據(jù)庫(kù)表的恢復(fù)功能使得審計(jì)變得更加的方便。是進(jìn)行基于數(shù)據(jù)庫(kù)進(jìn)行安全開發(fā)的良好平臺(tái)。
電子發(fā)燒友App




評(píng)論