Skip to content

feat(evm_interpreter): add MULMOD fast paths for modulus = 1 and 2^256-1#647

Open
0xVolosnikov wants to merge 1 commit into
draft-0.4.0from
vv-mulmod-fast-paths
Open

feat(evm_interpreter): add MULMOD fast paths for modulus = 1 and 2^256-1#647
0xVolosnikov wants to merge 1 commit into
draft-0.4.0from
vv-mulmod-fast-paths

Conversation

@0xVolosnikov
Copy link
Copy Markdown
Contributor

What ❔

Add two new fast paths to the EVM MULMOD handler in addition to the existing modulus = 0 short-circuit:

  1. modulus = 1 — result is always 0 per EVM spec. Skip both the widening mul and the oracle-backed wide div_rem.
  2. modulus = 2^256 - 1 (U256::MAX) — use the identity
    (a * b) mod (2^256 - 1)  ≡  (lo + hi) mod (2^256 - 1)
    
    where (lo, hi) is the widening product, since 2^256 ≡ 1 (mod 2^256 - 1). One carry-aware add reduces, with a final normalization step mapping 2^256 - 1 to 0. Skips the oracle-backed wide div_rem on hit.

The reduction math is extracted into a free reduce_mod_max helper and unit-tested against ruint's mul_mod reference across edge-case inputs (zero, one, half_max, U256::MAX, mixed-limb patterns).

Why ❔

MULMOD is one of the more expensive opcodes in the interpreter (~11% of opcode-sampled cycles before this change). The oracle-backed wide_div_rem is fast in the average case but disproportionately expensive when the modulus has a trivial structure. modulus = 2^256 - 1 is a common pattern in math libraries that implement custom field arithmetic, hashing-style constructions, or RNGs, and there is no reason to pay for a full quotient-remainder verification when a single carry-aware add suffices.

Benchmark

bench_scripts/bench.sh compare, baseline = custom-u256 at HEAD:

Block Base Eff Head Eff Δ
block_19299001 210,919,986 210,833,528 −0.04% (−86K cycles)
block_22244135 139,505,975 139,505,573 ~0% (flat)

Per-opcode (block_19299001, 3372 MULMOD executions):

  • MULMOD median cycles: −7.4% (raw saving from MAX-modulus hits)
  • MULMOD total cycles: −7.1% (−96K raw cycles)
  • Bigint delegations: +0.03% — the is_one() check adds one delegation per non-zero MULMOD call; mostly absorbed by the savings from MAX hits skipping wide_div_rem.

The benchmark blocks happen not to exercise modulus = 2^256 - 1 heavily (estimated ~1% hit rate on block_19299001). Workloads that lean on mulmod(a, b, ~0) patterns should see proportionally larger gains.

Is this a breaking change?

  • Yes
  • No

No protocol-visible behavior change. Gas and native cost charging are unchanged. The fast-path result is provably congruent to the existing wide_div_rem result, verified by:

  • Mathematical derivation in the helper's docstring (2^256 ≡ 1 (mod 2^256 - 1)).
  • New unit test reduce_mod_max_matches_ruint_reference that compares against ruint's reference mul_mod over 49 (a, b) combinations spanning edge cases.

Note: op3 = 1 and op3 = U256::MAX would also be handled correctly by the existing wide_div_rem path; these are pure optimizations, not correctness fixes.

Checklist

  • PR title corresponds to the body of PR (we generate changelog entries from PRs).
  • Tests for the changes have been added / updated.
    • New unit test in evm_interpreter::instructions::arithmetic::tests verifying the reduce_mod_max helper against ruint's mul_mod. Verified locally: cargo test -p evm_interpreter --features testing (14/14, including the new test), tests/instances/evm rig (14/14).
  • Documentation comments have been added / updated.
  • Code has been formatted.

🤖 Generated with Claude Code

@0xVolosnikov 0xVolosnikov requested a review from ly0va May 13, 2026 21:27
Base automatically changed from custom-u256 to draft-0.4.0 May 14, 2026 21:27
@0xVolosnikov 0xVolosnikov force-pushed the vv-mulmod-fast-paths branch from e06a0bf to 4684546 Compare May 15, 2026 12:43
@0xVolosnikov 0xVolosnikov requested a review from Copilot May 19, 2026 13:16
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR optimizes the EVM interpreter’s MULMOD handling by adding fast paths for trivial moduli while preserving protocol behavior and gas/native-cost charging.

Changes:

  • Adds a modulus = 1 short-circuit returning zero.
  • Adds a modulus = U256::MAX reduction helper using the 2^256 ≡ 1 identity.
  • Adds unit coverage comparing the new reduction helper against ruint’s mul_mod.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@0xVolosnikov 0xVolosnikov requested a review from AntonD3 May 19, 2026 14:54
MULMOD currently has only one fast path (modulus = 0). Two more cases are
worth special-casing:

- modulus = 1: result is always 0 by EVM spec. Skip the widening_mul and
  oracle-backed wide div_rem.

- modulus = 2^256 - 1 (U256::MAX): use the identity
    (a*b) mod (2^256 - 1) ≡ (lo + hi) mod (2^256 - 1)
  where (lo, hi) is the widening product, since 2^256 ≡ 1 (mod 2^256 - 1).
  One carry-aware add reduces, with a final normalization mapping 2^256 - 1
  to 0. This skips the oracle-backed wide div_rem path entirely on hit.

The reduction math is extracted into a free `reduce_mod_max` helper and unit
tested against ruint's `mul_mod` reference across edge cases (zero, one,
half_max, U256::MAX, mixed limbs).

