JPYC.receiveWithAuthorization_revert_noop
名称・種別
- 名称:
JPYC.receiveWithAuthorization_revert_noop - 種別: theorem
- モジュール:
JpycFormalVerification.SignaturesTheorems - ソース:
JpycFormalVerification/SignaturesTheorems.lean:667-672 - 概要: receiveWithAuthorization が revert した場合、状態は一切変化しない、という定理。
- 仕様: 対象
型シグネチャ
lean
∀ {O : JPYC.SigOracle} {s : JPYC.State} {ctx : JPYC.CallContext} {frm dst : JPYC.Address} {value validAfter validBefore : JPYC.U256} {nonce : JPYC.Bytes32} {v : JPYC.U8} {r sig : JPYC.Bytes32} {e : JPYC.Error}, Eq (JPYC.receiveWithAuthorization O s ctx frm dst value validAfter validBefore nonce v r sig) (Except.error e) → Eq (s.afterCall (JPYC.receiveWithAuthorization O s ctx frm dst value validAfter validBefore nonce v r sig)) sreceiveWithAuthorization が revert したとき、観測される状態(afterCall)は呼び出し前の状態に等しい、という「revert すれば状態は変わらない」定理です。
解説
何を述べているか。 receiveWithAuthorization が Except.error e を返したとき、s.afterCall (receiveWithAuthorization O s ctx frm dst value validAfter validBefore nonce v r s) = s です。afterCall は「成功なら新状態、失敗なら元の状態」を返す観測関数なので、失敗時は定義から元の状態 s に簡約されます(simp [h])。
直感。 EVM のトランザクション・ロールバックを模したものです。「途中で revert したら、何もなかったことになる」。特に permit は nonce 書き込みを署名検証より前に行いますが、署名で失敗すればその書き込みごと巻き戻ります。
なぜ安全性に効くか。 no-op on revert は、失敗した呼び出しが副作用を残さないという基本的な安全性です。ガードに弾かれた署名操作が、nonce や authorization 台帳を中途半端に書き換えて残さないことを保証します。
図解
Lean ソースコード
lean
theorem receiveWithAuthorization_revert_noop {O : SigOracle} {s : State} {ctx : CallContext}
{frm dst : Address} {value validAfter validBefore : U256} {nonce : Bytes32}
{v : U8} {r sig : Bytes32} {e : Error}
(h : receiveWithAuthorization O s ctx frm dst value validAfter validBefore nonce v r sig = .error e) :
s.afterCall (receiveWithAuthorization O s ctx frm dst value validAfter validBefore nonce v r sig) = s := by
simp [h]