CovenantSQL从零使用指南

2022-04-11 00:00:00 数据库 节点 生成 地址 区块

简要介绍

区块链技术出现有挺长一段时间了, 有不少基于这种技术的技术或者业务产品出现,近发现一种基于区块链的数据库产品, 叫ConvenantSQL。

ConvenantSQL是一个在底层使用了区块链技术的SQL数据库, 由一家创业公司开发并提供服务, 公司的地址是 https://covenantsql.io/, 与现在云平台提供的数据库服务不同, ConvenantSQL有一些让人感到惊奇的特性:

  1. 去中心化: 公有云 = 远端主机 + 外包运维, 比较形象地说明了现在公有云服务的本质, 所谓的便捷只不过是有人在看不见的地方帮你承担了成本;而ConvenantSQL与这里的云略有不同, 整个数据库运行在在一个比公有云更公有云的系统之上(事实上, 每个人都可以成为这个系统的一个节点),因此, 数据库是完全无中心的,在节点数足够多时,即使ConvenantSQL的母公司出现问题,数据库上的数据服务依然还能保持可用。

  2. 历史记录不可篡改:由于每个操作都存储在基于算力的区块链系统上,在ConvenantSQL中进行的所有操作一旦确认,即可保证无法被篡改。假想一下,我们基于这种数据库开发了一套资产管理应用,那每笔资金的交易记录将清晰地进行记录,不管是厉害的黑客,还是这个应用的开发者,负责公司运营的老板,都无法将其篡改。

  3. 低成本:因为系统全部去中心化,每个人的个人电脑都可以成为系统的一个运行节点,充分利用了整个互联网中的计算与存储能力,这种众包的方式比公有云集中托管的方式更有利于降低平均成本,因此,从结果上来看,更可靠的服务,反而有了更低的价格。

  4. 安全:数据库的数据和传输使用区块链共识协议进行加密,加密算法基于算力,传统的攻击方式无法攻破,保证了系统中数据的安全性。

除此之外,ConvenantSQL 兼容主流SQL语法,功能上有不少可以使用的地方,性能上没有测过,不知道怎样,简单用了一下,这里写一下使用的过程,有兴趣的同学可以了解下。


上手指南

1. 下载基本工具

从ConvenantSQL的github页面 https://github.com/CovenantSQL/CovenantSQL 选择下载新版本的ConvenantSQL工具,有Linux和mac两种发行版本可以直接使用,如果有其他发行版的需求,可以自行下载源码进行编译。

我自己的机器是mac系统,所以下载0.0.2的osx版本,下载下来是个tar.gz包,解开之后是个bin目录,里面有这些文件:


我们先收好,待会会用到里面的内容。


2. 连接网络, 生成公私钥

使用cql-utils
生成配置文件连接数据库区块链所在的网络。

执行

./cql-utils -tool confgen

输出结果如下:


非常简单,公钥和私钥就生成完成了,公钥打印到屏幕上,私钥写到了配置文件里。


3. 生成钱包地址

ConvenantSQL基于区块链钱包,因此需要生成一个钱包地址。

执行

./cql-utils -tool addrgen -private ./conf/private.key

输出结果如下:


钱包地址生成完成。


4. 领Token,查看自己的钱包余额

执行

./cql -config conf/config.yaml -get-balance

输出如下:


嗯,没有一毛钱,可以来测试网领测试用的Token,现在是免费领的,不知道后面会不会升值……而且,还是的go语言编写的客户端,貌似不领也能用数据库……

到此为止,我们的基础建设就完成了,接下来,就可以在区块链网络中创建和使用数据库了。


5. 创建数据库

执行

./cql -config conf/config.yaml -create 1

创建数据库节点,输出如下:


这里的1指的是为数据库创建一个节点,返回的类似 covenantsql://******* 的这个字符串,就是在这个网络中的数据库地址,在后续的使用过程中,就是使用这个地址进行数据的增删改查。


6. 增删改查数据

目前来说,对数据库的增删改查,还需要借助代码实现,命令行工具还不行,官网提供了go语言的SDK来完成这些事情,我们来简单操作下。

参考地址是: https://github.com/CovenantSQL/CovenantSQL/blob/develop/client/README.md

新建一个目录cli,创建main.go,代码块如下:

package mainimport (
    "database/sql"
    "flag"
    "fmt"
    "github.com/CovenantSQL/CovenantSQL/client"
    log "github.com/sirupsen/logrus")func main() {
    log.SetLevel(log.InfoLevel)
    var config, password, dsn string
    flag.StringVar(&config, "config", "./conf/config.yaml", "config file path")
    flag.StringVar(&dsn, "dsn", "", "database url")
    flag.StringVar(&password, "password", "", "master key password for covenantsql")
    flag.Parse()
    err := client.Init(config, []byte(password))
    if err != nil {
        log.Fatal(err)
    }
    db, err := sql.Open("covenantsql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    log.INFO(db)
    _, err = db.Exec("DROP TABLE IF EXISTS testSimple;")
    if err != nil {
        log.Fatal(err)
    }
    _, err = db.Exec("CREATE TABLE testSimple ( indexedColumn, nonIndexedColumn );")
    if err != nil {
        log.Fatal(err)
    }
    _, err = db.Exec("CREATE INDEX testIndexedColumn ON testSimple ( indexedColumn );")
    if err != nil {
        log.Fatal(err)
    }
    _, err = db.Exec("INSERT INTO testSimple VALUES(?, ?);", 4, 400)
    if err != nil {
        log.Fatal(err)
    }
    row := db.QueryRow("SELECT nonIndexedColumn FROM testSimple LIMIT 1;")
    var result int
    err = row.Scan(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("SELECT nonIndexedColumn FROM testSimple LIMIT 1; result %d\n", result)
    err = db.Close()}

编译运行一下,看看输出:

[ConvenantSQL@mac cli]$ go get github.com/sirupsen/logrus[ConvenantSQL@mac cli]$ go get github.com/CovenantSQL/CovenantSQL/client[ConvenantSQL@mac cli]$ go versiongo version go1.11.1 darwin/amd64[ConvenantSQL@mac cli]$ go build main.go[ConvenantSQL@mac bin]$ ./main --helpUsage of ./main:  -config string        config file path (default "./conf/config.yaml")  -dsn string        database url  -password string        master key password for covenantsql[ConvenantSQL@mac bin]$ ./main --dsn covenantsql://***************************************SELECT nonIndexedColumn FROM testSimple LIMIT 1; result 400

编译的时候,需要注意Golang的版本要在1.11版本,否则有些库依赖没有。

到此为止,完成了对CovenantSQL数据库的基本使用,接下来,就可以在业务中直接使用接口进行数据读写了。


测试网

以上的所有操作都是在测试网络中运行的,可以用来体验一下功能,不能直接用到生产场景。


后记

SDK上现在有Golang Python JavaScript和Java四种,一般的场景还是能满足的。

虽然技术上是基于公有链的数据库,现在直接让普通用户当做矿工提供服务的应用还没有,如果到时候能发出来,那家里有闲置路由器和硬盘的同学可以试用一下,数据库服务的附加值要比当做P2P盗版下载节点可能要大一些。

来源 https://www.modb.pro/db/190841

相关文章