Skip to content

JPYC.requireValidAuthorization

名称・種別

  • 名称: JPYC.requireValidAuthorization
  • 種別: def
  • モジュール: JpycFormalVerification.Signatures
  • ソース: JpycFormalVerification/Signatures.lean:134-140
  • 概要: _requireValidAuthorization:認可が有効期間内かつ未使用であることを要求するガード。
  • 仕様: 対象外

型シグネチャ

lean
JPYC.State → JPYC.CallContext → JPYC.Address → JPYC.Bytes32 → JPYC.U256 → JPYC.U256 → Except JPYC.Error Unit

StateCallContext・認可者・nonce・有効期間 validAfter/validBefore を受け取り、authorization の 有効ウィンドウ未使用 をまとめて要求するガードです。

和訳 docstring

_requireValidAuthorization(...) ― 有効ウィンドウ(validAfter < now < validBefore)と未使用をまとめて要求するガード(v1/EIP3009.sol:230-245)。

解説

何を述べているか。 _requireValidAuthorization(...)v1/EIP3009.sol:230-245)の写しです。3 段の検査を順に行います ―― (1) block.timestamp > validAfter(開始時刻を過ぎている)、(2) block.timestamp < validBefore(終了時刻より前)、(3) requireUnusedAuthorization(未使用)。どれかが破れると、それぞれ authorizationNotYetValid / authorizationExpired / authorizationUsedOrCanceled で revert します。

直感。 「今は有効期間内か? そしてまだ使われていないか?」を一括で確かめる関所です。署名者は「いつからいつまで有効か」を署名に埋め込めるので、未来の予約や期限つきの認可が表現できます。

なぜ安全性に効くか。 transferWithAuthorization_within_window(成功 ⇒ 期間内)と単一使用性の両方の土台です。時間ウィンドウにより、漏れた署名が無期限に有効化するのを防ぎ、unused 検査によりリプレイを防ぎます。

図解

Lean ソースコード

lean
/-- `_requireValidAuthorization(authorizer, nonce, validAfter, validBefore)` —
`v1/EIP3009.sol:230-245`. -/
def requireValidAuthorization (s : State) (ctx : CallContext) (authorizer : Address)
    (nonce : Bytes32) (validAfter validBefore : U256) : Except Error Unit := do
  req (ctx.blockTimestamp > validAfter) .authorizationNotYetValid
  req (ctx.blockTimestamp < validBefore) .authorizationExpired
  requireUnusedAuthorization s authorizer nonce

対応 Solidity ソースコード

reference/JPYCv2/contracts/v1/EIP3009.sol:230-245

solidity
function _requireValidAuthorization(
    address authorizer,
    bytes32 nonce,
    uint256 validAfter,
    uint256 validBefore
) private view {
    require(
        block.timestamp > validAfter,
        "EIP3009: authorization is not yet valid"
    );
    require(
        block.timestamp < validBefore,
        "EIP3009: authorization is expired"
    );
    _requireUnusedAuthorization(authorizer, nonce);
}

依存