• 简体版 | 繁體版
  • 联系我们
  • 加入我们
  • 关于我们
  •  
  • 首页
  • 快讯
  • 价值号
  • 视频
  • 专题
  • 滚动
  • 入驻价值号
  • 碳链APP
    微信公众号

    扫码下载App

  • 登录
  • 微信公众号

    微信公众号

导航
  • 首页
  • 快讯
  • 区块链+
  • 价值号
  • 视频
  • 专题
  • DeFi优选
碳链价值APP
专注服务于金融科技和区块链
立即打开

了解 Geth 客户端:快照加速机制

碳链精选 •  2020-07-23
本文为 Geth 客户端有问必答系列的第一篇文章,,例如说说 flat 数据库结构与 legacy 结构的主要区别。 以太坊爱好者 30 分钟前 以太坊 Geth 1743

转自:以太坊爱好者

作者:曾汨

本文为 Geth 客户端有问必答系列的第一篇文章,大家可以就 Geth 客户端的问题踊跃提问,我会每周用一篇小文章回答得票最高的问题。本周呼声最高的问题是:你能说说 flat 数据库结构与 legacy 结构的主要区别吗?

以太坊的状态

在深入了解加速结构(acceleration structure)之前,我们先回顾一下以太坊的 “状态” 概念、在涉及到不同层次的抽象时又是如何存储的。

以太坊有两种不同类型的状态:账户的集合;每一合约账户存储槽的集合。从 完全抽象的角度来看,两种数据都是 键-值 对。账户集合把地址映射到该地址的 nonce、余额,等等。而一个合约的存储领域把任意的值(由该合约定义并使用)映射到某个值。

但糟糕的是,虽然把这些键值对存储成扁平数据(flat data)可以非常高效,但验证它们的正确性在计算上就会变得很难。每当对数据修改时,我们都要自下而上对所有数据做哈希运算。

为免去总是对整个数据库做哈希运算的需要,我们可以把数据库分割成连续的小片,然后建立出一种树状结构!最原始、最有用的数据就放在叶子节点上,然后树上每一个内部节点都是该节点以下内容的哈希值。如此一来,当我们要修改某些值时,就只需做对数次的哈希运算。这种数据结构其实有一个路人皆知的名字,就是 “默克尔树”。

但还没完,这种办法在计算复杂性上还是有所欠缺。默克尔树结构虽然在修改现有数据时非常高效,但是,如果插入数据和删除数据会更改底层小数据块的边界,那就会让所有已经算好的哈希值全都变为无效。

这时候,与其盲目地对数据库分组,我们可以使用键本身来组织数据、基于共同前缀将数据都安排到树状格式中!这样插入和删除操作都不会影响到所有节点,只会影响到从树根到叶子路径上的(对数个)节点。这种数据结构就叫 “帕特里夏树”。

把上面两种办法合在一起 —— 帕特里夏树的树状分层和默克尔树的哈希算法 —— 就是所谓的 “默克尔-帕特里夏树”,也是实践中用于代表以太坊状态的数据结构。无论是修改、插入、删除还是验证,都只有对数复杂度!唯一的小小例外是,有些键会在插入前做哈希运算(存入树中),以平衡整棵树(A tiny extra is that keys are hashed before insertion to balance the tries)。

以太坊的状态存储

上文解释了为什么以太坊要用默克尔帕特里夏树结构来存储其状态。遗憾的是,虽然所需操作的速度都很快,但每一种选择都有所牺牲。更新操作和验证操作的对数复杂性意味着对 每一个单独的密钥的读取和存储都是对数复杂的(logarithmic reads and logarithmic storage)。这是因为树状结构的每一个内部节点都要单独保存在硬盘上。

此时此刻,账户树的深度确切是多少我不知道,但在大约一年以前,账户状态就已填满了 7 层高的树。这就意味着,每一次树操作(例如读取余额、写入 nonce)都要触达至少 7~8 个内部节点,因此会做至少 7~8 次持久数据库访问(persistent database accesses)。LevelDB 组织数据时最多也是 7 层,所以还有一个额外的乘数。最终的结果是,单次状态访问预计会放大为 25~50 次随机的硬盘访问。你再乘上一个区块中的所有交易的所有状态读取和写入,你会得到一个 吓人的数字。

