如何将区块链功能集成到现有的数据库应用程序中去
扫描二维码
随时随地手机看文章
对于传统数据库,区块链支持完全不同的范例。在计算历史中,我们第一次拥有了一个数据存储,在这个数据存储中,我们可以绝对确定数据项的创建日期,并且可以绝对肯定该项没有被修改。我们如何将区块链的强大功能集成到数据库中?
数据库已经存在了很长时间,尽管已经发生了一些重大变革——例如关系数据库的出现和随后的NoSQL反革命——但是从开发人员的角度来看,数据库操作几乎没有什么变化。
通常,应用程序创建一个数据记录,然后读取它,可能更新它并最终将其删除。这个创建-读取-更新-删除周期被称为方便的缩写“CRUD”。CRUD说明了数据库存储的短暂性——数据被创建、修改和删除。更新会销毁旧版本的数据,一旦删除,数据库记录将永远消失(除非我们完全恢复数据库的旧版本)。
此外,我们已经非常习惯于这样一个事实:数据库对交易的完整性提供了有限的保证。有特权的开发人员几乎总是可以复盖数据记录,甚至可以将时间戳设置为他们选择的任何记录。在数据库技术中没有内在的方法来保证数据元素没有被复盖。
区块链数据存储
区块链支持完全不同的范例。在最初的比特币区块链中,防止重复使用比特币的必要性是至关重要的,绝对有必要永远保存每笔交易的记录。
因此,区块链提供了一个仅限追加的不可变分类账,一个相对简单的数据库,其中可以添加数据元素,但不能删除或修改。比特币的工作证明算法和连续的区块链之间的加密链接使得篡改成为不可能。
因此,在计算历史上,我们第一次有了一个数据存储,我们可以绝对肯定一个数据项的创建日期,并且可以绝对地肯定该项没有被修改。这是一场真正的革命!
不幸的是,我们不能把区块链作为通用的数据存储区来使用。与传统的数据库相比,它简单、太慢、昂贵且笨拙。例如,比特币区块链每十分钟就会产生一个新的区块,每秒只能处理27个交易,如果将其用作传统的数据存储,每千兆字节将耗费数百万美元。
如何集成区块链功能
如果我们确实想将区块链功能集成到现有的数据库应用程序中,我们有两条路可走:
1.构建新的数据库技术,集成区块链的概念,但仍然可以提供经济性能。
2.在数据库和现有的区块链之间创建集成层。
一些早期的尝试是建立在区块链基础上的新数据库系统。不幸的是,它们不是“两全之优”,而是冒着“两全之劣”的风险:与现有数据库相比,它们更难以使用,功能也更差,而且没有以太坊和比特币等公共区块链提供的强大完整性保证。
目前,我们只能通过集成层获得两个世界的最佳解决方案。
幸运的是,有一些技术模式允许我们维护数据库记录的不可变副本,并将它们锚定到区块链上。
记录结构的Merge树和Merkle树
首先,我们可以将数据构造为日志结构的Merge 树(LSM)。在日志结构化Merge 树中,所有数据(包括删除和更新)都作为插入树中的插入处理。删除插入一条“tombstone”记录,该记录指出数据项已被删除。更新会原封不动地保留旧记录,只需插入一个新版本。
我们可以使用的第二个数据结构是Merkle树。Merkle树是一个哈希树,连续的哈希对本身进行哈希运算,直到获得单个根哈希。这个哈希可以用来验证数千个任意大小的数据元素的完整性。如果我们将这个根哈希存储在区块链上,那么这个根哈希就可以用来证明单个区块链交易中任意数量的数据库元素的完整性。
因此,如果我们将数据库模式实现为日志结构化Merge树,则可以使用Merkle树将数据库状态锚定到区块链。这样我们就拥有区块链不变性的所有优点,以及我们选择的任何数据库的强大功能。
如果这听起来工作量很大,那你就对的。但是,不要绝望。在ProvenDB中,我们已经将这个集成层构建到MongoDB中。使用ProvenDB,您可以照常使用MongoDB,但是在幕后,我们维护了LSM结构,并允许您访问区块链的完整性和时间戳证明。