Vyper

【Vyper】第3章第5回:エラーハンドリング:assertとraiseの使い方

本記事では、Vyperにおけるエラーハンドリングの方法について解説します。スマートコントラクトの安全性を向上させるために、assertとraiseを適切に活用し、バグや不正アクセスを防ぐ手法を学びます。

0. 記事の概要

この記事を読むメリット

  • Vyperのエラーハンドリングの基本を理解できる
  • assertとraiseの違いと適切な使い分けを学べる
  • 安全なスマートコントラクトの設計方法を習得できる

1. Vyperにおけるエラーハンドリング

スマートコントラクトはブロックチェーン上で実行されるため、一度デプロイされると修正が困難です。そのため、適切なエラーハンドリングを行い、異常な動作を事前に防ぐことが重要です。

1.1 エラーハンドリングの重要性

  • 不正アクセスの防止: 不正な操作を制限し、セキュリティを向上させる
  • デバッグの容易化: エラーの発生箇所を特定しやすくする
  • スマートコントラクトの信頼性向上: 予期しない動作を未然に防ぐ

1.2 Vyperでのエラーハンドリングの方法

  • assert: 条件を満たさない場合にエラーを発生させる
  • raise: 明示的にカスタムエラーを発生させる

2. assertの使い方

assertは、特定の条件を満たさない場合にエラーを発生させるために使用されます。スマートコントラクトの動作を保証するために便利です。

2.1 基本的なassertの使い方


        @public
        def check_balance(amount: uint256):
            assert self.balance >= amount, "残高不足"
        

動作解説

  • assert self.balance >= amount – 送金額が残高以上であることをチェック
  • “残高不足” – 条件を満たさない場合にエラーメッセージを返す

2.2 assertを使ったアクセス制御


        owner: public(address)

        @public
        def change_owner(new_owner: address):
            assert msg.sender == self.owner, "許可されていません"
            self.owner = new_owner
        

動作解説

  • assert msg.sender == self.owner – 呼び出し元が所有者であることをチェック
  • self.owner = new_owner – 新しい所有者に変更

3. raiseの使い方

raiseを使用すると、カスタムエラーメッセージを発生させることができます。より詳細なエラーハンドリングが可能になります。

3.1 基本的なraiseの使い方


        @public
        def withdraw(amount: uint256):
            if amount > self.balance:
                raise "引き出し額が残高を超えています"
            self.balance -= amount
        

動作解説

  • if amount > self.balance – 引き出し額が残高を超えていないか確認
  • raise “引き出し額が残高を超えています” – 条件を満たさない場合にエラーを発生

4. 練習問題

4.1 練習問題

以下の課題に挑戦してください。

  • 特定の関数を管理者のみが実行できるようにassertを使って制限する
  • 条件を満たさない場合にraiseでカスタムエラーメッセージを返す関数を作成する

5. まとめ

本記事では、Vyperにおけるエラーハンドリングの方法として、assertとraiseの使い方について学びました。適切にエラーチェックを行い、安全で信頼性の高いスマートコントラクトを作成しましょう。