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

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

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

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

阶段式同步是如何运作的

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

第一个阶段会设置本地HEAD区块。

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

也就是说,在理想情况下,每个阶段只需执行一次,即可完成初始同步。

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

V神撰文介绍隐形地址概念以解决以太坊隐私保护难题:1月23日消息,以太坊联合创始人 Vitalik Buterin 近日发布新文章《隐形地址的不完整指南》,指出以太坊生态系统后续的最大挑战之一就是隐私,并提出隐形地址概念作为可能的隐私解决方案。该方案可能会使 P2P 交易、NFT 转移和 ENS 注册实现匿名化,从而起到用户保护作用。Vitalik Buterin 提出接收资产的用户可以生成并保存一个支出密钥,用于生成一个可以在 ENS 上注册的隐形元地址。该地址可以传递给交易发送者,发送者对元地址执行加密计算以生成一个属于接收者的隐形地址。发送方可以将资产转移到接收方的隐形地址,此外还可以发布临时密钥以确认隐形地址属于接收方,每个新交易都会生成一个新的隐形地址。

Vitalik Buterin指出除了实施密钥盲化机制之外,还需要采用Diffie-Hellman 密钥协议算法,以确保隐形地址和用户元地址之间的链接不会公开,并利用 ZK-SNARKs 技术转移资金支付 Gas 费。[2023/1/23 11:26:48]

如果你在两个阶段之间重启应用,应用会从第一阶段开始重启。

开放研究机构Flashbots发起人:已有27%以太坊算力支持Flashbots:开放研究机构Flashbots发起人之一、前Numerai架构师Stephane Gosselin发推称,以太坊算力已有27%支持Flashbots。

Flashbots由康奈尔大学研究员及Gas Token作者Phil Daian、海盗船社区发起人Tina Zhen、前Numerai架构师Stephane Gosselin、以太坊知名白帽Scott Bigelow及前Cambrial Capital联合创始人Alex Obadia协同二十余位以太坊社区研究员及白帽工程师,在Paradigm基金支持下共同发起成立,旨在针对以太坊及各智能合约公链所面对的MEV问题进行研究,并实施解决方案。[2021/4/5 19:46:33]

如果你在某个阶段执行期间重启应用,应用会从当前阶段开始重启,以完成该阶段。

Tether在以太坊网络增发1亿枚USDT(已授权未发行):据欧科云链OKLink数据显示,北京时间2021年03月15日21:57,Tether在以太坊网络增发1亿枚USDT。

交易哈希为:0x8d8e30a5c9357bced2c3bf0ba959078d46d5463c42ac09e47868ae952a946589

对此,Tether首席技术官PaoloArdoino表示,以太坊网络补充了1亿枚USDT的库存。这是一笔已授权但未发行的交易,意味着该金额将用作下一次发行请求和链互换的库存。[2021/3/16 18:47:17]

每个阶段需要耗时多久?

通过下方的饼状图,我们可以看出每个阶段的耗时占比。虽然这些数据并不精确,但是足以作为参考。

重组/回退

如果区块链发生重组,我们需要“回退”部分同步数据。

V神:以太坊一直努力支持更强隐私性 主网已做出改进:推特网友TruthRaider ?今日称,我对以太坊的主要抱怨是gas成本、不可伸缩性、缺乏隐私、集中化的ERC20代币等等。隐私是eth的一个主要缺陷,我希望他们能解决这个问题。对此V神刚刚回复称,你是否同意我们一直在努力支持更强的隐私性,甚至已经在主网上做出了这方面的改进?我相信我们可以做更多的事情。[2020/8/25]

回退指的是从最后一个阶段倒退回第一个阶段。但是,需要注意的一点是,我们执行完回退之后才会更新交易池,因此我们知道新的nonce。

回退的阶段顺序如下例所示。

state.unwindOrder=*Stage{

??//Unwindingoftxpool(reinjectingtransactionsintothepoolneedstohappenafterunwindingexecution)

动态 | 2019年以太坊矿工收入为比特币矿工的4倍:金色财经报道,根据Coin Metrics的报告,2019年,仅BTC每天就为矿工创造了1420万美元的收入,而以太坊平均每天创造了260万美元的收入。除了排名前2位的加密货币外,没有其他加密资产平均每天能产生超过90万美元的收益。[2020/1/3]

??stages,stages,stages,stages,stages,stages,stages,stages,stages,stages,

?}

通过?ETL?进行预处理

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

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

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

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

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

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

各阶段

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

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

阶段1:下载区块头

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

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

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

这一阶段会推动本地HEAD的指针。

阶段2:区块哈希值

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

阶段3:下载区块体

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

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

阶段4:复原发送者

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

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

这一阶段不需要联网。

阶段5:执行区块

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

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

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

阶段6:计算状态根

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

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

如果之前没有存储任何中间哈希值,这一阶段会构建出完整的默克尔树及其根哈希。

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

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

这一阶段不需要联网。

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

在执行期间,Turbo-Geth使用无格式状态存储。

无格式状态:在标准状态中,账户和存储项的地址是?keccak256(address)?,但是在一般状态中,二者的地址就是?address?。

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

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

这个阶段不需要联网。

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

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

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

这一阶段不需要联网。

交易查询索引

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

账户历史索引

该索引存储了从账户地址到区块列表的映射。

存储历史索引

该索引存储了从存储项地址到区块列表的映射。

阶段11:交易池

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

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

这个阶段不需要联网。

原文链接:

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

作者:?AlexSharov

翻译&校对:闵敏?&?阿剑

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

水星链

[0:31ms0-0:927ms