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…
作者:面向工资编程
链接:https://juejin.cn/post/6844903832057544717
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。