[当然,所有客户端实现都在尽力降低开销。Geth 使用更大的内存区域来缓存数节点;还使用了内存内的修剪机制、避免将几个块之后就会删除的数据写入硬盘。不过这需要另外一篇文章才能讲清楚。]

可怕之处还在于,这个数字就是运行一个以太坊节点、保证能全时验证所有状态的成本。

我们能做得更好一点吗?

并不是所有访问都要一视同仁

以太坊的运行依赖于对状态的密码学证明。只要我们还想保持对所有数据的验证能力,就绕不开硬盘读写放大问题。也就是说,我们 —— 可以并且也事实上—— 相信我们已经验证过的数据。

不断重复验证每一个状态物是没有意义的,但如果每次从硬盘中拉取数据都要验证一次的话,就是在做这样没有意义的事。默克尔帕特里夏树结构本质上是为写入操作设计的,但反过来就成了读取操作的负担。我们摆脱不了它,也无法让它瘦身,但 这绝不意味着我们在每一个场合都必须使用它。

以太坊节点访问状态的场景可大致分为以下三类:

  • 在导入一个新区块的时候,EVM 代码的执行会产生或多或少基本平衡的状态读取和写入次数。不过,一个用于拒绝服务式攻击的区块可能会产生远多于写入操作的读取操作次数。
  • 当节点运营者检索状态的时候(例如调用 eth_call 及类似操作),EVM 代码执行仅产生读取操作(当然也可能有写入操作,但这些操作产生的数据最终会丢弃掉,不会持久化到硬盘里面)。
  • 当节点在同步区块链的时候,同步者会向远程节点请求状态,被请求者会将数据挖掘出来并通过网络传播给同步者。
基于上述访问模式,如果我们可以短路(short circuit)读取操作而不触及状态树,则许多节点操作都可以变得快 很多。这样甚至能开启一些新奇的访问模式(比如状态迭代),让原来因为太过昂贵而不可行的模式变为可能。

当然,还是不免有所牺牲。没有去掉树结构,任何新的加速结构都会带来额外的开销。问题只在于:额外的开销是否能带来足够多的好处,值得我们一试?

请循其本

我们已经开发出了神奇的默克尔帕特里夏树结构来解决我们所有的问题,现在,我们希望让读取操作能绕过它。那么,我们应该用什么样的加速结构来让读取操作重新变得快起来呢?显然,如果我们不需要树结构,那就大可以把伴随树结构而生的复杂性都丢在一边,我们可以直接回到原始状态。

如同在本文开头说到的那样,理论上的理想状态下以太坊状态的数据存储方式应是简单键值对,没了默克尔帕特里夏树构成的限制,那就没有什么能阻止我们去实现这种理想方案了!

不久之前,Geth 引入了 snapshot(快照)加速结构(不是默认开启的)。一个快照就是给定一个区块处的以太坊状态的完整视图。抽象掉实现方面的细节,它就是把所有账户和合约存储槽堆放在一起,都由扁平的键值对来表示。

每当我们想要访问某个账户或者某个存储槽的时候,我们只需付出一次 LevelDB 的查询操作即可,而不用在每棵树上查询 7~8 次。理论上来说,更新快照也很简单,处理完一个区块后,我们只需为每个要更新的存储槽多做 1 次额外的 LevelDB 写入操作即可。

快照加速结构实际上将读取操作的计算复杂性从 O(log n) 降到了 O(1) (乘以 LevelDB 的开销),代价是将写入操作的计算复杂性从 O(log n) 变成了 O(1 + log n) (乘以 LevelDB 的开销),并将硬盘存储空间从 O(n log n) 增加到了 O(n + n log n)。

魔鬼藏在细节中

维持以太坊状态快照的可用性也不容易。只要区块还在一个接一个地产生,一个接一个地摞在最后一个区块上,那将最新变更合并到快照中的粗疏办法就能正常工作。但是,哪怕有微小的区块链重组(即便只有一个区块),快照机制就崩溃了,因为根本没有设计撤销操作。对扁平数据表示模式来说,持久化写入是单向的操作。而且让事情变得更糟糕的是,我们没办法访问更老的状态了(例如某些 dApp 需要 3 个区块以前的状态;或者 fast/snap 同步模式中要访问 64 个区块以前的状态)。

为了克服这些限制,Geth 客户端的快照由两部分组成:一部分持久化的硬盘层,是对旧区块(例如顶端区块前 128 个区块)处状态的完整快照;还有一棵内存内 diff 层组成的树,用于收集最新的写入操作。

