コンテンツへスキップ
0%

Solidity console logとは?

執筆者 Turja

2022年10月4日 公開読了時間 1 分

デバッグは、Solidityスマートコントラクトの書き方を学ぶ上で、脆弱性へのパッチ適用や問題のあるバグの修正と並んで、重要かつ繰り返し発生するステップです。スマートコントラクトにおける典型的な開発エラーには、ランタイムエラーとロジックエラーの2種類があります。

開発者の理解を助けるツールを活用することで、より簡単な開発体験が実現できます。特にプログラム内のエラー修正においてはなおさらです。JavaScript開発と同様に、console.log()関数はウェブコンソールに出力メッセージを返すために使用され、デバッグプロセスを助けます。

console.log()はパラメータ(配列、オブジェクト、メッセージなど)を受け取り、開発者が評価できるようにその値をウェブコンソールに出力します。このメソッドにより、開発者はコードの出力をステップごとに確認しながら、発生し得る問題を追跡できます。

この記事では、Solidityをデバッグするための主な方法を紹介し、Hardhat、Foundry、Truffle、Brownieのデバッグツールを確認した上で、デバッグのヒントを提供します。

Solidityのconsole logとは?

コンソールへのロギングはコードのデバッグに使われる一般的なツールであり、console.log()は**Hardhatが提供するコントラクトライブラリの関数です。**コンソールへの出力によるロギングは、開発者がプログラム内の問題を理解し、トラブルシューティングするのに役立ちます。Solidityでは、これはイベントと呼ばれます。

Ethereumはロギング機能を提供しており、トランザクションのログデータ構造にデータをブロックチェーン上に保存します。Solidityのイベントはこの機能への抽象化を提供し、開発者がブロックチェーン上にデータを出力できるようにします。

ログはブロックチェーン上のコントラクトアドレスと共に保持され、ブロックと共にアクセス可能であり続けるため、Solidity開発者は特定のトランザクションデータについてブロックチェーンにクエリを実行し、参照することができます。

Solidityイベントの使用例

Solidityイベントは、スマートコントラクトのテスト、トランザクションデータのインデックス作成、フロントエンド開発での参照など、さまざまな方法で使用できます。最も一般的には、開発者は次の3つのユースケースでイベントを使用します。

  1. フロントエンドで使用できる値を返すためにスマートコントラクト内で使用する
  2. スマートコントラクトがイベントを発行し、フロントエンドにアクションを実行させる非同期トリガーとして使用する
  3. データがトランザクションログに保存されるため、より安価なストレージ形態として使用する

イベント内では、パラメータをindexedまたはnon-indexedとして指定できます。ログ内のトランザクションデータは、コントラクトが検証されている場合はエンコードされた状態で表示され、そうでない場合はnon-indexedまたはハッシュ化された状態で表示されます。

その他のケースでは、Hardhatのようなサポート環境内で開発プロセスが行われる場合、console.log()関数をイベントに加えて使用することができ、これはJavaScript開発と同様に機能します。

なぜconsole logが重要なのか?

**Console logは、スマートコントラクトのデバッグプロセスにおいて開発者にとって必要不可欠なツールです。**Console logは、プログラムのテスト環境(console)とデータを出力するための関数(log())を組み合わせたものです。

つまり、console logはテスト環境におけるプログラムの出力を提供し、それを開発およびデバッグプロセスで活用できます。プログラムでエラーや問題が発生した場合、console logはコードを検査してバグの根本原因を特定するための最初のステップとして使用されます。

Solidityスマートコントラクトを書く際にも、console logは同様に、コードを取り出しロジックを理解するデバッグプロセスにおいて有効なステップとなります。

Solidityのロギングはどのように機能するのか?

ロギングは、イベント監視プロトコルまたはイベントとも呼ばれ、トランザクションやブロックによって生成される信号を結果として発生させます。これはスマートコントラクトからは取得できない情報を提供するために使用されます。

