区块链技术是比特币的底层技术和基础结构,比特币是区块链的第一个应用,区块链本质上是一个去中心化的分布式数据库,但是和分布式数据库还是有一些微妙的差异,下面分别从复制(Replication)、并发(Concurrency)、存储(Storage)、分片(Sharding)四个维度来分析区块链和分布式数据库相比在技术上的异同。
1. 复制
对数据进行复制是防止节点失效的一种最直接和有效的手段。然而复制带来的一个严重的问题就是数据一致性。解决数据一致性问题的一个关键技术就是共识算法,保证在一定的网络和容错假设下节点之间的数据一致性和活性。针对不同的网络和容错假设,适用的共识算法也不同。在传统的分布式数据库中,只需要容忍节点宕机,主要采用 Raft、Paxos 等经典共识算法。然而在区块链中,由于要容忍节点的拜占庭行为(数据被篡改),因此不得不采用代价更高的 PBFT、PoW 等共识算法。
2. 并发
为了提高系统的吞吐量,将多个交易或指令并行处理是在数据库领域非 常重要的技术之一。由于不同交易可能在同一个数据对象上进行操作,因此如何在并行处理的同时保证执行的正确性即并行控制(Concurrency Control)一直是数据库领域的一个研究热点。并行控制的目标就是使交易的执行实现一定的“隔离性(isolation)”,也就是说让交易在并行执行的时候好像感受不到其他交易的存在。在性能和正确性之间做取舍时可以将数据库分成不同的隔离级别,由低到高分别为 Read uncommitted、Read committed、Repeatable read、Serializable,对应的性能也逐渐下降。产品级别的数据库一般都提供多种隔离级别。
在现有的大部分区块链中,交易仍然是串行执行的。区块链对并行的支持并不友好,其中一个原因在于在现有的一些区块链中,执行层还不是瓶颈。例如, 在比特币中,一个区块的执行时间在毫秒级,相比于 10 分钟的区块产生时间, 执行部分几乎可以忽略不计。除此之外,在一些支持智能合约的区块链中,交易之间往往共享合约的状态,为了保证交易执行结果的确定性(Deterministic), 串行执行往往是最简单和保险的方式。
3. 存储
区块链是一个 append-only 的账本,包含从创世区块开始到最新的区块中包含的全部交易历史,这也就导致了很多主流的区块链的存储量动辄就要上百GB。为了支持真实性验证,区块链一般采用类似 Merkle Tree 的数据结构存储区块中的交易数据。例如,以太坊采用了 Merkle Patricia Trie(MPT)存储所有账户的状态。然而在大部分的数据库中,除非有特殊的 provenance 需求,否则用户一般只能访问最新的数据。历史数据会以 log 的形式保存一段时间供节点失效恢复的时候使用,但会被定期清理掉以节省存储空间。另外,由于分布式数据库更在乎性能,因此在建立索引的时候会根据硬件的性质进行特殊的优化。例如,数据在硬盘中一般会以“ B+ 树”的数据结构存储,而在内存中则用对多核并行和缓存更加友好的 FAST 或 PSL 等结构。
4. 分片
分片技术是分布式数据库中提高可扩展性的一项关键技术。通过将数据分散地交给不同分片( shard )处理,系统可以达到 scale-out 的效果,也就是说, 随着用户和数据量的不断增多,系统整体的吞吐量也随之接近线性增长,分片本身带来的 overhead 几乎可以忽略不计。
然而在区块链中引入分片并不简单,主要面临两方面挑战:第一,如何进行分片?区块链需要容忍拜占庭错误,而这依赖一个大前提,即网络中一定比例的节点是诚实的。例如,在 PoW 中要求总算力的 50% 是诚实的,而 PBFT 则要求超过 2/3 的节点数是诚实的。在将区块链的网络进行分片时就需要保证每个分片的安全假设都是成立的,一旦有一个分片 的安全前提不成立,那么整个系统的安全性都无法保证。然而由于在分片的时候一般都是随机将节点分配到不同的分片,这就要求总结点数规模要足够大,而且分片的个数不能过多, 这样才能保证每个分布中有足够数量的节点保证安全前提能够成立。
第二,如何保证 shard 之间的原子性?即一笔交易要么在所有分片都提交,要么在所有分片都终止。在传统的分布式数据库中,这一原子性一般由两阶段提交(2 Phase Commit,2PC)协议来保证,其中需要依赖一个中心化的Coordinator 来执行。然而在区块链中,由于没有中心化的 Coordinator 存在, 则需要引入一些外部的 BFT 协议来统筹 cross-shard 的交易。例如,以太坊 2.0 中的 Casper 协议。
随着区块链技术逐渐落地,无论是工业界还是学术界都在致力于提高区块链的性能,其中借鉴分布式数据库中成熟的技术则是最简单和保险的做 法。例如,BlockchainDB 和 FalconDB 就在区块链系统的基础上引入数据库的feature,使得互不信任的多方可以共同参与维护一个可验证的数据库。
另外,区块链所具备的一些安全特性也受到了一部分数据库设计者的青 睐,使得一些新型的更加追求安全性的数据库也具备了区块链的基因。例如, Blockchain Relational Database 就是在 PostgreSQL 的基础上引入区块链中的所具备的去中心化和可追溯的特性所设计的新型关系数据库(详情参见论文Blockchain Meets Database:Design and Implementation of a Blockchain Relational Database。这为将来 AntDB 融合区块链特性提供了很好的理论依据。