Skip to content

JPYC.initializeV2_wrong_version

名称・種別

  • 名称: JPYC.initializeV2_wrong_version
  • 種別: theorem
  • モジュール: JpycFormalVerification.UpgradeabilityTheorems
  • ソース: JpycFormalVerification/UpgradeabilityTheorems.lean:206-211
  • 概要: version 1 以外からの initializeV2 は revert する(二重実行ガード・revert形)。
  • 仕様: 対象

型シグネチャ

lean
∀ {O : JPYC.SigOracle} {s : JPYC.State} {ctx : JPYC.CallContext}, Ne s.initializedVersion 1 → Eq (JPYC.initializeV2 O s ctx) (Except.error JPYC.Error.initializeV2WrongVersion)

版数が 1 以外の状態からは、initializeV2initializeV2WrongVersion で revert する、という二重実行ガード(revert)の定理です。

和訳 docstring

二重実行ガード(revert)。 版数 1 以外からの initializeV2 は revert する(素の require(initializedVersion == 1))。

解説

何を述べているか。 s.initializedVersion ≠ 1 のとき、initializeV2Except.error .initializeV2WrongVersion を返します。素の require(initializedVersion == 1)if を偽側(req_neg)に倒すだけです。

直感。 「版数が 1 でなければ、V2 初期化はちょうどこのエラーで弾かれる」。版数 0 でも 2 でも同じです。

なぜ安全性に効くか。 initializeV2_requires_v1 の対偶を、具体的なエラー名つきで固定します。Solidity 側が理由文字列のない素の require を使っていることに対応します。

図解

Lean ソースコード

lean
/-- **Double-execution guard (revert).** From any version other than `1`,
`initializeV2` reverts (the bare `require(initializedVersion == 1)`). -/
theorem initializeV2_wrong_version {O : SigOracle} {s : State} {ctx : CallContext}
    (h : s.initializedVersion ≠ 1) :
    initializeV2 O s ctx = .error .initializeV2WrongVersion := by
  unfold initializeV2; rw [req_neg h]; rfl

依存