我們後續會有一個CQL #
系列文章介紹 CovenantSQL (CQL)的實現原理,這是第一篇
下一篇,我們會詳細介紹一下 『CQL MainChain 的出塊流程』
News
- CQL 的測試網目前版本是
0.5.0
,參見 Quickstart; - MacOS 使用者可以用
brew install cql
直接安裝 CQL 的客戶端[1] ; - CQL 的同學開源了商業產品中使用的『CookieScaner』,能幫助你瞭解你平時訪問的網站,在沒有得到你的允許的情況下都在你的瀏覽器裡記錄了那些 Cookie,以及他們的作用。[2]
分層架構
MainChain & SQLChain
- 第一層: 全域性共識層:
- 整個網路中只有一個主鏈。
- 主要負責資料庫礦工與使用者的合同匹配,交易結算,反作弊,子鏈雜湊鎖定等全域性共識事宜。
- 第二層: SQL 共識層:
- 每個資料庫都有自己獨立的子鏈。
- 主要負責資料庫各種事務的簽名,交付和一致性。這裡主要實現永久可追溯性的資料歷史,並且在主鏈中執行雜湊鎖定。
- 點選這裡檢視向量大圖
主鏈和 SQL 鏈
CQL 採用分層的架構進行資料庫的建立和執行,一個典型的資料的建立過程大致可以如下過程:
- "礦工" 啟動後會自動向主鏈註冊,註冊資訊包括:"最低可以接受的 Gas 價格"、"系統配置資訊"、"對外 IP 及埠" 等;
- "礦工" 通過 ChainBus 訂閱並關注和自己相關的資訊;
- 客戶端執行
cql create '{"node":2}'
[3],向主鏈的任一 "出塊節點"(BP: Block Producer)傳送經過簽名的資料庫建立請求; - 收到請求的 BP 在出塊的過程(詳見:主鏈出塊流程)中進行 "礦工" 和資料庫建立請求的撮合;
- 資料庫建立請求 和 撮合結果 在 其它 BP 節點進行驗證和確認;
- "礦工" 訂閱收到資料庫任務;
- "礦工" 通過 SQLChain 彼此發現、連線,組建 Kayak 資料庫叢集;
- 所有 "礦工" 準備就緒等待請求;
- 使用者可以通過
cql console
命令來連線資料庫,執行 SQL。
共識演算法
CQL 支援兩種共識演算法:
- DPoS (委任權益證明) 應用在資料庫的
最終一致性
和 Block Producer 所在的第一層 (全域性共識層)
,CQL 的礦工在客戶端將所有SQL查詢及其簽名打包成塊,從而形成整個區塊鏈,我們把這個演算法命名為Xenomint
- BFT-Raft (拜占庭容錯演算法) bft-raft[4] 應用於資料庫的
強一致性
。我們把這個實現命名為Kayak
. 礦工 leader 會基於Kayak
做兩階段提交
來支援Transaction
[5]
可以用命令列 cql create '{"UseEventualConsistency": true, "Node": 3}'
來建立 最終一致性
CQL 資料庫。
常見問題解答
- Q: CQL 的資料庫安全是如何做的?
A: 不同於傳統的資料庫,CQL 是執行在開放網際網路上的分散式資料庫系統。安全方面主要做了如下的工作:
- 金鑰體系:CQL 使用 Bitcoin 的
scep256k1
曲線的非對稱加密演算法產生的公私鑰對。 - 網路通訊:參見 網路安全。
- 資料庫許可權 & 加密:
- 資料庫安全閘道器。
- 支援 SQL 加密函式
encrypt
,decrypt
,例如:
INSERT INTO "t1" ("k", "v") VALUES (1, encrypt("data", "pass", "salt"));
SELECT decrypt("v", "pass", "salt") FROM "t1" WHERE "k"=1;複製程式碼
- Q: CQL 資料如果是不可篡改的,如何處理類似 GDPR 裡資料刪除的需求?
A: CQL 支援兩種開發模式,一種是傳統的DB per App
(一個 App 一個資料庫),另外一種是偏向隱私保護的DB per User
(一個使用者一個資料庫)。DB per User
的開發模式非常適用於類似 "密碼管理器","個人資訊管理" 等應用的開發。由於使用者是通過類似比特幣用一個私鑰管理自己財產的方式,通過一個 CQL 私鑰管理自己的個人資料,所以這種模式開發的 App 天然具有不儲存任何使用者資料,從技術上天然符合包括以下法律法規的嚴苛要求:
CQL 的完整資料是存在 SQLChain 的 Miner 上的,這部分資料相關的 SQL 歷史是完整儲存在 Miner 上的。相對於傳統資料庫的CRUD
(Create、Read、Update、Delete),CQL 支援的是CRAP
(Create、Read、Append、Privatize)。
Append vs Update
傳統資料庫對資料進行更改(Update)後是沒有歷史記錄存在的,換句話說資料是可被篡改的。CQL 支援的是對資料進行追加(Append),其結果是資料的歷史記錄是得以保全。
Privatize vs Delete
傳統資料庫對資料進行刪除(Delete)也屬於對資料不可追溯、不可逆的篡改。CQL 支援的是對資料進行私有化(Privatize),也就是把資料庫的許可權轉給一個不可能的公鑰。這樣就可以實現對子鏈資料的實質性刪除。針對單條資料的鏈上所有痕跡抹除目前僅在企業版提供支援。
- Q:CQL 是如何儲存資料庫的資料的?
A: 使用者資料庫的絕大部分操作是在 SQLChain 上完成的。預設情況下,主鏈僅會儲存子鏈的區塊雜湊。更多細節請參考主鏈和 SQL 鏈。
- Q: CQL 支援資料量的上限大致是多少?
A: CQL 的資料庫資料是儲存在一個個獨立的 SQLChain 上的。CQL 的資料庫的數量取決於全網的 "礦工" 數量。單個 CQL 資料庫的上限取決於硬體配置,截止 2019-04-25 線上最大的表是在 AWS c5.2xlarge 標準配置的主機上持續執行的由 2 Miner 組成的一個資料庫,資料行數為 433,211,000,佔用磁碟 3.2 TB。
參考
- ^brew developers.covenantsql.io/docs/zh-CN/…
- ^CookieScaner github.com/CovenantSQL…
- ^Create developers.covenantsql.io/docs/zh-CN/…
- ^BFT-Raft github.com/CovenantSQL…
- ^Transaction github.com/CovenantSQL…