newsence

EVM 堆疊與記憶體使用統計報告

ethresear.ch·大約 1 個月前

本報告分析了以太坊主網上超過 200 萬次 EVM 調用,提供關於堆疊高度、記憶體分配和調用深度分佈的實證數據。研究結果顯示,絕大多數交易的運行遠低於 EVM 的理論資源限制,其中 90% 的調用使用的記憶體少於 1 KiB。

以太坊主網 | 1,297 個區塊 | 區塊高度 24,409,278–24,514,399

概覽

指標數值
分析區塊數1,297
區塊範圍24,409,278 – 24,514,399
EVM 呼叫總數2,092,522
交易總數255,696
平均每次交易呼叫數8.2
平均每個區塊呼叫數1613
平均每個區塊交易數197

1. EVM 堆疊高度 (項目數)

每次 EVM 呼叫中觀察到的最大操作數堆疊深度(每次呼叫取一個樣本)。

指標數值
樣本總數2,092,522
最小值0
p508
p7516
p9032
p9532
p9932
p99.964
最大值651

分佈

     0 |  153 (0.0%)
     1 |  0 (0.0%)
     2 | ██ 36,066 (1.7%)
     4 | ████████████████ 265,738 (12.7%)
     8 | ██████████████████████████████████████████████████ 795,021 (38.0%)
    16 | ████████████████████████████████████████████████ 763,410 (36.5%)
    32 | █████████████ 219,094 (10.5%)
    64 |  13,003 (0.6%)
   128 |  34 (0.0%)
   256 |  0 (0.0%)
   512 |  3 (0.0%)

累積分佈

< 1 | 0.0%
< 4 | 1.7%
< 8 | ███████ 14.4%
< 16 | ██████████████████████████ 52.4%
< 32 | ████████████████████████████████████████████ 88.9%
< 64 | █████████████████████████████████████████████████ 99.4%
< 128 | █████████████████████████████████████████████████ 100.0%


2. EVM 記憶體大小 (位元組)

每次 EVM 呼叫分配的最大記憶體(以位元組為單位)。

指標數值
樣本總數2,092,522
最小值0B
p50128B
p75256B
p90512B
p951KiB
p994KiB
p99.916KiB
最大值578.8KiB

分佈

    0B |  8,786 (0.4%)
   32B |  4,675 (0.2%)
   64B | ██████████████ 332,614 (15.9%)
  128B | ██████████████████████████████████████████████████ 1,168,239 (55.8%)
  256B | ██████████ 241,638 (11.5%)
  512B | █████ 132,630 (6.3%)
  1KiB | █████ 128,496 (6.1%)
  2KiB | ██ 48,946 (2.3%)
  4KiB |  17,222 (0.8%)
  8KiB |  6,135 (0.3%)
 16KiB |  1,869 (0.1%)
 32KiB |  411 (0.0%)
 64KiB |  599 (0.0%)
128KiB |  255 (0.0%)
256KiB |  4 (0.0%)
512KiB |  3 (0.0%)

累積分佈

< 1B | 0.4%
< 64B | 0.6%
< 128B | ████████ 16.5%
< 256B | ████████████████████████████████████ 72.4%
< 512B | █████████████████████████████████████████ 83.9%
< 1KiB | █████████████████████████████████████████████ 90.3%
< 2KiB | ████████████████████████████████████████████████ 96.4%
< 4KiB | █████████████████████████████████████████████████ 98.7%
< 8KiB | █████████████████████████████████████████████████ 99.6%
< 16KiB | █████████████████████████████████████████████████ 99.8%
< 32KiB | █████████████████████████████████████████████████ 99.9%
< 64KiB | █████████████████████████████████████████████████ 100.0%


3. 交易呼叫深度

每次交易的最大呼叫嵌套深度(每次交易取一個樣本)。

指標數值
樣本總數255,696
最小值0
p501
p752
p904
p954
p998
p99.98
最大值35

分佈

     0 | ██████████████████████████████████████████████████ 116,269 (45.5%)
     1 | ██████████████████████████ 61,369 (24.0%)
     2 | █████████████████ 40,994 (16.0%)
     4 | ████████████ 29,283 (11.5%)
     8 | ███ 7,547 (3.0%)
    16 |  233 (0.1%)
    32 |  1 (0.0%)

累積分佈

< 1 | ██████████████████████ 45.5%
< 2 | ██████████████████████████████████ 69.5%
< 4 | ██████████████████████████████████████████ 85.5%
< 8 | ████████████████████████████████████████████████ 97.0%
< 16 | █████████████████████████████████████████████████ 99.9%
< 32 | █████████████████████████████████████████████████ 100.0%


4. 交易峰值堆疊 (項目數)

交易過程中所有活動呼叫幀的峰值總計堆疊項目數(每次交易取一個樣本)。

指標數值
樣本總數255,696
最小值0
p5016
p7532
p9064
p95128
p99128
p99.9256
最大值664

分佈

     0 |  153 (0.1%)
     1 |  0 (0.0%)
     2 | ██ 6,900 (2.7%)
     4 | ██ 6,704 (2.6%)
     8 | ██ 7,128 (2.8%)
    16 | ██████████████████████████████████████████████████ 140,607 (55.0%)
    32 | ██████████ 30,782 (12.0%)
    64 | ████████████████ 45,555 (17.8%)
   128 | █████ 16,426 (6.4%)
   256 |  1,434 (0.6%)
   512 |  7 (0.0%)

