快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

金尊国际 用户登录:准无状态下的同步实验。



小序

有一种法子大概能加速初始同步历程(initial sync process,指从创世块开始的区块链同步),便是应用区块见证数据(witness)预先建构出缓存树(cache trie),来避免速率较慢的状态造访。这样做必要额外占用硬盘空间和收集带宽,但大概可以大年夜幅加速同步历程。

此中的道理是,一样平常来说,要履行一个区块,我们就必要默克尔树上的一些数据。虽然在某个块履行曩昔,默克尔树上已经有一些数据了,但这些数据可能不够以履行区块。以是,正常来说,我们还要从状态数据库(state db)中提掏出数据并加到默克尔树上,然后才能验证买卖营业。这个历金尊国际 用户登录程可能会很慢,由于 硬盘造访/数据库查询 的速率对照慢。

根据这个问题描述,我们可以划分出三种不合的规划:

1)正常流程(也便是当前在以太坊节点中应用的规划)

在区块 B 履行曩昔,我们有状态树 T1;

在必要履行 B 的时刻,我们把 T1 中漏掉的数据添加到 T1 上,形成 T1',T1'',等等。每次碰到 T1 上没有的信息,我们就在数据库中查找(速率慢)。

履行完 B 之后,我们有了状态树 T2,T2 具备履行 B 所需的所有账户状态。

维持 T2,以备后续应用。

2)无状态流程

在区块 B 履行曩昔,我们并没有状态树;不过,我们可以拿到一个见证数据 W,来重组履行这个区块所需的状态树。

我们履行 W,得到了状态树 T2。

在 T2 上履行区块 B,不必要查找数据库。

区块履行完之后就把 T2 损掉落。

3)准无状态流程(semi-stateless folw)(即本实验要测试的规划)

· 在区块 B 履行之前,我们有状态树 T1,见证数据 W1、W2、……,足以将 T1 转成 T2

· 依次在 T1 上履行 W1、W2、……,着末得到 T2,也不必要查询数据库。

· 在 T2 上履行区块 B,也不必要查询数据库。

· 留着 T2 以备后续应用。

在初始同步中应用准无状态流程可以得到无状态流程的大年夜部分好处 †,又不必要传输那么多半据,由于我们重用了状态树缓存。

† 在准无状态规划中,区块的并行履行会受到更大年夜的限定

那么,为了测试准无状态规划的机能,我们必要丈量两件事:

· 这一措施必要额外占用若干 硬盘/带宽?与完全富状态的措施比拟,它真的更好吗?

· 其初始同步速率会快若干?

本文中我们会合中测金尊国际 用户登录试硬盘需求。

建立实验

· 状态树(默克尔树)的最大年夜规模:10金尊国际 用户登录0 万个 node。一旦节点数跨越这个值,我们就驱逐 LRU 节点,以开释内存。用这种法子,我们就能节制状态树对内存的应用。

· 部分见证数据会存储在数据库中(我们用的是 boltdb)。每个条款的布局如下:

key: [12]byte // 区块号 + 状态树上节点的最大年夜数量

value: []byte // 见证数据,按文档中的描述予以序列化

· 我们不会在见证数据里存储合约代码(这是我们当前架构的不够)。

数据按下述措施获得(必要一个同步好的 turbo-geth 节点)

(in the turbo-geth repository)

make state

./build/bin/state stateless \

— chaindata ~/nvme1/mainnet/mainnet/geth/chaindata \

— statefile semi_stateless.statefile \

— snapshotInterval 1000000 \

— snapshotFrom 10000000 \

— statsfile new_witness.stats.compressed.2.csv \

— witnessDbFile semi_stateless_witnesses.db \

— statelessResolver \

— triesize 1000000 \

实验结果

存储

从创世块开始同步 6, 169, 246 (619 万)区块,见证数据的数据库(bolt db)达到了 99GB。

见证数据大年夜小的分位数阐发

python quantile-analysis.py cache_1_000_金尊国际 用户登录000/semi_stateless_witnesses.db.stats.1.csv

匀称值 0.038 MB

中值 0.028 MB

90 分位值 0.085 MB

95 分位值 0.102 MB

99 分位值 0.146 MB

最大年夜值 2.350 MB

数据大年夜小

python absolute_values_plot.py cache_1_000_000/semi_stateless_witnesses.db.stats.1.csv

从创世块到 610 万区块高度的阶段的见证数据大年夜小,图表在 1MB 处截顶了。按 1024 个块取滑动匀称值。

正常环境下的数据大年夜小(办理上海进击之后的阶段)

absolute_values_plot.py cache_1_000_000/semi_stateless_witnesses.db.stats.1.csv 3000000

办理上海 DDoS 进击之后的见证数据大年夜小,按 1024 个区块取滑动匀称值。

放大年夜看 DDoS 进击时期的见证数据大年夜小

python ddos_zoom.py cache_1_000_000/semi_stateless_witnesses.db.stats.1.csv

放大年夜看 DDoS 进击对见证数据大年夜小的影响(原始数据)。

可以看到,在 230 万高度到 250 万高度,以及 265 万高度到 275 万高度时代,见证数据的大年夜小显明增大年夜。

完全无状态 vs. 准无状态 下见证数据的大年夜小

python full_vs_semi.py cache_1_000_000/semi_stateless_witnesses.db.stats.1.csv

完全无状态下的见证数据大年夜小是根据准无状态下的见证数据加上缺掉的合约代码部分调剂得来的.

从这张图可以看出,应用准无状态措施,可以节约大年夜量数据(与完全无状态措施比拟)。

结论

加上一个无状态解析器会让每个区块必要 传输/存储 的数据量增添 0.金尊国际 用户登录4 MB。这个值与按区块供给见证数据比拟,节约太多,纵然算上我们改变状态树模式能够获得的增益比拟,也节约异常多(关于十六进制树和二进制树模式下见证数据大年夜小的区块,可见我的上一篇文章)(译者注:中译本见文末超链接)。

假如这个机能还算可以,那么它显然是加速初始同步的好法子;而且它的数据需求比完全无状态措施更小。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: