每次跟别人讲,我们正在做一个去中心化的链上数据库,就会被质疑:区块链的数据库,岂不是性能很差?数据库要的是高性能的增删改查,最好能在几十毫秒内得到相应才好。
难道去中心化数据库就做不到吗?
我们一步一步拆解去中心化数据库 Db3Network 具体是如何做到高性能查询,还不降低去中心化程度的。为了达到这个目的,我们提出了一个概念:QuerySession 。
在此之前,我想讲讲数据的可信问题。当我们用中心化的数据库的时候,为什么性能很高,有多方面原因,比如数据库索引性能好,本地机房离得近,分库分表做的好等等,其实还有一个关键的点,就是我们信任自己的机房。前面几点很好理解,可为什么信任会很重要?因为你相信自己的机房会正确执行你传入进去的 SQL 语句,并返回预期的实际结果,甚至数据库实现的代码都是你自己写的,所以你从来不需要去验证结果,更不会需要数据库给你提供什么证据来证明它正确执行了你的 SQL。一切都是因为信任。
可以是在一个开放式的非信任的网络环境下,你并不知道执行你的 SQL 的机房是哪个,背后管理员又有什么动机,没人保证你的 SQL 会被正确执行。比如数据库运行者会因为自己运行 sql 的多少得到付费,那它就有很大的动力尽快尽可能多的执行 sql,无论你输入什么 sql,数据库执行者都给你返回一个随机数,看起来你的很快的得到响应,但结果却是错误的。所以在去中心化网络环境中,我们需要对执行结果进行验证,或执行方需要提供证据证明他正确执行了 SQL 语句,这也就是非信任的成本,而中心化数据库是没有这个问题的,这也是影响数据库性能的关键。
结果可信
如何做到结果可信问题?
方案很简单:共识。我们的做法跟传统区块链如 BTC,ETH 没有什么区别,就是一笔交易让网络中所有节点执行一遍,得到同样的结果,达成共识,以此来保证数据库查询的结果是正确的,只有执行了正确的逻辑,矿工才能获得区块链奖励,否则就会受到惩罚。
这里有几个设定:
1、开放的去中心化网络,任何人都可以运行节点去执行交易,即数据的增删改查
2、作为节点,需要质押一定量的 token
3、作为激励,矿工节点每正确执行一次 SQL,都会获得用户支付的查询费用
4、错误的执行会受到网络的惩罚
5、用户需要为自己的调用支付费用
等一下,为了到达以上几点,不就会导致查询性能很差吗?
激励 + 惩罚
矿工之所以愿意加入到 Db3network 的网络,就是因为有激励,可以获得收益。收益可以分为两部分:1、网络增发,2、节点数据服务 gas。
网络增发这里先不说,重点讲 gas 收益。用户每次查询数据,都需要为自己的查询语句带上签名,并支付 gas 费用。但是 gas 费并不会立即给到执行查询的矿工手中,而是需要经过一轮结果验证,最终验证通过后才会收到费用。
如下图所示,执行 sql 的 Miner 节点,会将自己执行的事件广播到网络中,让网络其他节点验证,只有验证通过后才能获得收益,如果事件不被广播或者验证不通过,则执行节点将不能获得收益,甚至会受到惩罚。所以矿工是有充分的动力提供数据查询服务,并积极提供数据服务证明。
上图可以看出,网络的共识过程其实对用户(client)的查询影响是非常有限的,查询结果可以立即返回而不用等待区块的产生。
但是如果每单次查询都要走这个过程,那网络的带宽消耗非常高,而且很容易出现区块 size 太大,逐渐导致查询结算延迟,甚至出现区块分叉问题,所以我们的解决方案是整体打包,提出 querySession 的概念。
QuerySession
这里,我们介绍一个新的概念:QuerySession。当 client 连接到一个最近的矿工节点后,会开启一个 Session,建立 client 和 Miner 之间的链接,这个 Session 会持续一分钟左右时间,在这个时间内,client 可以跟 Miner 之间进行多次的数据交互,交互的过程并不会立即上链,而是等 Session close 的时候,将整个 Session 信息整体打包上链,这个过程能在不损伤共识的前提下,大幅降低链上数据共识压力。
Query Session 的结构
这里简单展示一个 Query Session 是大体构成,包含了 Session 的 start_time 和 status,另外就是 client 是 server 双方的签名信息,网络会验证这个这个签名信息,并整理出账单等信息。还有个模块就是 sample,client 端会抽样出在这个 Session 中的一些 queries 和 respone,打包后,上传到网络进行异步的验证。下面这段代码只是样例,真实的 Session 数据结构要比这个复杂很多
Query Session 的校验
区块校验的过程大概如下:
1、跟 client 交互的 server 会将 Session 信息提交到 Mempool 中,作为一笔交易 TX,
2、网络中随机节点从 Mempool 中选择 TXs ,置信交易并校验通过,提交一个 propose 作为区块,
3、网络中其它节点收到 propose 并同样执行这些 Mempool 中的交易,并确认交易,
4、区块产生,提供 server 的矿工节点得到待结算的账单
具体 session 上链过程如下图所示:
关于 Db3Network 的性能问题,我们要解决的问题远不止信任问题,除此之外还有
数据库索引性能问题
数据证明问题
提供服务的机房地理位置问题
分库分表问题
限于文章篇幅,本篇只介绍 结果可信问题。
Github:
https://github.com/dbpunk-labs/db3
欢迎任何感兴趣的朋友来我们 github 上提 issue
Twitter:
https://twitter.com/Db3Network
Discord:
https://discord.com/invite/sgY2bbFCzr
文章作者
Twitter: @muran_eth
原文链接为 Mirror
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。