こんにちは!ブロックチェーンの世界へようこそ。
スマートコントラクトの開発、日々ワクワクしながら進めていますよね。自分だけの「デジタルな自動販売機」や「世界中から資金が集まる仕組み」をコードで作れるなんて、本当にロマンがある技術だと思います。
でも、その一方で、こんな不安を感じたことはありませんか?
「もし、自分が書いた、あるいはコミュニティから提案されたコードの中に、こっそり泥棒を招き入れるような罠が隠されていたらどうしよう……」
そうなんです。Web3の世界では、一度ブロックチェーンにデプロイ(公開)されたコードは、基本的に書き換えることができません。もしバグや悪意あるコードが含まれていたら、一瞬でお金が盗まれてしまう、まさに「一発レッドカード」の世界です。
今回は、DAO(自律分散型組織)の提案実行コードに焦点を当て、「悪意ある外部コントラクトへの呼び出しを、CI/CDパイプラインを使って自動で検知・ブロックする方法」について、身近な防犯のたとえを交えながら、一歩ずつ優しく解説していきますね!
—
家の鍵と泥棒に例える「DAOの提案実行リスク」
まずは、少し想像してみてください。
あなたは、家族みんなでお金を出し合って管理する「大きなお財布(DAOの金庫)」を持っています。このお財布からお金を取り出したり、使い方を決めたりするには、家族全員で投票(提案の可決)を行うルールになっています。
さて、ここに「近所の便利屋さんにお金を払って、庭の芝生を刈ってもらおう!」という提案が出たとします。
普通なら、便利屋さんの口座番号に直接お金を振り込みますよね。
しかし、もしその提案の中に、こんな悪巧みが隠されていたらどうでしょう?
*「庭の芝生を刈るついでに、お父さんの部屋の合鍵を勝手に複製して、夜中に金庫の全財産を別の泥棒の口座に自動送金するプログラムも一緒に実行しちゃおう!」*
これが、スマートコントラクトにおける「意図しない外部コントラクトの呼び出し」の恐怖です。
DAOの投票で可決されたコード(提案)が、一見すると正しい処理をしているように見せかけて、裏でこっそり別の危険なプログラムを呼び出してしまう。人間の目だけでこれをすべてチェックするのは、夜道で忍者のような泥棒を見つけるくらい難しいことです。
だからこそ、「人間の目ではなく、ロボット(自動化ツール)に厳しくチェックしてもらおう!」というのが今回のテーマになります。
—
CI/CDパイプラインってなに?(自動見張りの番犬を置こう)
「CI/CD」なんていう小難しい言葉が出てくると、途端に身構えてしまいますよね。でも安心してください。要するに、「開発者がコードをGitHubにアップロードした瞬間から、自動で見張りのロボットがセキュリティチェックを始めてくれる仕組み」のことです。
自宅の玄関に、怪しい人が近づくとピカッと光る「人感センサー付きの防犯ライト」をイメージしてください。あなたが寝ている間も、ロボットが24時間体制でコードの番をしてくれます。
今回は、この防犯ロボットに「Slither(スリザー)」という有名な静的解析ツールを組み込みます。Slitherは、コードを実際に実行しなくても、ソースコードを読んだだけで「おいおい、ここから外部の変なコントラクトを呼び出そうとしてるぞ!」と見つけ出してくれる優秀な番犬です。
—
実践:自動チェックの仕組みを作ってみよう!
それでは、実際にGitHub Actionsという無料の自動化ツールを使って、提案コードの監査パイプラインを構築してみましょう。
一歩ずつ進めますので、ついてきてくださいね!
1. プロジェクトにSlitherの設定ファイルを追加する
まずは、解析ツールであるSlitherが、どのようなルールでチェックを行うかを教えるための設定ファイルを作ります。プロジェクトのルートディレクトリ(一番上の階層)に、slither.config.jsonというファイルを作成し、以下のコードを保存してください。
{
"detectors_to_exclude": "reentrancy-enumerable",
"filter_paths": "node_modules",
"print": "inheritance-graph"
}
- 日本語解説:
- ここでは、解析から除外する項目や、チェック対象外とするフォルダ(
node_modulesなど、自分が書いていない外部ライブラリのフォルダ)を指定しています。余計なアラートでロボットがパニックを起こさないための工夫です。
—
2. GitHub Actionsのワークフローを設定する
次に、GitHubに対して「コードが更新されたら、自動でSlitherを動かしてね」と命令するためのファイルを作ります。
プロジェクトフォルダの中に、.github/workflows/audit.ymlというフォルダとファイルを作成し、以下のコードを書き込んでください。
# ワークフローの名前(GitHubの画面に表示されます)
name: DAO Proposal Security Audit
# いつこの自動チェックを動かすか(mainブランチにコードが送られた時や、プルリクエストが作られた時)
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
slither-analysis:
name: Slither 静的解析チェック
runs-on: ubuntu-latest
steps:
# 1. GitHubから最新のコードをごっそり持ってきます
- name: コードをチェックアウト
uses: actions/checkout@v3
# 2. Pythonの環境を整えます(SlitherはPython製のため)
- name: Pythonのセットアップ
uses: actions/setup-python@v4
with:
python-version: '3.10'
# 3. Slitherツールをインストールします
- name: Slitherのインストール
run: |
pip install slither-analyzer
# 4. 実際にSlitherを動かして、コードに危険な外部呼び出しがないかスキャンします
- name: Slitherで脆弱性スキャンを実行
run: |
slither . --config-file slither.config.json
- 日本語解説:
- この設定ファイルをプロジェクトに含めてGitHubにプッシュしておくと、誰かが危険なコード(意図しない外部コントラクトを呼び出すコードなど)を含んだ提案をプルリクエストとして送ってきた瞬間に、自動でロボットが動き出し、「おい、このコードは危ないぞ!」と赤信号(エラー)を出してマージ(統合)を止めてくれます。
—
防御の要:なぜ「静的解析」が必要なのか?
「テストネットで実際に動かして試せばいいんじゃないの?」と思われるかもしれません。
しかし、ブロックチェーンの世界では、本番環境やテストネットにデプロイする前に防ぐことが何よりも重要です。
なぜなら、悪意あるスマートコントラクトは、「特定の条件が揃った時だけ発動する(普段は普通の顔をしている)」ように巧妙に作られていることが多いからです。人間の目では見逃してしまうようなわずかな記述ミスや、予期せぬ外部コントラクトへのインターフェース(call関数などの乱用)を、CI/CDパイプラインという機械の目で網羅的にキャッチする。これが、現代のセキュアなDAO運営における必須の防犯対策なのです。
—
まとめ:一歩ずつ、安全なWeb3の世界へ
今回は、DAOの提案実行コードにおけるリスクと、CI/CDパイプラインを用いた監査の自動化についてご紹介しました。
- DAOの提案には、意図しない外部コントラクトを呼び出す隠れたリスクがある。
- 人間の目だけに頼らず、GitHub Actions等のCI/CDツールを使う。
- Slitherなどの静的解析ツールを組み込み、番犬として24時間働いてもらう。
セキュリティ対策と聞くと、「なんだか難しそう、自分には無理かも……」と感じてしまうかもしれませんが、今回のように一つひとつの仕組みを紐解いていけば、決して越えられない壁ではありません。
まずは小さなプロジェクトに今回紹介した設定を取り入れて、自動で番犬が動く様子を確認してみてくださいね。一歩ずつ、安全で信頼できるスマートコントライターを目指して一緒に頑張りましょう!
コメント