区块链和分布式数据库的区别
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链和分布式数据库的区别相关的知识,希望对你有一定的参考价值。
欢迎关注一下我的 知乎账号,以后主要在知乎分享内容。感谢~
https://www.zhihu.com/people/ypjiang96/posts
说一下自己的理解,如果理解有误欢迎评论区讨论 : )
首先区分一下分布式 (distributed) 和去中心化 (decentralized) 这两个词。
- 分布式:多节点共同组成一个系统,这些节点属于同一个信任域
- 去中心化:也是多个节点组成一个系统,但是这些节点可能属于不同的信任域
同一个信任域内的节点互相信任,不同信任域的节点之前不存在信任。
区块链是一个去中心化系统,有多个信任域,不同信任域可能有多个节点。
传统的分布式系统绝大部分应该都是属于单信任域系统。
注意,即使在同一个信任域内的系统,也可能需要拜占庭容错,因为节点可能遭受外部攻击。
不过传统的单信任域的系统出于性能考虑绝大部分都没有考虑拜占庭容错,使用了 Paxos 或者 Raft 共识算法。
而区块链则天然就要求拜占庭容错,因为根据定义区块链属于多信任域系统。
那么,区块链就是支持拜占庭容错的分布式系统吗?
其实二者还有更加微妙的区别。
在细说之前,我们再来区分一个词:transaction。数据库里一般翻译成事务,区块链里一般称为交易。
但是,区块链里的 transaction 和数据库里的 transaction 其实是有很大区别的。
如果非要对应的话,区块链中的 transaction 其实对应数据库里的存储过程 (stored procedure) ,二者都是在 server 端完成存储和计算。
而数据库里的 transaction 只是使用了数据库 server 端提供的 read/write/commit/abort 等接口,真正的计算是在单个 client 端完成的,注意这里的 client 是指应用程序所在的 server。
一个数据库系统也可能支持多个不同的应用。
那么,数据库的正确性就取决于这些应用是否是正确的,如果任何一个应用被攻击,就可能导致数据库的数据出现错误。
比如,某个应用的 transaction 逻辑被攻击之后篡改了,那么攻击者可能发起恶意的 transaction,也能 commit 到数据库。
如果使用存储过程,那么攻击者需要攻击数据库节点的存储过程逻辑才能攻击成功。而且数据库节点使用了共识算法来容错,系统可以容忍部分节点被攻击。
感觉数据库的存储过程和另一个概念非常类似,这里也一起讲一下:复制状态机 (state machine replication, SMR)。 二者的本质都是把 client 端的逻辑移到了 server 端,直接给 client 提供更加丰富的 API 来实现上层应用。而且为了不同节点的一致性,存储过程和 SMR 都要求逻辑是确定性的 (deterministic) 。
那么区块链就是支持拜占庭容错的 SMR 吗?
Hyperledger Fabric 的论文里其实已经说了三点区别:
- BFT SMR 只支持一个应用,区块链支持多个应用并行
- 区块链的应用 (智能合约) 可以被任何人(可能有权限控制)动态部署
- 应用代码是不受信的,甚至可能是恶意代码
感觉 BFT SMR 要想支持动态部署多应用也不难,所以关键还是在于第三点:既然应用可能是恶意代码,那么就需要对应的措施来防止恶意代码可能的危害,也就是需要解决停机问题,Ethereum 里用了 Gas 费用来解决停机问题。
此外,关于 determinism,传统的存储过程和 SMR 都是直接假设了 determinism,一旦存在 nondeterminism 就会导致非常严重的问题,而 Ethereum 则是设计了 EVM 和 Solidity 来从语言层面消除 nondeterminism 。
综上,个人认为,区块链相比传统分布式系统最核心的区别在于可能存在恶意代码,需要解决停机问题和 nondeterminism 问题,而传统分布式系统都是假设不存在这两个问题。
以上是关于区块链和分布式数据库的区别的主要内容,如果未能解决你的问题,请参考以下文章