处理新区块的时候,我们不会直接合并这些写入操作到硬盘层,而仅仅是创建一个新的、包含这些变更的内存内 diff 层。当内存内部的 diff 层积累到足够高的层数时,最底部的一个就开始合并更新并推到硬盘层。当需要读取一个状态物时,我们就从最顶端的 diff 层开始查找,一直往下,直至在 diff 层中或者在硬盘层中找到。

这种数据表示方法非常强大,解决了很多问题。因为内存内部的 diff 层组成了一棵树,所以 128 个区块以内的链重组只需取出属于父块的 diff 层,然后就此开始构建即可。需要较旧状态的 dApp 和远程同步者可以访问到最近 128 个最近的状态。开销变成了 128 次映射查找,但 128 次内存内的查找比起 8 次硬盘读取及 Level DB 的 4~5 倍放大要快上几个数量级。

当然,这里面还有很多很多的坑。就不讲太深了,简单列举就有下面这张清单:

  • Self-destruct (合约自毁操作)(以及删除操作)特别难以对付,因为它们需要短路 diff 层的沉降(descent)。
  • 如果出现了比持久硬盘层更深的链重组,那现在的快照就要完全废弃掉、重新生成。整套操作非常昂贵。
  • 在节点关机时,内存内的 diff 层需要持久化到日志并加载备份,不然重启之后快照就没用了。
  • 使用最底层的 diff 层作为一个累加器,仅在其超过一定的内存使用时才刷新到硬盘。这就允许跨区块对同一存储槽执行去重写入操作(deduping write)。
  • 要为硬盘层分配一个读取缓存,这样合约重复访问同一个古老的存储槽时硬盘才不会损坏。
  • 在内存内 diff 层中使用累积的布隆过滤器(bloom filter),以便快速检测出状态物有没有可能存在于 diff 层中,还是应该直接跳到硬盘中查找。
  • 不把原始数据(账户地址、合约存储键)设为键,而是以这些数据的哈希值为键,以保证快照的迭代顺序与默克尔帕特里夏树相同。
  • 生成持久化硬盘层的时间要比剪除状态树窗口的时间多得多,所以即使是生成器,也需要动态地追踪链的运行。

美丑并存

Geth 的快照加速结构将状态读取的复杂性降低了一个数量级。这就意味着基于读取操作的 DoS 攻击的发动难度上了一个数量级,而 eth_call 调用也快了一个数量级(假设 CPU 不存在瓶颈的话)。

快照还让对最近的块进行极速状态迭代成为可能。实际上这曾是我们开发快照机制的主要理由,因为我们可以此为基础创造新的 snap 同步算法。讲清楚它需要一篇全新的文章,但最近我们在 Rinkeby 测试网上的基准测试很能说明问题:

耗时上行流量下载流量包数量硬盘读取量
fast 同步2h34m4.53GB11.43GB3573352.89TB
snap 同步42m0.083GB6.53GB373470.04TB
-63.7%-98.2%-43.9%-90.5%-98.6%
当然,这一切同样不是没有代价的。当初始同步完成之后,参与主网的节点需要 9~10 小时来建构初始快照(此后再维持其可用性),还需要额外的 15 GB 以上的硬盘。

那糟糕的部分是哪里呢?我们花了 6 个月时间才积累起足够的自信、发布了快照机制,而且现在它仍然不是默认功能,需要主动使用 --snapshot 标记来开启,而且还有一些围绕内存使用和崩溃恢复的打磨工作要做。

总而言之,对于这一提升,我们非常自豪。其中有巨大的工作量,而且是在黑暗中摸索、自己实现所有东西并祈祷它能工作。还有一个有趣的事情,第一个版本的快照同步(leaf sync)是在两年半以前写的,但一直都处于被阻塞的状态,因为我们缺乏必要的加速结构来驱动它。

结语

希望你能喜欢 Geth 客户端有问必答的这一篇文章。我花了比自己所预想的多出一倍的时间,但我并不后悔,因为这个主题值得。下周见。
展开全文
打开碳链价值APP  查看更多精彩资讯
声明:本文内容为作者独立观点,不代表碳链价值立场,且不构成任何投资理财建议。
0 0
以太坊Geth链圈子

扫一扫,分享到微信