Solidityには「イベント」という概念があります。イベントはスマートコントラクトの関数内で発行することができ、0~4個のトピックを持つことができ、これらは高速な検索のためにインデックス化されます。Solidityでは、イベントの発行には「emit」キーワードが使用されます。これはEVMのオペコードであるLOG0、LOG1、...、LOG4のいずれかに変換されます。

コントラクトのデータはStates trieに存在し、イベントデータはTransaction Receipts trieに保存されるため、スマートコントラクトはイベントデータを読み取ることができません。

トランザクションデータまたはログエントリは、以下で構成されます。

  • Address - コントラクトのアドレス
  • Topic - イベントのindexedな値
  • Data - イベントのABIエンコードされた値、またはnon-indexedな値

Hardhatにおけるsolidityデバッグツール

Hardhatは、開発者がSolidityスマートコントラクトをローカルで開発できるようにし、必須のSolidityデバッグツールを提供することに重点を置いたEthereum開発環境です。

Hardhatは、アプリのテスト、コンパイル、デプロイ、デバッグのための一連のツールを提供します。Hardhat Networkを活用することで、開発者はSolidityインターフェースを通じてローカルマシンからスマートコントラクトを作成、コンパイル、デプロイできます。

1. Console.log

Hardhat Network内では、console.log()関数を、ログメッセージを出力しSolidityコードから直接詳細を取り出すための信頼できるツールとして使用できます。Hardhat Networkは、トランザクションが失敗するかどうかにかかわらず、柔軟かつ包括的な実行の検査を提供するよう設計されています。

Solidityのconsole logを出力する方法

Solidityのconsole logは、JavaScriptと似た構造で出力できます。importが完了したら、console.log()関数を関数内で使用し、スマートコントラクトの文脈に応じて特定の出力を出力できます。以下のコードはそのプロセスを示しています。

まず、hardhat/console.solをスマートコントラクトにインポートします

次に、console.log()関数をスマートコントラクト内の特定の関数に追加します:

注:Hardhatのconsole logツールは、hardhat/console.solがスマートコントラクトにインポートされている場合にのみ使用できます。

2. Solidityのスタックトレース

Hardhatのスタックトレースツールは、JavaScriptとSolidityを組み合わせたもので、トランザクションが発生したり呼び出しが失敗したりした際にレポートを提供します。この自動化されたエラーレポーティングは、開発者がスマートコントラクトを評価しデバッグするための貴重な情報を提供します。

3. 明示的なエラー

Hardhatは、開発者がデバッグプロセスを簡素化するのに役立つさまざまなエラーを提供しています。これには以下が含まれます。

  • general
  • network
  • task definition
  • arguments
  • dependencies resolution
  • built-in tasks
  • artifacts
  • plugins
  • internal
  • source names
  • contract names

Solidity console logのヒント:イベントと関数を使ってデバッグを改善する

イベントは、トランザクションログからコンソールへデータを出力するために、デバッグ段階と本番段階の両方で使用できます。イベントは、あるプロセスが発生したかどうかを示すマーカーとして機能します。さらに、イベントは特定のステップで問題が発生したかどうかを示します。このプロセスは、Solidityの「require」キーワードに似ています。これは条件が真であるかどうかをチェックし、必要な条件が真である場合にのみコードの流れを許可します。

イベントと関数を使ってデバッグを改善するには、まず適切に定義されたイベントを作成し、そのイベントを関数内で発行(emit)します。これら2つのステップにより、関数が呼び出されるたびにイベントが確実に発生するようになります。

その他のSolidity console logツール

Hardhatはスマートコントラクトの構築、テスト、デバッグのための業界標準のSolidity開発ツールですが、Solidityコードのトラブルシューティングには他にもいくつかのツールがあります。Foundry、Truffle、Brownieなどです。

1. Foundry

Foundryは、依存関係の管理、スマートコントラクトのコンパイル、デプロイ、テスト、オンチェーンでの操作を可能にする一連のEthereumスマートコントラクト開発ツールを提供します。

Foundryツールキットは、デバッグプロセスにおいてconsole.log()関数を活用するためにHardhatと統合できます。開発者は、uint、string、bool、addressを含む最大4個のパラメータでこの関数を呼び出すことができます。

Forge

Forgeは、スマートコントラクトのテスト、ビルド、デプロイのためにFoundryと統合されたコマンドライン(CLI)ツールです。このテストフレームワークにより、開発者はJavaScriptまたはTypeScriptを使ってSolidityでテストを作成でき、デバッグプロセスのための数多くの機能も利用できます。

forge testコマンドはSolidityのテストを自動化し、さらにログやスタックトレースを含む結果のサマリーを提供します。forge debugコマンドは、単一のスマートコントラクトをスクリプトとしてレビューし、プログラム内のエラーを特定するインタラクティブなデバッガーでもあります。

Cast

CastはEthereumのRPC呼び出しとやり取りするコマンドラインインターフェース(CLI)ツールです。これには、コマンドラインを介したスマートコントラクトの呼び出し、トランザクション、チェーンデータの取得が含まれます。

Anvil

Anvilは、Foundryと統合されたローカルテストネットノードであり、フロントエンドから、またはEVM(Ethereum Virtual Machine)互換ネットワークとのRPC(Remote Procedure Calls)を介したやり取りを通じて、スマートコントラクトのデプロイとテストを可能にします。

2. Truffle

Truffleは、開発環境、テストフレームワーク、ブロックチェーン向けアセットパイプラインという3つのEthereumスマートコントラクト開発者向けツールを提供しています。Truffleの包括的なエコシステムは、開発者がエンドツーエンドの分散型アプリケーションを作成、テスト、デバッグするためのさまざまなツールを提供します。

Truffleが提供するこれらのツールセットは以下の通りです:

  • スマートコントラクトツールキット - コンパイル、リンク、デプロイなど
  • デバッグ - ブレークポイント、変数解析、ステップ機能、自動化されたコントラクトテスト
  • 管理 - ネットワーク、パッケージ、マイグレーションフレームワーク

詳細はこちら: https://trufflesuite.com/docs/truffle/

3. Brownie

Brownieは、SolidityとVyperをサポートするEthereum向けのPythonベースのスマートコントラクト開発・テストフレームワークであり、テスト、デバッグ、インタラクション、デプロイの4つのカテゴリーに分かれています。各ステップは、開発者が柔軟なプログラムを作成するのを支援します。

開発者は、トランザクション失敗に関する詳細情報を収集し、Solidityのエラーを特定・再現・トラブルシューティングするために、さまざまなデバッグツールにアクセスできます。

  • TransactionReceipt.revert_ms - トランザクション失敗に対する直接的な説明メッセージを取得する
  • TransactionReceipt.error() - トランザクションを失敗させた根本原因とスマートコントラクトの該当箇所を特定する
  • TransactionReceipt.events - revertされたトランザクションで発行されたイベントを確認する
  • TransactionReceipt.trace - トランザクション情報を含む辞書のリストを確認する
  • TransactionReceipt.call_trace() - トランザクションのステップの完全なマップ(トレース)を確認する

開発者は、スマートコントラクトの単体テストにpytestを活用し、提供されるstack traceレポートを確認することもできます。

詳細はこちら: https://eth-brownie.readthedocs.io/en/v1.2.1/index.html

Alchemy UniversityでSolidityのconsole logについて学ぶ

この記事では、Solidityスマートコントラクトを開発する上で最も一般的なロギングおよびデバッグツールを紹介しました。Solidityを学んでいるのであれば、スマートコントラクトのデバッグに最適なツールを選ぶことは、Solidity開発で直面する問題を解決する上で不可欠です。

Solidity開発のトレーニングを始める、または加速させるには、Alchemy Universityの無料の7週間のSolidity開発者ブートキャンプをぜひご覧ください。もともとはChainShotが提供する3,000ドルの認定コースでしたが、現在は完全にAlchemyに統合されています!開発全般に初めて触れる方には、Alchemyの3週間のJavaScriptクラッシュコースが、Ethereumのブートキャンプを始める前の前提知識として最適です。

Background gradient

ブロックチェーンで魔法を生み出す

Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。