Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

English version: /en/doc/compatibility/precompiles-system-contracts.html

Precompiles & System Contracts

TL;DR

  • precompile 失敗は exec.halt.precompile_error として分類される。
  • Kasane は revm の mainnet precompile set を利用し、独自のアドレス上書きはしていない。
  • 現行実装は SpecId::default = PRAGUE のため、OSAKA追加の 0x0100 (P256VERIFY) はデフォルトでは有効化されない。
  • opcode差分の解説はこのページの責務外(ethereum-differences.md を参照)。

運用方針

  • precompile失敗の分類は exec.halt.precompile_error を一次判定に使う。
  • precompile依存機能は mainnet 投入前に対象パスをスモークして動作を固定化する。

対応precompile(現行デフォルト: PRAGUE)

AddressName導入段階備考
0x01ECRECHomesteadsecp256k1 ecrecover
0x02SHA256Homestead
0x03RIPEMD160Homestead
0x04IDHomesteadidentity
0x05MODEXPByzantiumPrague では Berlin gas式が適用
0x06BN254_ADDByzantiumIstanbul 以降はガス更新版
0x07BN254_MULByzantiumIstanbul 以降はガス更新版
0x08BN254_PAIRINGByzantiumIstanbul 以降はガス更新版
0x09BLAKE2FIstanbul
0x0aKZG_POINT_EVALUATIONCancun現行ビルドで有効(検証バックエンドは c-kzg / blst / arkworks
0x0bBLS12_G1ADDPragueEIP-2537
0x0cBLS12_G1MSMPragueEIP-2537
0x0dBLS12_G2ADDPragueEIP-2537
0x0eBLS12_G2MSMPragueEIP-2537
0x0fBLS12_PAIRING_CHECKPragueEIP-2537
0x10BLS12_MAP_FP_TO_G1PragueEIP-2537
0x11BLS12_MAP_FP2_TO_G2PragueEIP-2537

OSAKAで追加されるが、現行デフォルトでは未有効

  • 0x0100 (P256VERIFY, RIP-7212)

実装上の前提

  • evm-coreContext::mainnet().build_mainnet_with_inspector(...)revm の mainnet builder をそのまま使う。
  • mainnet builder 側で EthPrecompiles::new(spec) を使って precompile set が決まる。
  • SpecId::default()PRAGUE

観測可能な事実

  • 実行系エラー分類に PrecompileError が存在
  • wrapper側で exec.halt.precompile_error にマップされる

安全な使い方

  • precompile依存機能では、exec.halt.precompile_error を監視/分類してリトライ判定を分離する
  • precompile前提のdAppでは、mainnet投入前に当該pathをスモークする

落とし穴

  • ingress検証とruntime precompile責務を混同する
  • 0x0100 (P256VERIFY) を常に有効と誤認する
  • 0x0a (KZG) の検証バックエンド差分(c-kzg / blst / arkworks)を考慮しない

関連ページ

  • ethereum-differences.md(opcode/tx type/finality差分)

根拠

  • crates/ic-evm-wrapper/src/lib.rsexec.halt.precompile_error
  • crates/evm-core/src/revm_exec.rs
  • crates/evm-core/Cargo.tomlrevm feature)
  • vendor/revm/crates/handler/src/mainnet_builder.rs
  • vendor/revm/crates/primitives/src/hardfork.rs
  • vendor/revm/crates/precompile/src/lib.rs
  • vendor/revm/crates/precompile/src/id.rs
  • vendor/revm/crates/precompile/src/bls12_381_const.rs
  • vendor/revm/crates/precompile/src/secp256r1.rs