ConvenantSQL 从零使用指南

简要介绍

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

ConvenantSQL是一个在底层 使用了区块链技术 的SQL数据库, 由一家创业公司开发并提供服务, 公司的地址是https://covenantsql.io/, 与现在云平台提供的数据库服务不同, ConvenantSQL有一些让人感到惊奇的特性:
1. 去中心化: 公有云 = 远端主机 + 外包运维, 比较形象地说明了现在公有云服务的本质, 所谓的便捷只不过是有人在看不见的地方帮你承担了成本; 而ConvenantSQL与这里的云略有不同, 整个数据库运行在在一个比公有云更公有云的系统之上(事实上, 每个人都可以成为这个系统的一个节点), 因此, 数据库是完全无中心的, 在节点数足够多时, 即使ConvenantSQL的母公司出现问题, 数据库上的数据服务依然还能保持可用
2. 历史记录不可篡改: 由于每个操作都存储在基于算力的区块链系统上, 在ConvenantSQL中进行的所有操作一旦确认, 即可保证无法被篡改, 假想一下, 我们基于这种数据库开发了一套资产管理应用, 那每笔资金的交易记录将清晰地进行记录, 不管是最厉害的黑客, 还是这个应用的开发者, 负责公司运营的老板, 都无法将其篡改
3. 低成本: 因为系统全部去中心化, 每个人的个人电脑都可以成为系统的一个运行节点, 充分利用了整个互联网中的计算与存储能力, 这种众包的方式比公有云集中托管的方式更有利于降低平均成本, 因此, 从结果上来看, 更可靠的服务, 反而有了更低的价格
4. 安全: 数据库的数据和传输使用区块链共识协议进行加密, 加密算法基于算力, 传统的攻击方式无法攻破, 保证了系统中数据的安全性

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

上手指南

下载基本工具

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

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

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

连接网络, 生成公私钥

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

执行./cql-utils -tool confgen, 输出结果如下:

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

生成钱包地址

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

执行./cql-utils -tool addrgen -private ./conf/private.key, 输出结果如下:

钱包地址生成完成

查看自己的钱包余额

执行./cql -config conf/config.yaml -get-balance, 输出如下:

嗯, 没有一毛钱, 而且, 还是的go语言编写的客户端

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

创建数据库

执行./cql -config conf/config.yaml -create 1创建数据库节点, 输出如下:

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

增删改查数据

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

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

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

package main

import (
    "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 version
go version go1.11.1 darwin/amd64
[ConvenantSQL@mac cli]$ go build main.go
[ConvenantSQL@mac bin]$ ./main --help
Usage 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.9以上, 否则有些库依赖没有

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

测试网

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

后记

sdk上现在有golang python js和java四种, 一般的场景还是能满足的

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

说不定可以赚点钱 ~_~

打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注