Benchmark (bench_scripts/bench.sh compare against custom-u256 baseline):
- block_19299001 process_block: -0.04% effective (-86K cycles)
- block_22244135 process_block: ~0% (flat)
- MULMOD median: 403 -> 373 cycles (-7.4%)
- MULMOD total: -7.1% (-96K raw cycles on block_19299001)
- Bigint delegations: +0.03% (is_one() check adds one delegation per call,
  partly offset by MAX hits skipping wide div_rem)

The benchmark blocks don't heavily exercise modulus=2^256-1 (~1% hit rate
on block_19299001). Workloads that use math libraries with mulmod(a, b, ~0)
patterns should see larger gains.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@0xVolosnikov 0xVolosnikov force-pushed the vv-mulmod-fast-paths branch from 4684546 to e018ece Compare May 29, 2026 20:28
@github-actions
Copy link
Copy Markdown
Contributor

Block-level effective cycles

Average across all block fixtures (process_block). Per-block breakdown below.

Benchmark Symbol Base Eff Head Eff (%) Base Raw Head Raw (%) Base Blake Head Blake (%) Base Bigint Head Bigint (%) Base Keccak Head Keccak (%)
all blocks (keccak DA) process_block 653,615,266 653,050,705 (-0.09%) 521,930,182 521,367,667 (-0.11%) 781,526 781,526 (+0.00%) 23,323,469 23,322,958 (-0.00%) 6,471,698 6,471,698 (+0.00%)
all blocks (blobs DA) process_block 701,866,111 701,301,550 (-0.08%) 559,084,359 558,521,843 (-0.10%) 791,605 791,605 (+0.00%) 26,365,011 26,364,500 (-0.00%) 6,164,007 6,164,007 (+0.00%)
Per-block effective cycles
Benchmark Symbol Base Eff Head Eff (%) Base Raw Head Raw (%) Base Blake Head Blake (%) Base Bigint Head Bigint (%) Base Keccak Head Keccak (%)
block_25188855 (keccak DA) process_block 237,657,747 237,463,455 (-0.08%) 184,564,543 184,373,259 (-0.10%) 498,230 498,230 (+0.00%) 8,457,231 8,456,479 (-0.01%) 2,823,150 2,823,150 (+0.00%)
block_25188855 (blobs DA) process_block 286,593,796 286,399,504 (-0.07%) 221,896,328 221,705,044 (-0.09%) 502,810 502,810 (+0.00%) 11,479,512 11,478,760 (-0.01%) 2,683,615 2,683,615 (+0.00%)
block_25188862 (keccak DA) process_block 549,525,194 549,129,491 (-0.07%) 421,362,246 420,975,335 (-0.09%) 831,340 831,340 (+0.00%) 22,892,549 22,890,351 (-0.01%) 5,822,828 5,822,828 (+0.00%)
block_25188862 (blobs DA) process_block 598,065,527 597,669,824 (-0.07%) 458,731,071 458,344,160 (-0.08%) 841,550 841,550 (+0.00%) 25,956,106 25,953,908 (-0.01%) 5,511,308 5,511,308 (+0.00%)
block_25188863 (keccak DA) process_block 229,913,146 229,717,407 (-0.09%) 177,029,506 176,836,135 (-0.11%) 419,790 419,790 (+0.00%) 8,150,725 8,150,133 (-0.01%) 3,391,025 3,391,025 (+0.00%)
block_25188863 (blobs DA) process_block 279,011,984 278,816,245 (-0.07%) 214,500,872 214,307,501 (-0.09%) 424,750 424,750 (+0.00%) 11,188,970 11,188,378 (-0.01%) 3,239,808 3,239,808 (+0.00%)
block_25188937 (keccak DA) process_block 720,636,582 719,787,635 (-0.12%) 566,510,310 565,675,763 (-0.15%) 1,209,910 1,209,910 (+0.00%) 21,884,022 21,880,422 (-0.02%) 11,807,906 11,807,906 (+0.00%)
block_25188937 (blobs DA) process_block 767,802,154 766,953,207 (-0.11%) 603,146,270 602,311,723 (-0.14%) 1,224,860 1,224,860 (+0.00%) 24,913,521 24,909,921 (-0.01%) 11,351,010 11,351,010 (+0.00%)
block_25188945 (keccak DA) process_block 421,930,894 421,449,623 (-0.11%) 341,291,474 340,817,051 (-0.14%) 930,920 930,920 (+0.00%) 11,233,142 11,231,430 (-0.02%) 5,203,033 5,203,033 (+0.00%)
block_25188945 (blobs DA) process_block 469,735,767 469,254,496 (-0.10%) 378,396,423 377,922,000 (-0.13%) 945,470 945,470 (+0.00%) 14,294,488 14,292,776 (-0.01%) 4,758,468 4,758,468 (+0.00%)
block_25188950 (keccak DA) process_block 538,248,623 537,787,336 (-0.09%) 433,143,227 432,683,696 (-0.11%) 659,000 659,000 (+0.00%) 19,210,924 19,210,485 (-0.00%) 4,429,425 4,429,425 (+0.00%)
block_25188950 (blobs DA) process_block 587,289,794 586,828,507 (-0.08%) 470,656,926 470,197,395 (-0.10%) 665,270 665,270 (+0.00%) 22,259,167 22,258,728 (-0.00%) 4,237,970 4,237,970 (+0.00%)
block_25189014 (keccak DA) process_block 379,907,714 379,567,452 (-0.09%) 296,127,822 295,791,992 (-0.11%) 577,680 577,680 (+0.00%) 13,434,465 13,433,357 (-0.01%) 5,199,788 5,199,788 (+0.00%)
block_25189014 (blobs DA) process_block 428,986,903 428,646,641 (-0.08%) 333,597,727 333,261,897 (-0.10%) 582,880 582,880 (+0.00%) 16,474,342 16,473,234 (-0.01%) 5,041,432 5,041,432 (+0.00%)
block_25189128 (keccak DA) process_block 426,196,711 425,735,525 (-0.11%) 342,425,715 341,974,153 (-0.13%) 773,970 773,970 (+0.00%) 11,463,305 11,460,899 (-0.02%) 6,383,564 6,383,564 (+0.00%)
block_25189128 (blobs DA) process_block 474,334,839 473,873,653 (-0.10%) 379,623,879 379,172,317 (-0.12%) 786,150 786,150 (+0.00%) 14,521,453 14,519,047 (-0.02%) 6,011,687 6,011,687 (+0.00%)
block_25189151 (keccak DA) process_block 732,173,781 731,530,407 (-0.09%) 556,213,169 555,585,891 (-0.11%) 1,085,470 1,085,470 (+0.00%) 29,031,931 29,027,907 (-0.01%) 10,616,342 10,616,342 (+0.00%)
block_25189151 (blobs DA) process_block 779,212,290 778,568,916 (-0.08%) 592,997,650 592,370,372 (-0.11%) 1,104,220 1,104,220 (+0.00%) 32,092,856 32,088,832 (-0.01%) 10,043,924 10,043,924 (+0.00%)
block_25189153 (keccak DA) process_block 2,299,962,265 2,298,338,723 (-0.07%) 1,900,633,813 1,898,963,391 (-0.09%) 828,950 828,950 (+0.00%) 87,476,392 87,488,112 (+0.01%) 9,039,921 9,039,921 (+0.00%)
block_25189153 (blobs DA) process_block 2,347,628,053 2,346,004,511 (-0.07%) 1,937,296,445 1,935,626,023 (-0.09%) 838,090 838,090 (+0.00%) 90,469,691 90,481,411 (+0.01%) 8,760,851 8,760,851 (+0.00%)
Block-level sub-phases
Benchmark Symbol Base Eff Head Eff (%) Base Raw Head Raw (%) Base Blake Head Blake (%) Base Bigint Head Bigint (%) Base Keccak Head Keccak (%)
block_25188855 (blobs DA) blob_versioned_hash 49,929,644 49,929,644 (+0.00%) 37,767,240 37,767,240 (+0.00%) 4,580 4,580 (+0.00%) 3,022,281 3,022,281 (+0.00%) 0 0 (+0.00%)
block_25188862 (blobs DA) blob_versioned_hash 50,786,889 50,786,889 (+0.00%) 38,369,301 38,369,301 (+0.00%) 10,210 10,210 (+0.00%) 3,063,557 3,063,557 (+0.00%) 0 0 (+0.00%)
block_25188863 (blobs DA) blob_versioned_hash 50,175,573 50,175,573 (+0.00%) 37,943,233 37,943,233 (+0.00%) 4,960 4,960 (+0.00%) 3,038,245 3,038,245 (+0.00%) 0 0 (+0.00%)
block_25188937 (blobs DA) blob_versioned_hash 50,405,427 50,405,427 (+0.00%) 38,048,231 38,048,231 (+0.00%) 14,950 14,950 (+0.00%) 3,029,499 3,029,499 (+0.00%) 0 0 (+0.00%)
block_25188945 (blobs DA) blob_versioned_hash 50,921,583 50,921,583 (+0.00%) 38,443,399 38,443,399 (+0.00%) 14,550 14,550 (+0.00%) 3,061,346 3,061,346 (+0.00%) 0 0 (+0.00%)
block_25188950 (blobs DA) blob_versioned_hash 50,411,534 50,411,534 (+0.00%) 38,118,242 38,118,242 (+0.00%) 6,270 6,270 (+0.00%) 3,048,243 3,048,243 (+0.00%) 0 0 (+0.00%)
block_25189014 (blobs DA) blob_versioned_hash 50,211,526 50,211,526 (+0.00%) 37,968,818 37,968,818 (+0.00%) 5,200 5,200 (+0.00%) 3,039,877 3,039,877 (+0.00%) 0 0 (+0.00%)
block_25189128 (blobs DA) blob_versioned_hash 50,778,496 50,778,496 (+0.00%) 38,351,024 38,351,024 (+0.00%) 12,180 12,180 (+0.00%) 3,058,148 3,058,148 (+0.00%) 0 0 (+0.00%)
block_25189151 (blobs DA) blob_versioned_hash 51,110,387 51,110,387 (+0.00%) 38,566,687 38,566,687 (+0.00%) 18,750 18,750 (+0.00%) 3,060,925 3,060,925 (+0.00%) 0 0 (+0.00%)
block_25189153 (blobs DA) blob_versioned_hash 49,654,213 49,654,213 (+0.00%) 37,534,777 37,534,777 (+0.00%) 9,140 9,140 (+0.00%) 2,993,299 2,993,299 (+0.00%) 0 0 (+0.00%)
block_25188855 (blobs DA) da_commitment 2,520,840 2,520,840 (+0.00%) 2,408,840 2,408,840 (+0.00%) 7,000 7,000 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188855 (keccak DA) da_commitment 3,513,442 3,513,442 (+0.00%) 2,845,898 2,845,898 (+0.00%) 7,000 7,000 (+0.00%) 0 0 (+0.00%) 138,886 138,886 (+0.00%)
block_25188862 (blobs DA) da_commitment 5,542,919 5,542,919 (+0.00%) 5,290,119 5,290,119 (+0.00%) 15,800 15,800 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188862 (keccak DA) da_commitment 7,785,080 7,785,080 (+0.00%) 6,288,796 6,288,796 (+0.00%) 15,800 15,800 (+0.00%) 0 0 (+0.00%) 310,871 310,871 (+0.00%)
block_25188863 (blobs DA) da_commitment 2,557,099 2,557,099 (+0.00%) 2,441,579 2,441,579 (+0.00%) 7,220 7,220 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188863 (keccak DA) da_commitment 3,629,435 3,629,435 (+0.00%) 2,911,643 2,911,643 (+0.00%) 7,220 7,220 (+0.00%) 0 0 (+0.00%) 150,568 150,568 (+0.00%)
block_25188937 (blobs DA) da_commitment 7,684,897 7,684,897 (+0.00%) 7,328,897 7,328,897 (+0.00%) 22,250 22,250 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188937 (keccak DA) da_commitment 10,920,391 10,920,391 (+0.00%) 8,739,403 8,739,403 (+0.00%) 22,250 22,250 (+0.00%) 0 0 (+0.00%) 456,247 456,247 (+0.00%)
block_25188945 (blobs DA) da_commitment 6,766,623 6,766,623 (+0.00%) 6,450,463 6,450,463 (+0.00%) 19,760 19,760 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188945 (keccak DA) da_commitment 9,878,984 9,878,984 (+0.00%) 7,787,160 7,787,160 (+0.00%) 19,760 19,760 (+0.00%) 0 0 (+0.00%) 443,916 443,916 (+0.00%)
block_25188950 (blobs DA) da_commitment 3,338,915 3,338,915 (+0.00%) 3,188,995 3,188,995 (+0.00%) 9,370 9,370 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188950 (keccak DA) da_commitment 4,700,642 4,700,642 (+0.00%) 3,787,498 3,787,498 (+0.00%) 9,370 9,370 (+0.00%) 0 0 (+0.00%) 190,806 190,806 (+0.00%)
block_25189014 (blobs DA) da_commitment 2,978,030 2,978,030 (+0.00%) 2,850,670 2,850,670 (+0.00%) 7,960 7,960 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189014 (keccak DA) da_commitment 4,106,010 4,106,010 (+0.00%) 3,347,822 3,347,822 (+0.00%) 7,960 7,960 (+0.00%) 0 0 (+0.00%) 157,707 157,707 (+0.00%)
block_25189128 (blobs DA) da_commitment 6,135,237 6,135,237 (+0.00%) 5,844,517 5,844,517 (+0.00%) 18,170 18,170 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189128 (keccak DA) da_commitment 8,771,258 8,771,258 (+0.00%) 6,995,626 6,995,626 (+0.00%) 18,170 18,170 (+0.00%) 0 0 (+0.00%) 371,228 371,228 (+0.00%)
block_25189151 (blobs DA) da_commitment 8,058,835 8,058,835 (+0.00%) 7,691,795 7,691,795 (+0.00%) 22,940 22,940 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189151 (keccak DA) da_commitment 12,126,349 12,126,349 (+0.00%) 9,472,233 9,472,233 (+0.00%) 22,940 22,940 (+0.00%) 0 0 (+0.00%) 571,769 571,769 (+0.00%)
block_25189153 (blobs DA) da_commitment 4,816,784 4,816,784 (+0.00%) 4,587,984 4,587,984 (+0.00%) 14,300 14,300 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189153 (keccak DA) da_commitment 6,800,863 6,800,863 (+0.00%) 5,458,379 5,458,379 (+0.00%) 14,300 14,300 (+0.00%) 0 0 (+0.00%) 278,421 278,421 (+0.00%)
block_25188855 (keccak DA) run_tx_loop 212,949,827 212,755,535 (-0.09%) 162,437,559 162,246,275 (-0.12%) 373,590 373,590 (+0.00%) 8,457,231 8,456,479 (-0.01%) 2,676,476 2,676,476 (+0.00%)
block_25188862 (keccak DA) run_tx_loop 500,660,710 500,265,007 (-0.08%) 377,720,718 377,333,807 (-0.10%) 584,570 584,570 (+0.00%) 22,892,549 22,890,351 (-0.01%) 5,504,169 5,504,169 (+0.00%)
block_25188863 (keccak DA) run_tx_loop 205,441,519 205,245,780 (-0.10%) 155,175,303 154,981,932 (-0.12%) 295,790 295,790 (+0.00%) 8,150,725 8,150,133 (-0.01%) 3,232,669 3,232,669 (+0.00%)
block_25188937 (keccak DA) run_tx_loop 646,275,755 645,426,808 (-0.13%) 499,927,863 499,093,316 (-0.17%) 839,770 839,770 (+0.00%) 21,884,022 21,880,422 (-0.02%) 11,343,871 11,343,871 (+0.00%)
block_25188945 (keccak DA) run_tx_loop 370,090,278 369,609,007 (-0.13%) 295,673,194 295,198,771 (-0.16%) 654,950 654,950 (+0.00%) 11,233,142 11,231,430 (-0.02%) 4,751,329 4,751,329 (+0.00%)
block_25188950 (keccak DA) run_tx_loop 505,472,781 505,011,494 (-0.09%) 403,796,161 403,336,630 (-0.11%) 494,350 494,350 (+0.00%) 19,210,924 19,210,485 (-0.00%) 4,230,831 4,230,831 (+0.00%)
block_25189014 (keccak DA) run_tx_loop 348,919,029 348,578,767 (-0.10%) 268,259,997 267,924,167 (-0.13%) 424,000 424,000 (+0.00%) 13,434,465 13,433,357 (-0.01%) 5,034,293 5,034,293 (+0.00%)
block_25189128 (keccak DA) run_tx_loop 374,412,182 373,950,996 (-0.12%) 296,517,090 296,065,528 (-0.15%) 501,480 501,480 (+0.00%) 11,463,305 11,460,899 (-0.02%) 6,004,548 6,004,548 (+0.00%)
block_25189151 (keccak DA) run_tx_loop 664,400,608 663,757,234 (-0.10%) 496,277,104 495,649,826 (-0.13%) 740,540 740,540 (+0.00%) 29,031,931 29,027,907 (-0.01%) 10,036,785 10,036,785 (+0.00%)
block_25189153 (keccak DA) run_tx_loop 2,252,330,275 2,250,706,733 (-0.07%) 1,857,998,019 1,856,327,597 (-0.09%) 588,240 588,240 (+0.00%) 87,476,392 87,488,112 (+0.01%) 8,753,712 8,753,712 (+0.00%)
block_25188855 (blobs DA) state_commitment_update 17,558,979 17,558,979 (+0.00%) 16,023,619 16,023,619 (+0.00%) 95,960 95,960 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188855 (keccak DA) state_commitment_update 17,555,562 17,555,562 (+0.00%) 16,020,202 16,020,202 (+0.00%) 95,960 95,960 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188862 (blobs DA) state_commitment_update 32,412,499 32,412,499 (+0.00%) 29,506,419 29,506,419 (+0.00%) 181,630 181,630 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188862 (keccak DA) state_commitment_update 32,412,499 32,412,499 (+0.00%) 29,506,419 29,506,419 (+0.00%) 181,630 181,630 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188863 (blobs DA) state_commitment_update 16,942,399 16,942,399 (+0.00%) 15,443,519 15,443,519 (+0.00%) 93,680 93,680 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188863 (keccak DA) state_commitment_update 16,942,399 16,942,399 (+0.00%) 15,443,519 15,443,519 (+0.00%) 93,680 93,680 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188937 (blobs DA) state_commitment_update 53,739,347 53,739,347 (+0.00%) 49,136,947 49,136,947 (+0.00%) 287,650 287,650 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188937 (keccak DA) state_commitment_update 53,739,347 53,739,347 (+0.00%) 49,136,947 49,136,947 (+0.00%) 287,650 287,650 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188945 (blobs DA) state_commitment_update 31,127,413 31,127,413 (+0.00%) 28,100,053 28,100,053 (+0.00%) 189,210 189,210 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188945 (keccak DA) state_commitment_update 31,127,413 31,127,413 (+0.00%) 28,100,053 28,100,053 (+0.00%) 189,210 189,210 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188950 (blobs DA) state_commitment_update 23,369,260 23,369,260 (+0.00%) 21,334,060 21,334,060 (+0.00%) 127,200 127,200 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188950 (keccak DA) state_commitment_update 23,373,478 23,373,478 (+0.00%) 21,338,278 21,338,278 (+0.00%) 127,200 127,200 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189014 (blobs DA) state_commitment_update 23,000,664 23,000,664 (+0.00%) 21,036,504 21,036,504 (+0.00%) 122,760 122,760 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189014 (keccak DA) state_commitment_update 23,000,666 23,000,666 (+0.00%) 21,036,506 21,036,506 (+0.00%) 122,760 122,760 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189128 (blobs DA) state_commitment_update 34,326,398 34,326,398 (+0.00%) 31,148,158 31,148,158 (+0.00%) 198,640 198,640 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189128 (keccak DA) state_commitment_update 34,326,398 34,326,398 (+0.00%) 31,148,158 31,148,158 (+0.00%) 198,640 198,640 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189151 (blobs DA) state_commitment_update 44,869,541 44,869,541 (+0.00%) 40,801,861 40,801,861 (+0.00%) 254,230 254,230 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189151 (keccak DA) state_commitment_update 44,869,541 44,869,541 (+0.00%) 40,801,861 40,801,861 (+0.00%) 254,230 254,230 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189153 (blobs DA) state_commitment_update 34,928,995 34,928,995 (+0.00%) 31,910,595 31,910,595 (+0.00%) 188,650 188,650 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189153 (keccak DA) state_commitment_update 34,928,995 34,928,995 (+0.00%) 31,910,595 31,910,595 (+0.00%) 188,650 188,650 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188855 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188862 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188863 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188937 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188945 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25188950 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189014 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189128 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189151 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
block_25189153 (keccak DA) system_init 48,086 48,086 (+0.00%) 48,086 48,086 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
Precompiles test-crate bench (synthetic workload, all labels)
Benchmark Symbol Base Eff Head Eff (%) Base Raw Head Raw (%) Base Blake Head Blake (%) Base Bigint Head Bigint (%) Base Keccak Head Keccak (%)
precompiles bn254_ecadd 53,340 53,340 (+0.00%) 47,888 47,888 (+0.00%) 0 0 (+0.00%) 1,363 1,363 (+0.00%) 0 0 (+0.00%)
precompiles bn254_ecmul 732,100 732,100 (+0.00%) 567,912 567,912 (+0.00%) 0 0 (+0.00%) 41,047 41,047 (+0.00%) 0 0 (+0.00%)
precompiles bn254_pairing 71,722,248 71,722,240 (-0.00%) 57,194,104 57,194,096 (-0.00%) 0 0 (+0.00%) 3,632,036 3,632,036 (+0.00%) 0 0 (+0.00%)
precompiles da_commitment 16,711 16,711 (+0.00%) 13,635 13,635 (+0.00%) 30 30 (+0.00%) 0 0 (+0.00%) 649 649 (+0.00%)
precompiles ecrecover 371,965 372,990 (+0.28%) 242,625 243,354 (+0.30%) 0 0 (+0.00%) 31,686 31,760 (+0.23%) 649 649 (+0.00%)
precompiles id 925 925 (+0.00%) 925 925 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
precompiles keccak 31,678 31,677 (-0.00%) 10,906 10,905 (-0.01%) 0 0 (+0.00%) 1 1 (+0.00%) 5,192 5,192 (+0.00%)
precompiles modexp 31,947,552 31,947,552 (+0.00%) 21,289,732 21,289,732 (+0.00%) 0 0 (+0.00%) 2,664,455 2,664,455 (+0.00%) 0 0 (+0.00%)
precompiles p256_verify 747,503 747,503 (+0.00%) 468,811 468,811 (+0.00%) 0 0 (+0.00%) 69,673 69,673 (+0.00%) 0 0 (+0.00%)
precompiles process_block 145,064,209 145,058,194 (-0.00%) 115,465,553 115,461,102 (-0.00%) 5,370 5,370 (+0.00%) 7,326,264 7,325,873 (-0.01%) 51,920 51,920 (+0.00%)
precompiles process_transaction 72,313,736 72,313,202 (-0.00%) 57,562,252 57,568,778 (+0.01%) 160 160 (+0.00%) 3,665,165 3,663,400 (-0.05%) 22,066 22,066 (+0.00%)
precompiles ripemd 8,015 8,015 (+0.00%) 8,015 8,015 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
precompiles run_tx_loop 144,578,996 144,574,368 (-0.00%) 115,097,128 115,094,064 (-0.00%) 180 180 (+0.00%) 7,326,264 7,325,873 (-0.01%) 43,483 43,483 (+0.00%)
precompiles sha256 13,319 13,319 (+0.00%) 13,319 13,319 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
precompiles state_commitment_update 183,017 183,227 (+0.11%) 143,337 143,547 (+0.15%) 2,480 2,480 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
precompiles system_init 49,856 49,856 (+0.00%) 49,856 49,856 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
FRI precompile bench (FriProofTx + sidecar + contract call)
Benchmark Symbol Base Eff Head Eff (%) Base Raw Head Raw (%) Base Blake Head Blake (%) Base Bigint Head Bigint (%) Base Keccak Head Keccak (%)
fri_precompile da_commitment 11,354 11,354 (+0.00%) 11,034 11,034 (+0.00%) 20 20 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
fri_precompile ecrecover 367,204 365,476 (-0.47%) 239,748 238,460 (-0.54%) 0 0 (+0.00%) 31,215 31,105 (-0.35%) 649 649 (+0.00%)
fri_precompile keccak 4,700 4,699 (-0.02%) 2,100 2,099 (-0.05%) 0 0 (+0.00%) 1 1 (+0.00%) 649 649 (+0.00%)
fri_precompile process_block 17,014,031 17,011,693 (-0.01%) 11,164,655 11,163,337 (-0.01%) 354,210 354,210 (+0.00%) 31,875 31,620 (-0.80%) 13,629 13,629 (+0.00%)
fri_precompile process_transaction 16,539,005 16,536,390 (-0.02%) 10,804,177 10,802,582 (-0.01%) 349,160 349,160 (+0.00%) 31,875 31,620 (-0.80%) 5,192 5,192 (+0.00%)
fri_precompile run_tx_loop 16,548,767 16,546,152 (-0.02%) 10,811,343 10,809,748 (-0.01%) 349,160 349,160 (+0.00%) 31,875 31,620 (-0.80%) 5,841 5,841 (+0.00%)
fri_precompile state_commitment_update 163,215 163,237 (+0.01%) 125,615 125,637 (+0.02%) 2,350 2,350 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)
fri_precompile system_init 50,176 50,176 (+0.00%) 50,176 50,176 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%) 0 0 (+0.00%)

