其他
引介 | Turbo-Geth 客户端:数据库改进
几个月以前,我加入了 Turbo-Geth 团队,开始主动给 Trubo-Geth 客户端贡献代码。Turbo-Geth 客户端是 Geth 客户端的一个另类版本(当前仍在开发),其目标是做得比原有的客户端运行速度更快、更高效。那么 Turbo-Geth 实现这个目标的办法包括下面几项:
进一步优化数据库结构 在需要与状态数据交互的场合,减少对数据库的读、写操作 优化状态树操作的效率(有可能需要改变现有状态树的数据结构)
不同的数据库(使用 Bolt,而非 LevelDB) 按桶(bucket)来细分数据库
什么是 Bolt,它跟 LevelDB 的区别在哪里?
原子性:“原子” 意味着不可分割。假设现在我们要给一个数据库存储多个哈希值,而其中一个在插入数据库时失败了,如果此时所有哈希值的操作都会同时撤销,这就叫做原子性。Turbo-Geth 就有这样的特性,只有所有哈希值的插入操作都成功时,这个操作才能成功。而没有实现原子性的数据库(比如 LevelDB)则意味着,必须使用一个 workaround 以安全地将数据插入数据库。换句话来说,在这个点上,我们觉得 Bolt 更好,因为他在给数据库添加数据时更安全。
数据库的组织
Geth 客户端的 Archive 大小(区块高度 9346492): 3.7 TB
Parity 客户端的 Archive 大小(区块高度 9346492): 3.6 TB
Turbo-Geth 客户端的 Archive 大小(区块高度 9346492): 652.62 GB
原象(preimage):哈希值与地址之间的管理,以及存储位置哈希值与存储位置之间的关联 收据(receipt):交易收据 合约存储内容的历史(History of Storage):合约存储内容的变更历史 账户历史(History of Accounts):账户的变更历史 区块头:每个区块的区块头 区块体:每个区块的区块体 合约存储内容(Contract Storage):就是合约存储内容 ChangeSet:数据库变更历史 账户:账户
另一种备选方案:Badger DB
结语
使用多个 bucket,以更迅速地检索某些数据片 使用 B+-Tree 而非 LSM
(完)
(文内有许多超链接,可点击左下 ”阅读原文“ 从 EthFans 网站上获取)
原文链接:
https://medium.com/@giulio.rebuffo/turbo-geth-whats-different-the-database-5916e8ec834b
作者: Giulio Rebuffo
你可能还喜欢: