20

在联盟链技术与应用中如何结合数据库

 4 years ago
source link: https://www.tuicool.com/articles/2iUvEbj
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

10 月 19 日下午,由百度超级链学院与金色财经联合主办的百度超级链学院线下技术沙龙《区块链与数据库的融合碰撞》在北京科技寺创业空间滚石店顺利举行。众享比特实验室主任吴飞鹏进行了主题为《在联盟链技术与应用中如何结合数据库》的演讲,以下为 演讲整理

吴飞鹏,众享比特实验室主任。曾任职索贝数码,专注音视频编码、编辑的研发工作。2015 年进入众享比特,致力于分布技术的研发,主持研发了日志式数据库应用平台–chainsql,众享比特在区块链与数据库的融合方向上,已经做了一些探索性实践。

今天简单介绍一下我们在开发 ChainSQL 产品的过程中了解到的数据库有关的知识,以及一些相关技术。另外我也简单介绍一下我们的产品是怎样使用数据库、结合数据库的。

公司从 2016 年大约 1 月份正式开始对区块链展开研发。

我今天就讲一下在这个研发过程中遇到的一些问题,以及我们对区块链以及数据库的一些了解。今天来了一些互联网的同行,希望在这个过程中大家一起来探讨和学习,希望我们所做的工作,对以后大家在区块链部分和数据库方面的工作有一个启发和帮助。

今天主要从三个方面来讲一下今天的主题,第一是简单介绍一下我们要在区块链上存储数据是怎么做的,第二是区块链有没有用到数据库,是怎样使用数据库的?数据库在区块链中的应用。第三介绍一下我们公司的产品,简单介绍一下 ChainSQL 如何使用数据库。

V3y6rqq.png!web

刚开始我估计大家了解区块链无非就是上来发币,去玩一玩。大多像我一样什么都不懂,先接触比特币,比特币我相信大家都了解它:可以转账,确实非常方便。但是在比特币上我们怎么去记录数据?其实有两种方式,在 2014 年比特币升级以前,都是记在比特币第一个交易里面。它这个记录方法是在比特币的交易里面,在它的输入端去记录,因为这个记录方法,导致只有区块链的生产者才能在比特币网络上留下自己的痕迹。其他人,比如交易的发送者(使用比特币进行转账的人)做不到这一点,是留不下数据的。比如说你给自己的朋友生日记录什么东西,想在比特币上做,在 2014 年以前是做不到的。

然后接下来到了 2014 年,我们不仅想利用比特币金融转账的属性,同时希望区块链网络有承载数据记录的功能。因此在 2014 年的时候比特币做了节点升级,出现了一种交易,nulldata 的交易。对交易做了一些革新,coinbase 交易是在输入端可以记录一些数据,这时我们在比特币交易的输出端同样也可以做一个记录。因此,在比特币上面存储数据的话,一种是在输入端,一种是在输出端,我们普通用户选择普通交易就好了。

再说一下 Ethereum 和 Ripple 这两种是怎么做的?业务数据、想写的东西是记在交易里面,交易是透明的,大家都可以查到。

然后区块链到了联盟链的阶段,那么 fabric 怎么做?其实在我的理解里面,这个只是做了一个框架,fabric 给我们大众普通的开发者,或者普通的项目使用上,初始状态下,是什么都没有的。我们要做什么事情?我们想记录怎么做?不好意思,自己来实现。其实 fabric 给你提供了只是一个接口,所有的核心东西要自己做来实现,你想怎么样去存储数据,其实等于类似于就是一个合约。但是我们 fabric 没有智能合约是记录不了的,数据记录在什么地方?它的业务数据主要是记在数据库里面,比如说像大家用的 level DB 和 CounchDB,交易的接口是固定的,但是你开放的智能合约,里面的接口函数是非常自由的,可以随便定义。业务数据就是按照我们自己所希望的方式传给 Chaincode,Chaincode 最终将数据存储在数据库里面,这是业务数据的记录方式。

现在说一下区块链是不是用到数据库,数据库在里面发挥什么样的作用,简单说一下。链上的一些数据应该怎么去记,第一种是记录在文件里面,第二种是记录在数据库里面。

那对于以太坊来说都是记录在数据库里面,这些数据库我们使用的都是 k-v 数据库。节点直接把所记的东西最终转成一个 key 和 value。这个是链本身的数据库,本身的数据库里面是记在这个数据库里面的。

还有一种是链下数据,有时候你要查询区块链上的数据,区块链广义上来讲是数据库,但是数据库有一个很有用的功能就是快速查找,这个东西其实我们区块链是做不到的,这时就要在这个区块链节点下面加一个逻辑单元,把你想要展现的数据放在数据库里面。但是没有这个东西,没有下面这两部分的区块链,但是你无法很快速的让用户查到你所用的数据。比如说我们现在你能看到的以太坊浏览器,或者比特币浏览器看到的东西,我没有直接去链上查它的数据,我们知道区块链的数据具有不可篡改性,我们一步一步往回查找结构,总要查找这个交易,是能做到的,但是这种实时性,用户体验非常差。于是我们加入这个逻辑单元,然后把它输出到任意的关系型数据库里面。