Per-opcode

Per-opcode cycle diff

Opcode Count Med Cycles eff (%) Total Cycles eff (%) Med Cyc/Gas eff (%) Worst Cyc/Gas eff (%)
SLOAD 64715 1,254 (-0.5%) 102,788,537 (-0.4%) 8.4 (-0.7%) 22.8 (-0.3%)
MSTORE 419062 200 (+1.0%) 101,483,772 (+0.8%) 66.7 (+1.0%) 66.7 (+1.0%)
MLOAD 396315 174 (-1.7%) 69,017,484 (-1.7%) 58.0 (-1.7%) 58.0 (-1.7%)
JUMPI 743606 106 (-1.9%) 65,040,596 (-1.7%) 10.6 (-1.9%) 10.6 (-1.9%)
SSTORE 17258 2,407 (-0.2%) 42,953,098 (-0.2%) 0.8 (-0.2%) 40.9 (-0.1%)
PUSH4 196444 155 (-1.3%) 29,327,057 (-1.3%) 51.7 (-1.3%) 54.0 (-1.2%)
CALLDATALOAD 115629 231 (-4.1%) 28,347,588 (-3.9%) 77.0 (-4.1%) 101.7 (-3.2%)
PUSH20 114096 220 (-0.9%) 24,153,118 (-0.9%) 73.3 (-0.9%) 78.3 (-0.8%)
PUSH32 70114 296 (+0.3%) 19,894,436 (+0.4%) 98.7 (+0.3%) 101.3 (+0.3%)
CODECOPY 51097 287 (-1.4%) 14,749,070 (-1.4%) 47.8 (-1.4%) 48.0 (-1.4%)
DIV 50773 273 (-2.8%) 13,824,213 (-2.8%) 54.6 (-2.8%) 54.6 (-2.8%)
SHL 103511 130 (-1.5%) 13,102,575 (-1.6%) 43.3 (-1.5%) 55.0 (-1.2%)
MULMOD 18105 442 (-6.0%) 8,055,293 (-5.7%) 55.2 (-6.0%) 57.9 (-5.3%)
SHR 64574 106 (-1.9%) 7,663,242 (-1.7%) 35.3 (-1.9%) 54.7 (-1.2%)
LOG3 6938 1,040 (-0.5%) 7,356,940 (-0.5%) 0.6 (-0.5%) 0.8 (-0.4%)
CALLDATACOPY 11796 349 (-1.1%) 7,151,232 (-0.6%) 20.1 (-1.5%) 47.8 (-1.4%)
ADDMOD 14942 374 (-1.8%) 5,613,243 (-1.8%) 46.8 (-1.8%) 99.1 (-0.9%)
EXTCODESIZE 2673 473 (-0.4%) 5,207,025 (-0.1%) 3.7 (-0.5%) 7.8 (-0.3%)
PUSH8 29286 167 (-1.2%) 4,874,973 (-1.2%) 55.7 (-1.2%) 60.3 (-1.1%)
CALL 11506 398 (-0.5%) 4,711,561 (-0.5%) n/a n/a
EXP 10441 573 (-0.3%) 4,693,257 (-0.4%) 9.6 (-0.3%) 14.2 (-1.4%)
SLT 41867 97 (-1.0%) 3,951,263 (-1.0%) 32.3 (-1.0%) 32.7
SIGNEXTEND 14103 262 (-0.8%) 3,693,572 (-0.8%) 52.4 (-0.8%) 54.0 (-0.7%)
STATICCALL 8565 426 (-0.5%) 3,682,685 (-0.5%) n/a n/a
TSTORE 2650 956 (+0.2%) 2,671,660 (+0.2%) 9.6 (+0.2%) 29.0 (+0.1%)
PUSH16 11075 213 (-0.9%) 2,254,510 (-1.0%) 71.0 (-0.9%) 73.0 (-0.9%)
TLOAD 3110 576 (-0.2%) 1,945,287 (-0.2%) 5.8 (-0.2%) 23.5 (-0.0%)
PUSH3 12487 144 (-1.4%) 1,826,171 (-1.3%) 48.0 (-1.4%) 52.0 (-1.3%)
RETURNDATACOPY 5789 240 (-1.2%) 1,447,984 (-0.9%) 40.0 (-1.2%) 52.3 (-0.9%)
DELEGATECALL 3601 398 (-0.5%) 1,435,011 (-0.5%) n/a n/a
SDIV 4229 316 (-0.6%) 1,376,102 (-0.6%) 63.2 (-0.6%) 119.2 (-0.5%)
RETURN 12483 90 (-2.2%) 1,104,975 (-2.2%) n/a n/a
SGT 8729 96 (-1.0%) 792,558 (-1.1%) 32.0 (-1.0%) 32.3 (-1.0%)
LOG4 570 1,217 (+0.1%) 688,592 (+0.1%) 0.5 (+0.1%) 0.7 (+0.1%)
MOD 2798 237 (-0.8%) 663,126 (-0.8%) 47.4 (-0.8%) 47.4 (-0.8%)
PUSH14 3247 208 (-1.0%) 655,893 (-1.0%) 69.3 (-1.0%) 72.0 (-0.9%)
LOG1 709 864 (+0.3%) 627,944 (+0.3%) 0.6 (+0.4%) 1.1 (+0.3%)
MCOPY 1437 307 (+1.3%) 605,301 (+0.6%) 30.0 46.7 (+1.4%)
PUSH28 2131 269 (+0.4%) 570,589 (+0.4%) 89.7 (+0.4%) 95.7 (+0.3%)
PUSH6 3491 157 (-1.3%) 548,325 (-1.3%) 52.3 (-1.3%) 57.7 (-1.1%)
PUSH12 2672 200 (-1.0%) 507,964 (-1.0%) 66.7 (-1.0%) 66.7 (-1.0%)
PUSH21 1804 261 (+0.8%) 465,266 (+0.8%) 87.0 (+0.8%) 89.7 (+0.7%)
PUSH9 2618 182 (-1.1%) 464,639 (-1.1%) 60.7 (-1.1%) 63.3 (-1.0%)
PUSH5 2903 153 (-1.3%) 447,329 (-1.3%) 51.0 (-1.3%) 56.3 (-1.2%)
SAR 2385 178 (-1.1%) 427,181 (-1.4%) 59.3 (-1.1%) 94.3 (-1.0%)
PUSH7 2266 180 (-1.1%) 387,668 (-1.2%) 60.0 (-1.1%) 60.0 (-1.1%)
PUSH15 1818 212 (-0.9%) 367,603 (-1.0%) 70.7 (-0.9%) 73.3 (-0.9%)
CREATE2 14 7,133 (-0.1%) 337,357 (-0.0%) n/a n/a
PUSH31 1237 251 (+0.8%) 332,697 (+0.7%) 83.7 (+0.8%) 105.0 (+0.6%)
MSTORE8 3116 87 (-2.2%) 271,092 (-2.2%) 29.0 (-2.2%) 29.0 (-2.2%)
PUSH17 1168 221 (-0.9%) 251,872 (-0.9%) 73.7 (-0.9%) 76.3 (-0.9%)
SELFBALANCE 564 350 (+1.4%) 201,055 (+1.4%) 70.0 (+1.4%) 131.8 (+0.8%)
SMOD 544 293 (-1.3%) 164,058 (-1.3%) 58.6 (-1.3%) 63.6 (-1.2%)
PUSH13 667 197 (-1.0%) 127,821 (-1.0%) 65.7 (-1.0%) 71.0 (-0.9%)
PUSH10 605 180 (-1.1%) 111,523 (-1.1%) 60.0 (-1.1%) 65.7 (-1.0%)
PUSH26 304 276 (+0.7%) 81,582 (+0.8%) 92.0 (+0.7%) 98.0 (+0.7%)
PUSH24 338 245 (-0.8%) 76,488 (-0.9%) 81.7 (-0.8%) 84.3 (-0.8%)
EXTCODEHASH 43 548 (-0.2%) 72,921 (-0.1%) 4.7 (-0.2%) 6.8 (-0.1%)
EXTCODECOPY 20 1,432 (-0.2%) 71,189 (-0.1%) 8.8 (-0.3%) 41.1 (-0.1%)
ORIGIN 976 70 (-1.4%) 68,320 (-1.4%) 35.0 (-1.4%) 35.0 (-1.4%)
BALANCE 132 376 (-0.5%) 57,990 (-0.5%) 3.8 (-0.5%) 5.7 (-0.3%)
PUSH23 193 250 (-0.8%) 47,952 (-0.8%) 83.3 (-0.8%) 86.0 (-0.8%)
PUSH11 224 194 (-1.0%) 42,611 (-1.0%) 64.7 (-1.0%) 67.3 (-1.0%)
CHAINID 409 63 (-1.6%) 25,767 (-1.6%) 31.5 (-1.6%) 31.5 (-1.6%)
PUSH18 101 219 (-0.9%) 21,942 (-0.9%) 73.0 (-0.9%) 79.3 (-0.8%)
PUSH30 75 294 (+0.3%) 21,678 (+0.3%) 98.0 (+0.3%) 104.0 (+0.3%)
LOG0 26 717 (-0.8%) 19,044 (-0.8%) 0.8 (-0.7%) 1.1 (-0.8%)
NUMBER 300 62 (-1.6%) 18,600 (-1.6%) 31.0 (-1.6%) 31.0 (-1.6%)
PUSH25 71 273 (+0.4%) 18,359 (+0.4%) 91.0 (+0.4%) 93.7 (+0.4%)
PUSH22 75 247 (-0.8%) 18,355 (-0.8%) 82.3 (-0.8%) 85.3 (-0.8%)
REVERT 215 90 (-2.2%) 18,137 (-2.3%) 66.3 (-1.0%) 66.3 (-1.0%)
PUSH19 56 235 (-0.8%) 12,423 (-0.9%) 78.3 (-0.8%) 81.0 (-0.8%)
PUSH27 38 282 (+0.7%) 10,262 (+0.7%) 94.0 (+0.7%) 100.0 (+0.7%)
CREATE 2 3,356 (+0.1%) 6,712 (+0.1%) n/a n/a
SELFDESTRUCT 2 2,542 (+0.1%) 5,085 (+0.1%) 0.5 (+0.1%) 0.5 (+0.1%)
BLOCKHASH 14 207 (-1.9%) 2,898 (-1.9%) 10.3 (-1.9%) 10.3 (-1.9%)
BLOBHASH 11 163 (-7.4%) 1,615 (-6.9%) 54.3 (-7.4%) 54.3 (-7.4%)
GASPRICE 19 75 (-1.3%) 1,425 (-1.3%) 37.5 (-1.3%) 37.5 (-1.3%)

