Skip to content

JPYC.initializeV2_ok

名称・種別

  • 名称: JPYC.initializeV2_ok
  • 種別: theorem
  • モジュール: JpycFormalVerification.UpgradeabilityTheorems
  • ソース: JpycFormalVerification/UpgradeabilityTheorems.lean:183-190
  • 概要: 成功した initializeV2 を順方向に特徴づける補助補題。
  • 仕様: 対象外

型シグネチャ

lean
∀ {O : JPYC.SigOracle} {s s' : JPYC.State} {ctx : JPYC.CallContext}, Eq (JPYC.initializeV2 O s ctx) (Except.ok s') → And (Eq s.initializedVersion 1) (Eq s' { name := s.name, symbol := s.symbol, currency := s.currency, decimals := s.decimals, totalSupply := s.totalSupply, initializedVersion := 2, balances := s.balances, allowed := s.allowed, minters := s.minters, minterAllowed := s.minterAllowed, allowlisted := s.allowlisted, owner := s.owner, pauser := s.pauser, blocklister := s.blocklister, rescuer := s.rescuer, minterAdmin := s.minterAdmin, allowlister := s.allowlister, paused := s.paused, blocklisted := s.blocklisted, domainSeparator := O.makeDomainSeparator s.name "2" ctx.blockChainId, chainId := s.chainId, domainName := s.domainName, version := "2", permitNonces := s.permitNonces, authorizationStates := s.authorizationStates })

initializeV2 が成功したという仮定から、版数 1 だったことと結果状態の形を取り出す前向き特徴づけ補題です。

解説

何を述べているか。 initializeV2Except.ok s' で成功したとき、s.initializedVersion = 1 であり、s' が「版数 2・VERSION = "2"・ドメインセパレータ再計算」を施した状態に等しいことを取り出します。証明は req_bind_eq_ok でガードを剝がし、pure_okpure の成功値を取り出します。

直感。 「成功した」という結果から「版数 1 だった」「状態がどうなったか」を逆算する分解です。V2 初期化の後続定理は、この 1 本から枝分かれします。

なぜ安全性に効くか。 initializeV2仕様の核 です。一回限り性(*_requires_v1 / *_sets_version)と不変条件(*_wf / *_conserves)が、ここから短く導けます。

図解

Lean ソースコード

lean
theorem initializeV2_ok {O : SigOracle} {s s' : State} {ctx : CallContext}
    (h : initializeV2 O s ctx = .ok s') :
    s.initializedVersion = 1 ∧ s' = { s with
      initializedVersion := 2, version := "2",
      domainSeparator := O.makeDomainSeparator s.name "2" ctx.blockChainId } := by
  unfold initializeV2 at h
  obtain ⟨h1, h⟩ := req_bind_eq_ok h
  exact ⟨h1, pure_ok h⟩

依存