CQL #1:SQLChain 資料庫建立流程

面向工資程式設計發表於2019-04-28

我們後續會有一個CQL #系列文章介紹 CovenantSQL (CQL)的實現原理,這是第一篇

下一篇,我們會詳細介紹一下 『CQL MainChain 的出塊流程』

News

  1. CQL 的測試網目前版本是 0.5.0 ,參見 Quickstart
  2. MacOS 使用者可以用 brew install cql 直接安裝 CQL 的客戶端[1]
  3. CQL 的同學開源了商業產品中使用的『CookieScaner』,能幫助你瞭解你平時訪問的網站,在沒有得到你的允許的情況下都在你的瀏覽器裡記錄了那些 Cookie,以及他們的作用。[2]

分層架構

CQL #1:SQLChain 資料庫建立流程
MainChain & SQLChain
  • 第一層: 全域性共識層:
    • 整個網路中只有一個主鏈。
    • 主要負責資料庫礦工與使用者的合同匹配,交易結算,反作弊,子鏈雜湊鎖定等全域性共識事宜。
  • 第二層: SQL 共識層:
    • 每個資料庫都有自己獨立的子鏈。
    • 主要負責資料庫各種事務的簽名,交付和一致性。這裡主要實現永久可追溯性的資料歷史,並且在主鏈中執行雜湊鎖定。
  • 點選這裡檢視向量大圖

主鏈和 SQL 鏈

CQL 採用分層的架構進行資料庫的建立和執行,一個典型的資料的建立過程大致可以如下過程:

  1. "礦工" 啟動後會自動向主鏈註冊,註冊資訊包括:"最低可以接受的 Gas 價格"、"系統配置資訊"、"對外 IP 及埠" 等;
  2. "礦工" 通過 ChainBus 訂閱並關注和自己相關的資訊;
  3. 客戶端執行 cql create '{"node":2}'[3],向主鏈的任一 "出塊節點"(BP: Block Producer)傳送經過簽名的資料庫建立請求;
  4. 收到請求的 BP 在出塊的過程(詳見:主鏈出塊流程)中進行 "礦工" 和資料庫建立請求的撮合;
  5. 資料庫建立請求 和 撮合結果 在 其它 BP 節點進行驗證和確認;
  6. "礦工" 訂閱收到資料庫任務;
  7. "礦工" 通過 SQLChain 彼此發現、連線,組建 Kayak 資料庫叢集;
  8. 所有 "礦工" 準備就緒等待請求;
  9. 使用者可以通過 cql console 命令來連線資料庫,執行 SQL。

共識演算法

CQL 支援兩種共識演算法:

  1. DPoS (委任權益證明) 應用在資料庫的 最終一致性 和 Block Producer 所在的 第一層 (全域性共識層) ,CQL 的礦工在客戶端將所有SQL查詢及其簽名打包成塊,從而形成整個區塊鏈,我們把這個演算法命名為 Xenomint
  2. BFT-Raft (拜占庭容錯演算法) bft-raft[4] 應用於資料庫的 強一致性。我們把這個實現命名為 Kayak. 礦工 leader 會基於 Kayak兩階段提交 來支援 Transaction[5]

可以用命令列 cql create '{"UseEventualConsistency": true, "Node": 3}' 來建立 最終一致性 CQL 資料庫。

常見問題解答

  • Q: CQL 的資料庫安全是如何做的?
    A: 不同於傳統的資料庫,CQL 是執行在開放網際網路上的分散式資料庫系統。安全方面主要做了如下的工作:
  1. 金鑰體系:CQL 使用 Bitcoin 的 scep256k1 曲線的非對稱加密演算法產生的公私鑰對。
  2. 網路通訊:參見 網路安全
  3. 資料庫許可權 & 加密:
    1. 資料庫安全閘道器
    2. 支援 SQL 加密函式 encrypt, decrypt,例如:
INSERT INTO "t1" ("k", "v") VALUES (1, encrypt("data", "pass", "salt")); 
SELECT decrypt("v", "pass", "salt") FROM "t1" WHERE "k"=1;複製程式碼
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。

參考

  1. ^brew developers.covenantsql.io/docs/zh-CN/…
  2. ^CookieScaner github.com/CovenantSQL…
  3. ^Create developers.covenantsql.io/docs/zh-CN/…
  4. ^BFT-Raft github.com/CovenantSQL…
  5. ^Transaction github.com/CovenantSQL…


相關文章