累積分佈

< 1 | 0.1%
< 4 | █ 2.8%
< 8 | ██ 5.4%
< 16 | ████ 8.2%
< 32 | ███████████████████████████████ 63.2%
< 64 | █████████████████████████████████████ 75.2%
< 128 | ██████████████████████████████████████████████ 93.0%
< 256 | █████████████████████████████████████████████████ 99.4%
< 512 | █████████████████████████████████████████████████ 100.0%


5. 交易峰值記憶體 (位元組)

交易過程中所有活動呼叫幀的峰值總計記憶體(每次交易取一個樣本)。

指標數值
樣本總數255,696
最小值0B
p50256B
p751KiB
p904KiB
p958KiB
p9916KiB
p99.9128KiB
最大值584.2KiB

分佈

    0B | ███ 6,168 (2.4%)
   32B |  93 (0.0%)
   64B | ████ 9,477 (3.7%)
  128B | ██████████████████████████████████████████████████ 95,450 (37.3%)
  256B | █████████████████████████████ 56,335 (22.0%)
  512B | █████ 11,236 (4.4%)
  1KiB | ██████████ 19,891 (7.8%)
  2KiB | ████████████ 24,416 (9.5%)
  4KiB | █████████ 18,152 (7.1%)
  8KiB | ████ 8,852 (3.5%)
 16KiB | █ 3,602 (1.4%)
 32KiB |  1,250 (0.5%)
 64KiB |  392 (0.2%)
128KiB |  247 (0.1%)
256KiB |  131 (0.1%)
512KiB |  4 (0.0%)

累積分佈

< 1B | █ 2.4%
< 128B | ███ 6.2%
< 256B | █████████████████████ 43.5%
< 512B | ████████████████████████████████ 65.5%
< 1KiB | ██████████████████████████████████ 69.9%
< 2KiB | ██████████████████████████████████████ 77.7%
< 4KiB | ███████████████████████████████████████████ 87.2%
< 8KiB | ███████████████████████████████████████████████ 94.3%
< 16KiB | ████████████████████████████████████████████████ 97.8%
< 32KiB | █████████████████████████████████████████████████ 99.2%
< 64KiB | █████████████████████████████████████████████████ 99.7%
< 128KiB | █████████████████████████████████████████████████ 99.9%
< 512KiB | █████████████████████████████████████████████████ 100.0%


核心結論

  • 堆疊 (Stack): 88.9% 的 EVM 呼叫使用少於 32 個堆疊項目。p99 = 32,觀察到的最大值 = 651(EVM 限制為 1024)。

  • 記憶體 (Memory): 90.3% 的 EVM 呼叫使用少於 1 KiB 的記憶體。p99 = 4KiB,觀察到的最大值 = 578.8KiB。

  • 呼叫深度 (Call depth): 45.5% 的交易沒有進行內部呼叫。85.5% 的深度保持在 4 以下。觀察到的最大值 = 35。

  • 交易峰值堆疊: p50 = 16,p99 = 128,觀察到的最大值 = 664。

  • 交易峰值記憶體: p50 = 256B,p99 = 16KiB,觀察到的最大值 = 584.2KiB。

  • 每次交易呼叫數: 中位數 7.7,最小值 1.0,跨區塊最大值 253.6。


研究方法

數據是透過對 Zilkworm 的 EVM 執行過程進行檢測收集而來。

指標說明

  • 堆疊高度 (Stack height) — 單次 EVM 呼叫中觀察到的最大 EVM 操作數堆疊項目數量。每次呼叫取一個樣本。

  • 記憶體大小 (Memory size) — 單次 EVM 呼叫中分配的最大 EVM 記憶體(以位元組為單位)。每次呼叫取一個樣本。

  • 呼叫深度 (Call depth) — 交易過程中達到的最大 CALL/CREATE 嵌套深度。每次交易取一個樣本。

  • 交易峰值堆疊 (Tx peak stack) — 交易過程中所有活動呼叫幀的峰值總計堆疊項目數。每次交易取一個樣本。

  • 交易峰值記憶體 (Tx peak memory) — 交易過程中所有活動呼叫幀的峰值總計記憶體(以位元組為單位)。每次交易取一個樣本。

HDR 直方圖

數值使用 log2 分桶記錄到 HDR (高動態範圍) 直方圖中。這是 Gil Tene 的 HdrHistogram 的簡化變體,每個 2 的冪次方為一個桶:

  • 桶 0:數值 = 0

  • i (i > 0):數值範圍在 [2^(i−1), 2^i)

這提供了 21 個桶,涵蓋從 0 到超過 100 萬的數值,並具有恆定的相對誤差:每個桶跨越 2 倍的範圍。

百分位數估計

百分位數 (p50, p75, p90, p95, p99, p99.9) 是從直方圖桶計數中計算出的近似值。對於給定的百分位數 p,我們找到第一個累積計數達到 p × N(其中 N 是總樣本數)的桶,並將該桶的下界報告為百分位數值。這意味著報告的百分位數可能會低估真實值,誤差最高可達 2 倍(即一個桶的寬度)。最小值和最大值則是精確追蹤的。

        1 則貼文 - 1 位參與者

        [閱讀完整主題](https://ethresear.ch/t/evm-stack-and-memory-usage-statistics-report/24209)
https://ethresear.ch/t/evm-stack-and-memory-usage-statistics-report/24209