相关推荐

2022年第一场寒潮:以太坊清算与三箭资本的败局 价值号

2022年第一场寒潮:以太坊清算与三箭资本的败局

达瓴智库 2022-06-26 价值号
以太坊三箭资本
尽管有许多项目和VC可能会在这一场熊市中倒下,但加密资产行业仍然会有触底反弹的一天。
加密货币熊市简史,你会发现所有的下跌都是为了更好的发展 价值号

加密货币熊市简史,你会发现所有的下跌都是为了更好的发展

AXA Labs 2022-06-24 价值号
数字货币以太坊熊市生存
在过去的 60 天里,由于加息影响加密货币市场经历了自成立以来最悲观的时期之一,在此时间范围内损失了近 1 万亿美元。2022 年排名前两位的比特币和以太币的价值分别下跌超过 35% 和 43%。
以太坊合并碰上熊市,还能如期上涨吗? 价值号

以太坊合并碰上熊市,还能如期上涨吗?

一只团子 2022-06-24 价值号
以太坊比特币数字货币区块链
如果事情顺利,以太坊甚至可以击败比特币是最佳价值储存手段的说法

碳链快讯更多 ›

2022-06-27

Otherdeed总交易额超过10亿美元,24小时交易额涨幅达338.20%

2022-06-27

外媒:Celsius CEO曾试图逃离美国但被当局阻止

2022-06-27

中国科协主席万钢:希望走出一条具有中国特色的“元宇宙”发展路径

2022-06-27

澳新银行推出的澳元稳定币已被用于购买该国代币化碳信用额度

2022-06-27

人民网评比特币暴跌:虚拟货币终究是黄粱一梦、庞氏骗局

2022-06-27

四川法院在一起虚拟货币交易案件中判决借条无效且交易平台停止造成的损失风险自担

2022-06-27

北京:培育人工智能、区块链等新兴产业集群

2022-06-27

伊朗央行计划在2个月内推出加密里亚尔的试点

2022-06-27

印度推出首个NFT电子竞技平台Loco Legends

2022-06-27

印度时尚Web3初创公司Bitliberte完成176万美元融资

2022-06-27

彭博ETF分析师:SEC不会批准一个现货比特币ETF

2022-06-27

《徐州日报》发行江苏首份新闻数字藏品

2022-06-27

英国议员:加密市场的抛售并未动摇他对该行业的信心

2022-06-27

FatMan:今年1月Hodlnaut在未告知客户的情况下将资金大量转移到Anchor

2022-06-27

尼日利亚央行行长:推出e-naira以确保尼日利亚在日益数字化的世界中保持竞争力

2022-06-26

萨尔瓦多比特币城由墨西哥建筑师Fernando Romero设计

2022-06-26

字节跳动收购元宇宙社交厂商波粒子科技

2022-06-26

俄罗斯加密矿业价值190万美元的硬件被盗

2022-06-26

重庆市国家区块链创新应用综合性试点(渝中区)建设启动

2022-06-26

广州地区已落地数字人民币支付场景8.5万个

2022-06-26

Harmony创始人:跨链桥Horizon私钥泄露导致攻击,已转移至更严格的多签

2022-06-26

4个头部稳定币总市值首次超以太坊

2022-06-26

印度加密货币市场状况恶化 ,平台纷纷收缩

2022-06-26

风险投资家Tim Draper:比特币将在2023年达到25万美元

2022-06-26

Patrick Hansen:欧盟两项加密货币法规所有的大问题都已达成一致

2022-06-26

扎克伯格:元宇宙将在本10年后期成重要业务

2022-06-26

罗马尼亚发布将政府文件存储为NFT的计划

2022-06-26

Morgan Creek Digital试图筹集2.5亿美元,以收购BlockFi的多数股权

2022-06-26

华谊兄弟王中磊:内容是元宇宙的核心

2022-06-26

普华永道:中国市场中,数字藏品、虚拟人、虚拟世界成为当前最重要的三个元宇宙赛道

2022-06-25

农民日报首发地标农品主题数字藏品

2022-06-25

四川日报:川港交流系列活动将发行庆回归25周年NFT数字艺术品

2022-06-25

BitMEX创始人:高盛拟收购Celsius资产或仅为公关噱头

2022-06-25

上海布局元宇宙等“新赛道” 促进细则6月底公布

2022-06-25

IMF:美国经济可能在未来两年放缓,将勉强避免衰退

2022-06-25

高盛正筹集20亿美元计划收购Celsius的不良资产

2022-06-25

彭博社:以矿机为抵押物的近40亿美元贷款或对加密贷款机构构成潜在风险

2022-06-25

加密金融服务公司Flowdesk完成3000万美元A轮融资,Coinbase等参投

2022-06-24

美国用户现可通过 Apple Pay 在 Crypto.com APP 中直接购买加密货币

2022-06-24

Polygon 首席信息安全官:用于部署 Harmony 桥的多签钱包被黑客控制导致资产被盗

2022-06-24

慢雾:Ribbon Finance遭遇DNS攻击,某用户损失16.5 WBTC

2022-06-24

内蒙古通信管理局推进虚拟货币“挖矿”整治工作

2022-06-24

瑞士金融市场监管局CEO呼吁对加密市场实施更多监管

2022-06-24

Cardano联合创始人:加密合规问题应由自律组织处理,而非监管机构

2022-06-24

Ripple CEO指责美国SEC对加密公司的监管太双标

2022-06-24

成都链安:Harmony Bridge疑似私钥泄露,损失金额约1亿美元

2022-06-24

纳米比亚大学将于2024年提供区块链技术硕士学位

2022-06-24

美SEC主席敦促制定加密规则手册,以避免监管漏洞

2022-06-24

香港金管局:加密资产有需要纳入监管框架

2022-06-24

BSC链上托管平台Justcows疑似跑路,项目方已转移500万美元资金

推荐文章

  • Binance.US 遭集体诉讼:它在Terra事件中对投资者究竟做了什么?

    2022-06-27

  • 「杰伦熊」暴跌96.6%:明星带货NFT为何遇冷?

    2022-06-27

  • a16z:元宇宙带来的游戏变革会是怎样的?

    2022-06-27

  • 对加密货币崩盘和周期性的思考

    2022-06-27

  • 如何确定购买哪些 NFT:必读指南

    2022-06-26

价值号更多 ›

吉时通信
吉时通信
文章: 134
  • 从OpenSea的挑战者看NFT交易平台的演进历程
  • 以太坊合并:如何影响显卡和区块链行业?
  • 以太坊合并的底层观察:区块结构和MEV
链集市ChainMarket
链集市ChainMarket
文章: 180
  • 区块链产业周刊丨日本政府计划开始全面改善Web3环境;三星资产管理将上市其区块链ETF;中国支付清算协会提议推广数字人民币新场景
  • 区块链会彻底改变整个亚太地区供应链吗?
  • 区块链产业周刊丨北京发布数字经济全产业链开放发展行动方案;江苏省成立区块链发展协会;重庆启动数字人民币缴税试点
Unitimes
Unitimes
文章: 388
  • Web3 解锁更有价值的互联网
  • Messari:如何看待以太坊「以 Rollup 为中心」的未来?
  • EVM 网络效应:为什么说 EVM 可能比以太坊本身更重要?
换一批

热门标签

新基建 比特币 以太坊 矿业 DeFi 共识对话 区块链+ 研报 美联储 央行数字货币 无限QE 加密衍生品 AI 云计算 大数据 5G 政策 交易所 稳定币 电子支付 Libra 算力产业 联盟链 公链 区块链 加密货币 Nervos Cosmos EOS STO

邮件订阅

及时、全面、专业、准确的资讯与数据,致力于为区块链爱好者以及数字货币投资者提供最好的服务。

App内打开

邮件订阅

及时、全面、专业、准确的资讯与数据,致力于为区块链爱好者以及数字货币投资者提供最好的服务。

Moshou

碳链价值是集资讯、行情、数据于一身的区块链信息服务平台,我们追求及时、全面、专业、精确的资讯与数据,致力于为区块链创新者和数字货币投资者提供优质的服务。

关于我们 加入我们 联系我们 隐私条款
微信公众号

扫一扫关注微信公众号

Copyright © 2018-2020 碳链价值 京ICP备18046423号
下载碳链App

下载碳链App

微信公众号

微信公众号

微信公众号

微信公众号

打赏文章作者

支付宝打赏二维码 支付宝扫一扫打赏
微信打赏二维码 微信扫一扫打赏

# 热门搜索 #

CBDC 比特币 DeFi 以太坊 区块链