Skip to content

JPYC.cancelAuthorization

名称・種別

  • 名称: JPYC.cancelAuthorization
  • 種別: def
  • モジュール: JpycFormalVerification.Signatures
  • ソース: JpycFormalVerification/Signatures.lean:202-206
  • 概要: cancelAuthorization(authorizer,nonce,v,r,s):署名で未使用認可を取り消す EIP-3009 関数。
  • 仕様: 対象外

型シグネチャ

lean
JPYC.SigOracle → JPYC.State → JPYC.CallContext → JPYC.Address → JPYC.Bytes32 → JPYC.U8 → JPYC.Bytes32 → JPYC.Bytes32 → Except JPYC.Error JPYC.State

EIP-3009 の cancelAuthorization 関数です。まだ使われていない authorization を、署名により キャンセル(使用済みマーク)して無効化します。署名オラクル O の下で定義されます。

和訳 docstring

cancelAuthorization(authorizer, nonce, v, r, s) ― 未使用 authorization を署名でキャンセル(使用済みマーク)する(v2/FiatTokenV2.sol:528-536)。

解説

何を述べているか。 cancelAuthorization(authorizer, nonce, v, r, s)v2/FiatTokenV2.sol:528-536)の写しです。whenNotPaused を通したのち、内部 _cancelAuthorization で (1) requireUnusedAuthorization(まだ未使用)、(2) 署名が authorizer を復元するか検証、(3) setAuthorizationState authorizer nonce 1(使用済みにマーク)を行います。送金は伴いません。

直感。 「署名してしまったけれど、まだ使われていない送金指示を、自分で取り消す」操作です。取り消しも「その authorization を使用済みにする」ことで実現します ―― 一度キャンセルすれば、後から本来の送金を実行しようとしても 未使用ガードに弾かれます

なぜ安全性に効くか。 cancelAuthorization_blocks_transfer として「キャンセル後は同じ (authorizer, nonce) の transferWithAuthorization が決して成功しない」ことが証明されています。署名者が、漏れたかもしれない署名を事前に無効化できる安全弁です。署名者本人だけがキャンセルできること(cancelAuthorization_signed_by_authorizer)も保証されます。

図解

Lean ソースコード

lean
/-- `cancelAuthorization(authorizer, nonce, v, r, s)` — `v2/FiatTokenV2.sol:528-536`. -/
def cancelAuthorization (s : State) (ctx : CallContext) (authorizer : Address)
    (nonce : Bytes32) (v : U8) (r sig : Bytes32) : Except Error State := do
  whenNotPaused s
  _cancelAuthorization O s ctx authorizer nonce v r sig

対応 Solidity ソースコード

reference/JPYCv2/contracts/v2/FiatTokenV2.sol:528-536

solidity
function cancelAuthorization(
    address authorizer,
    bytes32 nonce,
    uint8 v,
    bytes32 r,
    bytes32 s
) external whenNotPaused {
    _cancelAuthorization(authorizer, nonce, v, r, s);
}

依存