其他
引介 | 准无状态下的同步实验
本实验用到的原始数据和脚本:
https://github.com/mandrigin/ethereum-mainnet-resolver-witness-stats
引言
有一种办法也许能加速初始同步过程(initial sync process,指从创世块开始的区块链同步),就是使用区块见证数据(witness)预先建构出缓存树(cache trie),来避免速度较慢的状态访问。这样做需要额外占用硬盘空间和网络带宽,但也许可以大幅加速同步过程。
其中的原理是,一般来说,要执行一个区块,我们就需要默克尔树上的一些数据。虽然在某个块执行以前,默克尔树上已经有一些数据了,但这些数据可能不足以执行区块。所以,正常来说,我们还要从状态数据库(state db)中提取出数据并加到默克尔树上,然后才能验证交易。这个过程可能会很慢,因为 硬盘访问/数据库查询 的速度比较慢。
根据这个问题描述,我们可以划分出三种不同的方案:
1)正常流程(也就是当前在以太坊节点中使用的方案)
在区块 B 执行以前,我们有状态树 T1; 在需要执行 B 的时候,我们把 T1 中遗漏的数据添加到 T1 上,形成 T1',T1'',等等。每次遇到 T1 上没有的信息,我们就在数据库中查找(速度慢)。 执行完 B 之后,我们有了状态树 T2,T2 具备执行 B 所需的所有账户状态。 保持 T2,以备后续使用。
在区块 B 执行以前,我们并没有状态树;不过,我们可以拿到一个见证数据 W,来重组执行这个区块所需的状态树。 我们执行 W,获得了状态树 T2。 在 T2 上执行区块 B,不需要查找数据库。 区块执行完之后就把 T2 丢掉。
在区块 B 执行之前,我们有状态树 T1,见证数据 W1、W2、……,足以将 T1 转成 T2 依次在 T1 上执行 W1、W2、……,最后获得 T2,也不需要查询数据库。 在 T2 上执行区块 B,也不需要查询数据库。 留着 T2 以备后续使用。
这一方法需要额外占用多少 硬盘/带宽?与完全富状态的方法相比,它真的更好吗? 其初始同步速度会快多少?
建立实验
状态树(默克尔树)的最大规模:100 万个 node。一旦节点数超过这个值,我们就驱逐 LRU 节点,以释放内存。用这种办法,我们就能控制状态树对内存的使用。 部分见证数据会存储在数据库中(我们用的是 boltdb)。每个条目的结构如下:
key: [12]byte // 区块号 + 状态树上节点的最大数量
value: []byte // 见证数据,按文档中的描述予以序列化
我们不会在见证数据里存储合约代码(这是我们当前架构的不足)。
(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 \
实验结果
存储
见证数据大小的分位数分析
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
正常情况下的数据大小(解决上海攻击之后的阶段)
absolute_values_plot.py cache_1_000_000/semi_stateless_witnesses.db.stats.1.csv 3000000
放大看 DDoS 攻击时期的见证数据大小
python ddos_zoom.py cache_1_000_000/semi_stateless_witnesses.db.stats.1.csv
完全无状态 vs. 准无状态 下见证数据的大小
python full_vs_semi.py cache_1_000_000/semi_stateless_witnesses.db.stats.1.csv
结论
(完)
(文内有许多超链接,可点击左下 ”阅读原文“ 从 EthFans 网站上获取)
原文链接:
https://medium.com/@mandrigin/semi-stateless-initial-sync-experiment-897cc9c330cb
作者: Igor Mandrigin
你可能还喜欢: