こんにちは!ブロックチェーンの世界へようこそ。
スマートコントラクトの開発、日々楽しく進めていらっしゃいますか?「コードは法律」なんて言われる世界ですから、自分が書いたプログラムにバグがないか、リリース前はドキドキしてしまいますよね。
今日は、そんなスマートコントラクトのセキュリティを守る強力な相棒「Slither(スリザー)」というツールについて、一緒に優しく学んでいきましょう!
「セキュリティツールなんて難しそう…」と思うかもしれませんが、大丈夫です。身近な例えを交えながら、一歩ずつ分かりやすく解説していきますね。
—
1. スマートコントラクトのセキュリティを「お家の防犯」に例えてみよう
突然ですが、あなたが新しく建てたマイホームを想像してみてください。
ピカピカの我が家、とてもワクワクしますよね。でも、夜泥棒に入られたら大変です。そこで、あなたならどうしますか?
- 頑丈な鍵をかける
- 防犯カメラを設置する
- 窓にセンサーをつける
スマートコントラクトもこれと全く同じです。ブロックチェーン上にデプロイ(公開)されたスマートコントラクトは、一度動かすと修正がとっても大変。世界中の悪意あるハッカー(泥棒)から、いつでも狙われている状態になります。
だからこそ、家を建てる前(=ブロックチェーンに載せる前)に、設計図や実際の建物をしっかりチェックして、「あ、ここ鍵がついてないよ!」「この窓、外から簡単に開いちゃうよ!」と教えてくれる存在が必要になります。
それが、今回ご紹介する静的解析ツール「Slither」なんです!
—
2. Slitherってどんなツール?(自動防犯チェックマシーン)
Slitherは、Pythonで書かれたスマートコントラクト専用の静的解析ツールです。
「静的解析」って聞くと難しそうですが、要するに「コードを実行しないで、上から順に眺めておかしなところを見つけ出す、超優秀なロボット検品員」だと思ってください。
Slitherのすごいところは、Solidity(スマートコントラクトを書く言語)のコードを読み込んで、内部で「抽象構文木(AST)」という複雑なデータ構造に変換し、私たちが気づきにくい典型的なバグ(例えば「再入可能性攻撃」や「変数の初期化忘れ」など)を秒速で見つけてくれる点です。
人間の目だと、何千行もあるコードをチェックしているうちに疲れて見落としてしまいますが、Slitherなら疲れることもなく、一瞬でチェックを完了してくれます。まさに頼れる防犯センサーですね。
—
3. 基本の使い方:まずはSlitherを動かしてみよう
それでは、実際にSlitherを使ってみる流れを見ていきましょう!
※あらかじめ、お使いのパソコンにPythonとNode.js、そしてHardhatなどの開発環境が入っている前提で進めますね。
ターミナルを開いて、以下のコマンドでSlitherをインストールします。
# pipを使ってSlitherをインストールします
pip install slither-analyzer
インストールができたら、ご自身のスマートコントラクトのプロジェクトフォルダ(HardhatやFoundryを使っている場所)に移動して、以下のコマンドを叩くだけです。
# プロジェクト内のコントラクトを自動スキャンする
slither .
これだけで、Slitherが自動でコードを解析し、危険度(High、Medium、Low、Informational)に合わせて警告を出してくれます。「おめでとうございます、ここが危ないですよ」と優しく(時には厳しく)教えてくれるので、あとは指摘された場所を一つずつ直していくだけです!
—
4. ここからが本番!プロジェクト固有のルールを教え込む「カスタム検出器」
さて、ここからが今回のメインディッシュです。
Slitherには最初からたくさんの「有名なバグを見つけるルール」が入っていますが、実は「自分たちのプロジェクトだけの特別なルール」を教え込むことができます。
例えば、「うちのプロジェクトでは、特定の運営アドレス(owner)以外は、この重要な関数を絶対に呼び出しちゃいけないんだ!」という独自のビジネスロジックがあったとします。汎用的なツールは「一般的なバグ」は知っていても、あなたのプロジェクトのそんな「独自のルール」までは最初からは分かりませんよね。
そこで、Slitherに独自のルールを教え込む「カスタム検出器(Custom Detector)」を作ってみましょう!
Pythonでカスタム検出器を書こう
Slitherの検出器はPythonで記述します。プロジェクトフォルダの中に、例えば my_custom_detector.py というファイルを作ってみましょう。
以下のサンプルコードを見てください。ここでは、「特定の関数にアクセス制限(モディファイア)がちゃんとついているか」をチェックする簡単なカスタム検出器の例です。
from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification
from slither.utils.output import Output
class MissingModifierDetector(AbstractDetector):
# Slitherの管理画面やCLIで表示される識別子と詳細情報
ARGUMENT = 'missing-modifier'
HELP = '特定の重要関数に専用のアクセス制限がついていません!'
IMPACT = DetectorClassification.HIGH
CONFIDENCE = DetectorClassification.HIGH
def _detect(self):
results = []
# コントラクト内のすべての関数をループしてチェックします
for contract in self.slither.contracts:
for function in contract.functions:
# 例として、名前に "transferOwnership" が含まれる関数をチェック
if "transferOwnership" in function.name:
# もしモディファイア(アクセス制限)が設定されていなかったら…!
if not function.modifiers:
# 危険信号としてリストに記録します
info = [
"警告: 関数 ",
function,
" にはアクセス制限のモディファイアが設定されていません。誰でも実行できる危険があります!\n"
]
results.append(self.generate_result(info))
return results
なんだかPythonのコードも、コメントを読めば「何をチェックしようとしているのか」スッキリ分かりますよね。
このように、自分たちのプロジェクトで「絶対にやってはいけないルール」をPythonでコード化してSlitherに読み込ませることで、自動チェックの網をさらに分厚くすることができるのです。
作成したカスタム検出器は、以下のコマンドでSlitherに読み込ませて実行できます。
# 自作のカスタム検出器を指定してスキャンを実行する
slither . --detectors-to-include my_custom_detector
これで、チーム固有のうっかりミスや、ビジネスロジックの設計ミスをCI/CDパイプライン(GitHub Actionsなど)で自動的に弾き飛ばすことができるようになります!
—
5. まとめと、安全な開発を続けるための心構え
今回は、スマートコントラクトの静的解析ツール「Slither」の基本と、プロジェクト固有のルールを守るための「カスタム検出器」の作り方についてご紹介しました。
セキュリティ対策というと「難しそう」「面倒くさそう」と感じてしまいがちですが、Slitherのようなツールを味方につければ、開発の早い段階でバグを潰し、自信を持ってデプロイできるようになります。
お家の鍵を毎日ちゃんとかけるように、スマートコントラクトをデプロイする前には必ずSlitherを走らせる――。そんな習慣を、ぜひ今日からあなたの開発チームにも取り入れてみてくださいね。
それでは、安全で素晴らしいWeb3ライフを!一歩ずつ、確実にセキュリティを固めていきましょう!
コメント