區(qū)塊鏈是分布式的、去中心化存儲的一種鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)。它是一個(gè)分布式的帳本,所有的記錄由多個(gè)節(jié)點(diǎn)共同完成,每個(gè)節(jié)點(diǎn)都有完整的帳本。區(qū)塊鏈本身具有的最顯著的特征是:分布式、去中心化、信息不可篡改。
數(shù)據(jù)庫是按照一定數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的建立在計(jì)算機(jī)存儲設(shè)備上的倉庫。數(shù)據(jù)庫的特性有:減少數(shù)據(jù)的冗余度、數(shù)據(jù)的獨(dú)立性、數(shù)據(jù)實(shí)現(xiàn)集中控制。
區(qū)塊鏈從本質(zhì)上來講也是一個(gè)數(shù)據(jù)庫,是一個(gè)去中心化的數(shù)據(jù)庫。但是對數(shù)據(jù)的查找速度、數(shù)據(jù)格式化處理方面有天生的不足。
本文將結(jié)合區(qū)塊鏈與傳統(tǒng)數(shù)據(jù)庫,設(shè)計(jì)一種全新的基于區(qū)塊鏈技術(shù)的數(shù)據(jù)庫應(yīng)用平臺,該技術(shù)不僅具有區(qū)塊鏈的分布式、去中心化、可審計(jì)的特性,同時(shí)兼?zhèn)鋫鹘y(tǒng)數(shù)據(jù)庫的快速查詢、數(shù)據(jù)結(jié)構(gòu)優(yōu)美的特性。兩者的結(jié)合使得數(shù)據(jù)庫的恢復(fù)變得快速、數(shù)據(jù)可靠性得到質(zhì)的飛躍。
設(shè)計(jì)原理
區(qū)塊鏈上所存儲的數(shù)據(jù),我們統(tǒng)一稱為交易。
在本設(shè)計(jì)中,把對數(shù)據(jù)庫操作的每一條指令都記錄到一條交易中,即一個(gè)交易對應(yīng)一個(gè)數(shù)據(jù)庫操作,區(qū)塊鏈網(wǎng)絡(luò)會以交易的形式記錄下所有對數(shù)據(jù)庫的操作。
對于配置了數(shù)據(jù)庫的區(qū)塊鏈節(jié)點(diǎn),在區(qū)塊鏈網(wǎng)絡(luò)記錄交易的同時(shí)會完成對數(shù)據(jù)庫的操作。對于未配置數(shù)據(jù)庫的網(wǎng)絡(luò)結(jié)點(diǎn),交易只會記錄到本節(jié)點(diǎn)的區(qū)塊中。
已經(jīng)配置數(shù)據(jù)庫的節(jié)點(diǎn),可以通過配置從區(qū)塊鏈網(wǎng)絡(luò)上的第一個(gè)區(qū)塊開始搜索,去獲取數(shù)據(jù)庫表對應(yīng)的交易,根據(jù)這些交易去再次執(zhí)行數(shù)據(jù)庫操作,從而生成對應(yīng)的表,獲得與其它區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)一致的數(shù)據(jù)庫表內(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)證通過需要大約10分鐘的時(shí)間,真正得到安全地確認(rèn)需要大約一個(gè)小時(shí)。
2. 區(qū)塊的生成需要礦工來完成,這個(gè)過程要經(jīng)過大量的計(jì)算,對資源浪費(fèi)比較嚴(yán)重。作為改進(jìn),Ripple的出現(xiàn)解決了BitCoin網(wǎng)絡(luò)存在的不足,Ripple網(wǎng)絡(luò)通過自己獨(dú)有的UNL方案的引入,使得Ripple網(wǎng)絡(luò)的節(jié)點(diǎn)能有效地驗(yàn)證自己收到消息的真?zhèn)?,不需要?jīng)過大量的計(jì)算即可生成區(qū)塊,其每一條交易從發(fā)出去驗(yàn)證只需要3-8秒。
基于Ripple與BitCoin的對比,我們選擇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ù)庫:在需要生成數(shù)據(jù)庫表的節(jié)點(diǎn)對數(shù)據(jù)庫進(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ù)庫操作的交易了,不需要配置任何的數(shù)據(jù)庫,如圖1中C1。
客戶需要查看網(wǎng)絡(luò)上的數(shù)據(jù)庫表或者想真實(shí)看到傳統(tǒng)意義上的數(shù)據(jù)庫表時(shí),需要在本地創(chuàng)建一個(gè)區(qū)塊鏈節(jié)點(diǎn)NC2,連入網(wǎng)絡(luò),同時(shí)在NC2配置數(shù)據(jù)庫DB,這時(shí)發(fā)往區(qū)塊鏈上的數(shù)據(jù)庫操作就會實(shí)時(shí)地在DB中反應(yīng)出來,如圖1中C2。
客戶不想對表進(jìn)行操作,僅想查看其它客戶創(chuàng)建的表時(shí),需要在本地創(chuàng)建一個(gè)區(qū)塊鏈節(jié)點(diǎn)NC1,同時(shí)在NC1配置數(shù)據(jù)庫,在配置文件中設(shè)置需要同步的數(shù)據(jù)庫表名與所屬用戶,即可得到對應(yīng)的數(shù)據(jù)庫表。
· 具體設(shè)計(jì)
在區(qū)塊鏈的應(yīng)用層提供API接口供用戶調(diào)用,用戶向區(qū)塊鏈發(fā)出交易命令就像操作數(shù)據(jù)庫一樣。
2. 先入庫再共識:
基于區(qū)塊鏈的應(yīng)用有個(gè)基本的做法就是交易要先經(jīng)過區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行共識,然后交易才能知道是否有效。我們在處理時(shí):在一定條件下,先由本地節(jié)點(diǎn)驗(yàn)證交易,然后寫入數(shù)據(jù)庫,數(shù)據(jù)庫寫入成功后,再發(fā)到區(qū)塊鏈網(wǎng)絡(luò)上進(jìn)行共識。如果共識不能通過,則回滾數(shù)據(jù)庫操作。這樣的設(shè)計(jì)以便于用戶快速地得知自己SQL語句執(zhí)行的結(jié)果。
如果節(jié)點(diǎn)已經(jīng)配置了數(shù)據(jù)庫及對應(yīng)的表。區(qū)塊鏈網(wǎng)絡(luò)在接收到數(shù)據(jù)庫操作交易的數(shù)據(jù)時(shí),會直接傳導(dǎo)到對應(yīng)的數(shù)據(jù)庫進(jìn)行數(shù)據(jù)庫操作,這樣就實(shí)時(shí)反應(yīng)用戶對數(shù)據(jù)庫的操作。
3. 根據(jù)配置進(jìn)行數(shù)據(jù)庫表的恢復(fù)
在某一區(qū)塊鏈節(jié)點(diǎn)配置數(shù)據(jù)庫,把存放在區(qū)塊鏈網(wǎng)絡(luò)中的數(shù)據(jù)庫交易取出,按這些操作去執(zhí)行數(shù)據(jù)庫,達(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í)候,如果有對應(yīng)表的數(shù)據(jù)庫,則直接從本地獲取數(shù)據(jù)庫操作交易數(shù)據(jù);如果本地是部分記錄節(jié)點(diǎn)時(shí),本地缺少某個(gè)區(qū)間的區(qū)塊,這時(shí)只要從其它節(jié)點(diǎn)去獲取對應(yīng)范圍內(nèi)的數(shù)據(jù)庫操作交易數(shù)據(jù)即可。
· 設(shè)計(jì)要點(diǎn)
安全性設(shè)計(jì):以用戶為管理單元,即一張表默認(rèn)只隸屬于一個(gè)用戶(表的創(chuàng)建者),其它用戶想對本張表進(jìn)行操作,得讓表的所有者對其授權(quán)。
數(shù)據(jù)庫的操作與數(shù)據(jù)庫表的分離:操作以交易的形式記錄在區(qū)塊鏈網(wǎng)絡(luò)中,而真實(shí)數(shù)據(jù)在數(shù)據(jù)庫中查看。
特性與應(yīng)用場景
· 歷史記錄不可更改
傳統(tǒng)的數(shù)據(jù)庫中,對于記錄的更改及刪除可由管理員或者黑客隨意操作。在 ChainSQL 中,由于在區(qū)塊鏈網(wǎng)絡(luò)上記錄了對數(shù)據(jù)庫某張表的所有操作記錄,則單獨(dú)對數(shù)據(jù)庫進(jìn)行更改不會改變區(qū)塊鏈網(wǎng)絡(luò)上的記錄。區(qū)塊鏈網(wǎng)絡(luò)交易的不可更改性決定了 ChainSQL數(shù)據(jù)的不可篡改。
· 數(shù)據(jù)可在任意時(shí)間恢復(fù)到任意地點(diǎn)
只要啟動一個(gè)區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn),與區(qū)塊鏈網(wǎng)絡(luò)連接,配置好對應(yīng)的數(shù)據(jù)庫,即可恢復(fù)區(qū)塊鏈網(wǎng)絡(luò)中存在的任意一張表。
· 數(shù)據(jù)的插件式管理
本 地 可 以 配 置 任 意 常 用 的 數(shù) 據(jù) 庫,包 括:MySQL,SQLite, Oracle 等。
· 簡單編程模式
通過簡單的 API 或者 JSON,可以在網(wǎng)頁或者APP 上對數(shù)據(jù)庫進(jìn)行寫入及讀取。
· 滿足審計(jì)要求
對數(shù)據(jù)庫表的操作記錄全部記錄在了區(qū)塊鏈網(wǎng)絡(luò)中,區(qū)塊鏈對交易存儲的特性使得我們可以知道交易發(fā)生的時(shí)間、具體內(nèi)容。審計(jì)人員只需要從可靠的區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn)中去恢復(fù)一張數(shù)據(jù)庫表即可完成對數(shù)據(jù)的審計(jì)。
· 快速區(qū)塊鏈應(yīng)用的開發(fā)
任何想用真實(shí)數(shù)據(jù)庫來存儲數(shù)據(jù)的應(yīng)用,同時(shí)想兼顧區(qū)塊鏈特性的應(yīng)用,都可以應(yīng)用 ChainSQL,通過調(diào)用 ChainSQL 提供的接口來快速完成。
總結(jié)
ChainSQL 將區(qū)塊鏈與傳統(tǒng)數(shù)據(jù)庫相結(jié)合,構(gòu)建了一種基于區(qū)塊鏈網(wǎng)絡(luò)的日志式數(shù)據(jù)庫應(yīng)用平臺。該技術(shù)兼?zhèn)淞藘煞N系統(tǒng)的優(yōu)點(diǎn),能隨時(shí)隨地恢復(fù)數(shù)據(jù)庫表。ChainSQL 不僅將傳統(tǒng)數(shù)據(jù)庫的特性進(jìn)行了增加,同時(shí)將基于區(qū)塊鏈的應(yīng)用開發(fā)變得簡易。
ChainSQL 中采用的先入庫再共識的做法大大增加了數(shù)據(jù)入庫的速度,增強(qiáng)了用戶體驗(yàn)。可以隨時(shí)隨地對數(shù)據(jù)庫表的恢復(fù)功能使得審計(jì)變得更加的方便。是進(jìn)行基于數(shù)據(jù)庫進(jìn)行安全開發(fā)的良好平臺。
評論