Day12 実行ログ(2026-01 更新)
実装
- 脆弱/安全コントラクト:
contracts/VulnBank.sol,SafeBank.sol,Attacker.solを追加。VulnBankはCEI違反(bal更新が送金後)で再入攻撃可能、SafeBankはReentrancyGuard+ CEI 順守。 - 権限管理例:
contracts/AdminBox.sol(Ownable + Pausable)。 - テスト:
test/reentrancy.tsを実装し、VulnBankが攻撃で枯渇する一方、SafeBankは攻撃Txがrevertすることを確認。
コマンド
# 依存を復元(OZ v5)
npm ci
# 再入テストのみ
npx hardhat test test/reentrancy.ts
# 全体テスト
npm test
結果:test/reentrancy.ts は 2 passing、全体は 16 passing。
観測
VulnBankへ10 ETH預けた状態でAttacker.attack()を実行すると、bal[msg.sender]が未更新の間に再入され、残高が9 ETH未満まで減少。SafeBankはnonReentrant+ 先に残高更新を行うため、攻撃Txは revert し drain 不発。AdminBox(Ownable+Pausable)は Day04/Day11 のサンプルに適用できる汎用テンプレートとして用意。
静的解析/ファジング
- Slither / Echidna は外部ツール導入と追加設定が必要なため実行していません。手順メモ:
pipx install slither-analyzerslither . --filter-paths node_modules- Foundry/Echidna invariantsを追加する場合は
forge initで別ディレクトリを生成してinvariant_*.t.solを作成。
まとめ
- Day12 で扱う再入/権限対策をコードベースに具体化し、攻撃成功/失敗を自動テストで確認できる状態にした。
AdminBoxなどのアクセスポリシー雛形を追加したことで、教材の他コントラクトにも Pausable/Ownable を適用しやすくなった。- 静的解析・ファジングは環境準備後にすぐ再現できるようコマンドと推奨設定をメモに残した。