Per-precompile

Per-precompile per-execution ratios (head)
cycles = effective (raw + Blake×16 + BigInt×4 + Keccak×4)
precompile                count    med c/g    p95 c/g    p99 c/g    max c/g    med n/g    p95 n/g    p99 n/g    max n/g
------------------------------------------------------------------------------------------------------------------------
keccak                    42872      111.9      126.7      209.2     4295.9      478.8      478.8      626.8      681.4
modexp                     2501       63.3       63.5      187.0     2877.1      500.0      500.0      500.0     4814.0
point_eval                   11     1023.6     1029.1     1029.1     1029.1     1262.1     1262.1     1262.1     1262.1
bls12_g1add                  12      895.0      896.6      896.6      896.6        0.0        0.0        0.0        0.0
blake2f                       2      803.7      803.7      803.7      803.7        0.0        0.0        0.0        0.0
bls12_pairing_check           4      217.7      427.5      427.5      427.5        0.0        0.0        0.0        0.0
ecadd                       617      352.1      360.8      364.2      368.1      350.7      350.7      350.7      350.7
bls12_g1msm                  12      157.9      318.7      318.7      318.7        0.0        0.0        0.0        0.0
ecpairing                    40      169.1      186.3      186.3      186.3      398.2      428.6      428.6      428.6
sha256                       28       96.4      143.6      143.6      143.6      104.2      148.9      148.9      148.9
ecmul                       597      120.9      125.3      126.5      128.6      127.3      127.3      127.3      127.3
ecrecover                   713      119.7      121.9      123.2      123.6      174.0      174.0      174.0      174.0
p256_verify                  22      107.7      108.3      108.4      108.4      113.6      113.6      113.6      113.6
bls12_g2msm                   2       88.4       88.4       88.4       88.4        0.0        0.0        0.0        0.0
identity                    292       29.2       41.7       44.4       50.8       40.8       59.0       62.8       72.2
bls12_g2add                   2       46.0       46.0       46.0       46.0        0.0        0.0        0.0        0.0
ripemd160                     4        4.4        7.4        7.4        7.4        8.1       13.1       13.1       13.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants