Caracal は、Starknet スマートコントラクトの SIERRA 表現に対する静的解析ツールです。
プリコンパイル済みバイナリはリリースページから入手できます。Cairo コンパイラ 1.x.x を使用している場合は v0.1.x のバイナリを、Cairo コンパイラ 2.x.x を使用している場合は v0.2.x を使用してください。
Rust コンパイラと Cargo が必要です。 git からビルド:
cargo install --git https://github.com/crytic/caracal --profile release --force
ローカルコピーからビルド:
git clone https://github.com/crytic/caracal
cd caracal
cargo install --path . --profile release --force
検出器一覧:
caracal detectors
プリンター一覧:
caracal printers
スタンドアロンの Cairo ファイルで使用する場合、ローカルの Cairo コンパイラバイナリがあれば、そのファイルを指定するだけで十分です。それ以外の場合はバンドルされたコンパイラが使用され、--corelib CLI オプションまたは CORELIB_PATH 環境変数を設定して corelib ライブラリへのパスを指定する必要があります。
検出器を実行:
caracal detect path/file/to/analyze
caracal detect path/file/to/analyze --corelib path/to/corelib/src
プリンターを実行:
caracal print path/file/to/analyze --printer printer_to_use --corelib path/to/corelib/src
複数のファイルとコントラクトがある Cairo プロジェクトの場合、--contract-path でコントラクトを指定する必要がある場合があります。ローカルの Cairo コンパイラバイナリが利用可能な場合はそれが使用され、それ以外の場合はバンドルされたコンパイラが使用されます。後者の場合、スタンドアロンの場合と同様に corelib を指定する必要があります。パスは cairo_project.toml が存在するディレクトリです。
検出器を実行:
caracal detect path/to/dir
caracal detect path/to/dir --contract-path token::myerc20::... token::myerc721::...
プリンターを実行:
caracal print path/to/dir --printer printer_to_use
Scarb を使用するプロジェクトの場合、Scarb.toml に以下を追加する必要があります:
[[target.starknet-contract]]
sierra = true
[cairo]
sierra-replace-ids = true
その後、Scarb.toml が存在するディレクトリへのパスを渡します。 検出器を実行:
caracal detect path/to/dir
プリンターを実行:
caracal print path/to/dir --printer printer_to_use
Cairo 列は、検出器が有効なコンパイラバージョンを示します。
cfg: 各関数の CFG を .dot ファイルにエクスポートcallgraph: 関数呼び出しグラフを .dot ファイルにエクスポート以下のトピックに関する Wiki を確認してください:
| 番号 | 検出器 | 検出内容 | 影響度 | 信頼度 | Cairo |
|---|
| 1 | controlled-library-call | ユーザー制御のクラスハッシュによるライブラリ呼び出し | 高 | 中 | 1 & 2 |
| 2 | unchecked-l1-handler-from | from アドレスチェックがない L1 ハンドラを検出 | 高 | 中 | 1 & 2 |
| 3 | felt252-unsafe-arithmetic | オーバーフロー/アンダーフロー安全でない felt252 型のユーザー制御操作を検出 | 中 | 中 | 1 & 2 |
| 4 | reentrancy | 外部呼び出しの前にストレージ変数が読み取られ、その後に書き込まれることを検出 | 中 | 中 | 1 & 2 |
| 5 | read-only-reentrancy | view 関数が外部呼び出し後に書き込まれたストレージ変数を読み取ることを検出 | 中 | 中 | 1 & 2 |
| 6 | unused-events | 定義されているが発行されていないイベント | 中 | 中 | 1 & 2 |
| 7 | unused-return | 未使用の戻り値 | 中 | 中 | 1 & 2 |
| 8 | unenforced-view | view デコレータがあるが状態を変更する関数 | 中 | 中 | 1 |
| 9 | tx-origin | トランザクションの発信元アドレスをアクセス制御として使用していることを検出 | 中 | 中 | 2 |
| 10 | unused-arguments | 未使用の引数 | 低 | 中 | 1 & 2 |
| 11 | reentrancy-benign | 外部呼び出し後にストレージ変数が書き込まれるが、その前に読み取られないことを検出 | 低 | 中 | 1 & 2 |
| 12 | reentrancy-events | 外部呼び出し後にイベントが発行され、イベントの順序が乱れることを検出 | 低 | 中 | 1 & 2 |
| 13 | dead-code | 使用されていないプライベート関数 | 低 | 中 | 1 & 2 |
| 14 | use-after-pop-front | 配列またはスパンから要素を削除した後の使用を検出 | 低 | 中 | 1 & 2 |