接下来说一下 ChainSQL,在 2016 年的时候,大家在区块链领域,基本上都没有开始做项目研发,刚刚开始有想把区块链用在 B 端,用在这个企业上,解决几个实际问题。现在我们工程架构模式,无非就是 CS 架构、BS 结构,你一个逻辑应用下面加持一个数据库,这时候如果要用区块链来解决这个问题是怎么解决呢?无非是把数据库替换成区块链。但是带来一个问题?你需要的东西我现在只是好好的,我想利用区块链不可追溯、不可更改的特性,我要把我的数据库替换掉,其实是很吓人的事情。

JNFRbmB.png!web

ChainSQL 将区块链与传统数据库相结合,把对数据库的每一次操作看作一次交易,构建了一种基于区块链网络的日志式数据库应用平台。本段有两部分。第一部分就是上下两层,上面是我们的区块链网络。下面一部分是我们的数据库,数据库并没有做任何改变,还是使用的是我们传统的数据库,各类数据库都是可以使用的。

以前在传统的数据库里面,数据库用来存储与查询; 我们 Chainsql 的数据库有什么样的功能呢?数据库扮演了两个功能。第一个是用户进行查询,第二个是重构。 Chainsql 只是使用数据库,那数据库表存在什么地方?在区块链网络里面模拟了一张或者很多张数据库的表,以及表的一些管理。表在什么地方?有没有数据库表?那我们的数据库有什么功能呢?我只是说我想看这个区块链网络上数据库表的最终状态的时候,那怎么看呢?我得把已经落在区块链网络上,区块链中的交易读出来,然后再把这些操作发送到我们传统的数据库里面把状态呈现出来,因此从这个角度来看其实这上面有表,但是记录的表的操作过程,然而没有记录表的状态,无法去记录,一个一个交易,一个一个区块链的交易,只记录了这个交易,等于说我们把每次对数据库的操作在区块链网络上记下来,但是怎样去展示?你这个上面没有最终的状态,你只有一个过程,那你的状态在什么地方?你的用户想查询的时候咱们就必须在这个节点上面有一个数据库,你要是不查询,没必要挂接数据库。只有这个节点,用户直接往上面去发交易,它接受的是区块链的数据库类型交易,当然也可以接受其它类型交易。

然后咱们说 ChainSQL 里面用了哪些数据库,我其实刚才那几点在里面都用到了,第一个我们就是说链的数据,比如链上的虚拟货币。没有它不行,没有动力去挖矿,没有动力去做共识,所以必然有虚拟货币,就是得有一个激励机制来激励用户去参与维护区块链网络的正常运转,这些数据在什么地方。所有链上的数据是记录在 k-v 数据库里。然后我们刚才所说的它还记录了账户变化,以及各种交易的关系,怎么实现呢?我们也是有这么一个大的逻辑单元,在这个逻辑单元里,我们给大家做了一个整合,这个整合我们会把它放在关系型数据库里面,因此用户可以快速查看数据以及一个用户下面的金额变化,它是怎么一个变化曲线。因此说这个数据库其实是利用最广泛的,不管对工业来讲,你要提供快速查询,以及提供区块链浏览器功能的话,查询工作是非常重要的。

在这个里面我刚才说了,因为它是数据表上的东西,它最终状态得呈现出来,但是你就得最终把这个区块链上的交易提取出来,我们原生支持两种:mysql 与 sqlLite,然后通过 mycat 支持了一下其他的数据库。

rqQfaa3.png!web

我们其实对数据库并没有做任何改变,这是支持的一些数据库,然后这中间是我们的区块链节点,它对外提供链接接口是(java 与 nodejs)这两种开发。还有一种就是刚才所说的能不能支持直接用 sql 语句驱动区块链,我们是通过代理节点来做的支持。

这是 ChainSQL 的一些基本功能,第一个是数据库基本功能支持,因为它在区块链是虚拟的表,有表涉及到传统数据库的一些问题。当然在实际应用过程中,比如说用户想审计,应该怎么做呢?有很多特色功能,这都是后来根据用户需求给做出来的一些产品特性,这是基本功能,还有事务支持,共有三种交易类型。另外一个是进行管理有虚拟的管理单元,还有一个就是加密,加密也是非常重要的。你看这是非常矛盾的一件事情,区块链是一个公开透明的,但是我又不想被别人看见表内空,怎么做呢?这样可以实现,比如说我们表的某些字段进行加密,每一个交易内容先加密再进行发送。

我们再简单看一下审计的功能,数据库上面把某一个记录怎么来的,因为我们在链上有这个交易,做这个操作就可以了。然后这是我们这个同步表的逻辑,我刚才已经讲了,把我们这个数据拉下来,然后在这做一个逻辑单元单元,负责区块链到数据库 sql 的转换。

我们智能合约、产品特性、运行环境,这两个节点是验证节点,所有联盟链都是共识节点参与共识,维护区块链网络正常运行的,然后非验证节点就是做传递交易的功能。

到最后首先说一下应用场景,其实区块链不是在所有的场景下都能使用,一个概念,比方说你只要使用数据库,对数据吞吐率要求不高的场合下,需要追溯数据来源,希望数据不被私自更改,都可以借鉴、使用 Chainsql 平台,这是它的一些应用场景。

好了,谢谢大家,我今天的分享就到这里。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK