宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > 以太坊 > 正文

以太坊阶段式同步:重构完全同步模式(Full Sync)

作者:

时间:1900/1/1 0:00:00

阶段式同步(staged sync)重构自 Go-Ethereum 的完全同步模式(full sync),以实现更好的性能。

阶段式同步需要进行大量读写操作。虽然我们的目标是能够在机械硬盘上同步节点,但是我们仍建议使用固态硬盘。

顾名思义,阶段式同步需要依次执行 10 个阶段。

Turbo-Geth 客户端会向每个对等节点了解该节点的 HEAD 区块(即最新区块),然后依次执行每个阶段、寻找本地 HEAD 区块和对等节点的 HEAD 区块之间缺失的区块。

第一个阶段(下载区块头)会设置本地 HEAD 区块。

各阶段会按顺序执行。在每个阶段执行期间,只有节点本地的状态达到目标状态,该阶段才会结束。

也就是说,在理想情况下(没有出现网络中断、应用没有重启等问题),每个阶段只需执行一次,即可完成初始同步。

最后一阶段结束后,整个同步流程会重新开始,寻找新的区块头下载。

以太坊网络当前已销毁近330万枚ETH:金色财经报道,据Ultrasound数据显示,截止目前,以太坊网络总共销毁329

通过 ETL 进行预处理

在将数据插入数据库之前,一些阶段会使用我们的 ETL 框架根据键值对数据进行排序。

谷歌趋势:比特币和以太坊的搜索热度仍远低于2017年12月份:谷歌趋势数据显示,基于统计区间内的所有数值,目前Bitcoin和Ethereum的全球搜索热度分别为22和25,均远低于2017年12月份的最高数值100。不过,Bitcoin目前的搜索热度创下了自2018年4月份(18)以来新高。[2020/11/26 22:09:31]

这样就可以极大减少数据库写入放大(write amplification)的情况。

因此,当我们生成索引或者说哈希值化状态(Hashed State)时,我们会执行一个多步骤流程。

将处理过的数据写入位于数据目录的几个临时文件中;

然后使用一个堆栈(heap)把临时文件中的数据插入到数据库中,并且使按照能够最小化数据库写入放大现象的顺序插入数据。

这种优化有时会将写入速度提高几个数量级。

每个阶段都包含两个函数,分别是向前推进阶段的ExecFunc 和向后回退阶段的 UnwindFunc。

ETC 2020技术路线图公布:以太坊堆栈客户端Core-Geth完成开发:ETC核心开发团队(ETC Core)近日发布2020技术路线图。路线图显示,其协议团队开发完成了支持多种网络的Go语言以太坊堆栈客户端Core-Geth。同时,其EVM/编译器团队将在Q1-Q2完成SOLL和Vyper编译器集成,及全局堆栈分配和性能优化的实施。其工具团队于Q1完成了Signatory的发布,Signatory是EthereumStack的脱机交易和消息签署人,与任何基于EVM的网络兼容。[2020/3/4]

从理论上来说,部分阶段可以离线工作,但是当前版本并未实现这一功能。

阶段 1 :下载区块头

在这一阶段,我们会下载本地 HEAD 区块和对等节点的 HEAD 区块之间的所有区块头。

这一阶段是 CPU 密集型的,适合使用多核处理器,因为要验证区块头的工作量证明。

由于区块链重组,大多数回退都是在这一阶段开始的。

这一阶段会推动本地 HEAD 的指针(指向更新的区块)。

阶段 2 :区块哈希值

从区块头中抽取出一个从区块哈希值映射成区块号(blockHash -> blockNumber)的索引表,以支持更快速的查找功能,并让同步过程对机械硬盘更为友好。

阶段 3 :下载区块体

在这一阶段,我们会将上一阶段已下载区块头的区块体也下载下来。

这一阶段需要保持良好的联网连接。绝大多数数据都在这一阶段下载。

阶段 4 :复原发送者

这一阶段会复原出并存储每个已下载区块中的每笔交易的发送者。

这一阶段同样是 CPU 密集型的,适合使用多核处理器。

这一阶段不需要联网。

阶段 5 :执行区块

在这一阶段,我们会执行之前下载的所有区块中的每一笔交易。

需要注意的一点是,在执行区块的过程中,我们不会验证根哈希,甚至不会创建默克尔树。

这一阶段是单线程的,无需联网,需占用大量磁盘空间。如果区块执行失败,可以回退该阶段。

阶段 6 :计算状态根

这一阶段会构建默克尔树,并验证当前状态的根哈希。

这一阶段也会构建中间哈希值(Intermediate Hashes),并将它们存储到数据库中。

如果之前没有存储任何中间哈希值(这种情况可能在第一个初始同步期间发生),这一阶段会构建出完整的默克尔树及其根哈希。

如果数据库中没有中间哈希值,这一阶段就会利用区块的历史记录来弄清楚哪些哈希值已经过时,哪些哈希值是最新的,然后使用最新的哈希值来构建部分默克尔树,只重构过时的哈希值。

如果根哈希无法匹配,就会向后回退一个区块。

阶段 7 :生成哈希值化状态

在执行期间,Turbo-Geth 使用无格式状态存储(Plain state storage)。

无格式状态(Plain State):在标准状态(我们称之为 “哈希值化状态”)中,账户和存储项的地址是 keccak256(address) ,但是在一般状态中,二者的地址就是 address 。

尽管如此,为了确保一些 API 能够正常运作并与其它客户端保持兼容,我们也会生成哈希值化状态。

如果哈希值化状态不是空值,我们会查看历史记录变更集(History ChangeSet),并且只更新已更改的项。

这个阶段不需要联网。

阶段 8、9、10 :生成索引

同步期间会生成 3 个索引。

这 3 个索引可能会被禁用,因为所有 API 都不使用它们。

交易查询索引

该索引表由从交易哈希值到区块号的映射构成。

账户历史索引

该索引存储了从账户地址到区块列表(在这些区块中,该账户的状态有了更改)的映射。

存储历史索引

该索引存储了从存储项地址到区块列表(其中,该存储项在一定程度上有了更改)的映射。

在这一阶段,我们会启动交易池或更新其状态。例如,如果我们已下载的区块中包含了某些交易,就把这些交易从交易池中移除。

在回退时,我们会将被回退的区块中的交易重新添加到交易池中。

原文链接:

https://github.com/ledgerwatch/turbo-geth/tree/master/eth/stagedsync

作者: Alex Sharov

翻译&校对: 闵敏 & 阿剑

标签:NBSBSPETHHEADnbs币前景BSPAY价格GETHHEADZ币

以太坊热门资讯
谷燕西:美国数字金融的缓慢发展正在给瑞士创造条件

美国数字金融目前的发展可以说是落后于世界上其它一些领先的国家。譬如,在数字资产方面,泰国政府已经在2020年6月开始在区块链上销售政府发行的数字债券.

1900/1/1 0:00:00
金色趋势丨BTC近期有望迎来新的上涨行情

昨日联动黄金一波上拉下砸再拉升的动作,高倍杠杆爆仓无数,对于这种短线波动较大的行情,做单一定要谨慎,盘面上看,昨日一波下砸最低触及40日均线便被拉回,接近前期下砸低点位置,插针后快速回升.

1900/1/1 0:00:00
报告:八月加密衍生品交易量超过7100亿美元 创历史新高

来自CryptoComare的报告显示,8月份加密货币衍生品的交易量增长了54%,超过7100亿美元。报告认为,以比特币为代表的加密货币在8月份的优异表现推动了加密衍生品市场的繁荣.

1900/1/1 0:00:00
暴跌先兆?矿工前几日已开始大量地转移比特币

链上数据分析平台CryptoQuant称,大量矿池正在将比特币从矿池钱包转移到交易所。追踪比特币矿工流量数据的CryptoQuant显示,总共有超过11372个的比特币已经转移到各个交易所的钱包中.

1900/1/1 0:00:00
晚间必读5篇 | 除了Chainlink 预言机赛道还有谁?

研报:2020年Q2主流币种供应透明度一览本报告所涵盖的当前加密资产的概况反映了Coin Metrics管理自由浮动供应值的那些加密资产.

1900/1/1 0:00:00
一文读懂:太阳币SUN是什么?如何挖矿?

一向不负众望的孙宇晨孙哥在近期又要搞大动作了。8月31日,他在微博上发表了《就太阳币SUN创世挖矿致社区的一封信》.

1900/1/1 0:00:00