上級者用語を調べる
形式検証とは
- 執筆
- CRYPTO PORT 編集部
- 公開日
- 更新日
- 読了目安
- 6 分
結論
形式検証は、コードが満たすべき性質を数学的に記述し、その性質があらゆる入力で成り立つことを証明する手法です。テストが「試した範囲で問題がない」ことしか示せないのに対し、検証は範囲を限定せずに示せます。ただし証明できるのは書いた性質だけで、仕様の書き漏れは検出できません。
要点
- 満たすべき性質を全入力について証明する手法
- テストと違い、試した範囲に限定されない
- 証明できるのは記述した性質だけ
- 重要な部分に絞って使われることが多い
定義
プログラムが満たすべき性質を形式的な仕様として記述し、その性質がすべての実行経路・入力について成り立つことを、数学的な手法で証明する検証方法。
通常のテストは、入力をいくつか用意して結果を確かめます。この方法では、試していない入力で起きる問題は見つかりません。形式検証は発想が違い、「この関数を実行しても総供給量は変化しない」といった性質を仕様として書き、それが成り立たない入力が存在しないことを示します。
スマートコントラクトは、公開後の修正が難しく、扱う金額が大きく、コードが比較的短いという特徴があります。この条件は形式検証と相性がよく、トークンの会計処理、担保と負債の関係、権限の遷移といった中核部分に適用されることが増えています。持分証明の設計や合意形成の証明にも使われます。
限界も明確です。証明されるのは記述した性質だけなので、そもそも仕様として書かれていない前提が崩れる場合は検出できません。また、外部のプロトコルと組み合わせたときの挙動や、運営者の権限行使そのものは、検証の対象外に置かれることが一般的です。
利用者にとっての意味は、「形式検証済み」という言葉を無条件の安全と読まないことです。どの部分について、どんな性質が証明されたのかが公開されているかを見ます。検証範囲が明記され、監査と報奨金制度と併用されている状態が、現実的に最も検証の厚い形になります。
注意点
- · 「形式検証済み」の表示だけで安全と判断せず、検証の対象範囲と証明された性質を確認する
- · 外部プロトコルとの組み合わせや運営権限は検証範囲の外に置かれることが多いと理解する
- · 形式検証・監査・報奨金制度のどれか一つだけを根拠に資金配分を決めない