热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CovenantSQL从零使用指南

Convenan


授权转载自网友xbsura的博客,原文: ConvenantSQL 从零使用指南





简要介绍

区块链技术出现有挺长一段时间了, 有不少基于这种技术的技术或者业务产品出现,最近发现一种基于区块链的数据库产品, 叫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盗版下载节点可能要大一些。

说不定可以赚点钱 ~_~





CovenantSQL是一个具有区块链特性的数据库。更多信息请访问我们的官网或者Github。

https://covenantsql.io/

https://github.com/CovenantSQL/CovenantSQL

测试网 https://testnet.covenantsql.io/


点击下面原文链接访问xbsura的博客~




推荐阅读
  • RMarkdown是一种用于在R中生成可重复生成的报告的开源工具。它可以帮助您将所有代码,结果和编写都放在一个地方,并以有吸引力且易于消化的方式格式化所 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 点此学习更多SQL相关函数与字符串处理函数mysql函数一、简明总结ASCII(char)        返回字符的ASCII码值BIT_LENGTH(str)      返回字 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 基于,docker,快速,部署,多,需求,spark ... [详细]
  • k8shelm官网:https:helm.sh点击charts:https:artifacthub.iopackagessearch?sortrelevance&page11.1h ... [详细]
author-avatar
超级放开祢旳掱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有