JPYC.sub?
名称・種別
- 名称:
JPYC.sub? - 種別: def
- モジュール:
JpycFormalVerification.Word - ソース:
JpycFormalVerification/Word.lean:40-43 - 概要: Solidity 0.8 のチェック付き減算。b > a なら revert する。
- 仕様: 対象外
型シグネチャ
lean
JPYC.U256 → JPYC.U256 → Except JPYC.Error JPYC.U256U256 → U256 → Except Error U256:2 つの U256 を受け取り、成功(差)か失敗(アンダーフロー)か を返します。
和訳 docstring
Solidity 0.8 の checked 減算。b > a の場合に限り、Panic(0x11)(Error.arithmeticUnderflow としてモデル化)で revert する。
解説
何を述べているか。 あふれを検知する引き算です(primer §3.4)。b.toNat ≤ a.toNat なら .ok (a - b)、b > a なら .error arithmeticUnderflow を返します。
直感。 結果がマイナスになる引き算は revert します。符号なし整数ではマイナスを表せないからです。
なぜ安全性に効くか。 残高から差し引く操作はこの演算を通すので、残高がマイナス(= 巨大な値へラップ)に壊れることがありません。「残高から value を引けた」という事実から「value ≤ 残高」が導けること(sub?_eq_ok)が、二重支払い・残高破壊を防ぐ鍵になります。
図解
Lean ソースコード
lean
/-- Solidity 0.8 checked subtraction. Reverts with `Panic(0x11)` (modeled as
`Error.arithmeticUnderflow`) iff `b > a`. -/
def sub? (a b : U256) : Except Error U256 :=
if b.toNat ≤ a.toNat then .ok (a - b) else .error .arithmeticUnderflow