【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の使い方について学びました。適切にエラーチェックを行い、安全で信頼性の高いスマートコントラクトを作成しましょう。