JPYC.requireValidAuthorization
名称・種別
- 名称:
JPYC.requireValidAuthorization - 種別: def
- モジュール:
JpycFormalVerification.Signatures - ソース:
JpycFormalVerification/Signatures.lean:134-140 - 概要: _requireValidAuthorization:認可が有効期間内かつ未使用であることを要求するガード。
- 仕様: 対象外
型シグネチャ
JPYC.State → JPYC.CallContext → JPYC.Address → JPYC.Bytes32 → JPYC.U256 → JPYC.U256 → Except JPYC.Error UnitState・CallContext・認可者・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 ソースコード
/-- `_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
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);
}