1. 変数宣言と一般的なデータ型#
特別なタイプである address(アドレス)を除いて、Solidity の変数とデータ型は一般的なプログラミング言語に似ており、具体的な説明は以下の通りです:
2. 列挙型
Solidity では、一連の定数を定義する必要がある場合、列挙型を定義することで実現できます。列挙型を定義するには enum キーワードを使用し、以下の例では色の列挙型を定義しています。この列挙型には赤、黄、緑の 3 色があり、それぞれの値は 0、1、2 です。
3. 構造体
構造体は struct キーワードを使用して定義されます。以下の例では、Player という名前の構造体を定義しており、この構造体にはアドレス(addr)と数量(amount)の 2 つの属性が含まれています。アドレスは address 型で、数量は整数型です。具体的なコードは以下の通りです。
4. 関数
Solidity における関数の定義構文は以下の通りです:
ここで、<parameter types>は関数のパラメータとその型を指します。{internal|external} の 2 つのキーワードは関数の呼び出し方法を規定し、internal は内部呼び出しを意味し、コンテキスト環境内のデータを直接使用できます;external はコントラクトの外部メッセージ呼び出しを実現し、デフォルトは internal です。[pure|constant|view|payable] の 4 つのキーワードは関数の属性を示します。pure キーワードは関数型プログラミングに由来し、この関数体が純粋な関数であり、他の関数を呼び出せないことを示します;constant キーワードは定数を定義しますが、Solidity の 0.4.17 以降は使用されません;view キーワードはこの関数が読み取り専用で状態を変更できないことを示します;通貨操作を行う必要がある関数は、必ず payable キーワードを付ける必要があります。[returns(<return types>)] は関数の戻り値の型を示します。
5. コメント#
Solidity のコメント構文は JavaScript と同様で、単一行コメントには “//” を使用し、複数行コメントには “/*” と “*/” を使用します。
//これは単一行コメントです
/*
これは
複数行コメントです
*/
6. ファイル構造#
Solidity 言語において、上記の基本構文を理解するだけでなく、Solidity のファイル構造も理解する必要があります。Solidity ファイルは一般的に.sol をファイル拡張子として使用します。sol ファイルの最初の行はバージョン宣言であり、異なるバージョンが異なる機能をサポートするため、ファイルにはバージョン番号を指定する必要があります。構文は以下の通りです:
pragma solidity ^0.4.0;
上記の行は、この sol ファイルが 0.4.0 以降のバージョンで実行される必要があることを示しており、ここでの “^” 記号は 0.5.0 以降のバージョンをサポートしないことを示します。
以上は Solidity 構文の簡単な紹介であり、詳細な内容は Solidity の公式チュートリアルを参照してください。ここでは詳しく述べません。
: Solidity 言語の公式チュートリアルのアドレスは http://solidity.readthedocs.io/en/develop/types.html です。
スマートコントラクトの開発#
Solidity の基本構文を理解したら、スマートコントラクトの開発を開始できます。Solidity でスマートコントラクトを開発するには、コンパイラをインストールする必要があります。Solidity 言語を学び始めたばかりの読者には、オンライン IDE エディタである Remix の使用をお勧めします。ブラウザに http://remix.ethereum.org と入力すれば使用でき、ローカルにインストールする必要はありません。
1. コンパイラ Remix の使用#
Remix の操作インターフェースは主に 4 つの部分に分かれています。左側はファイルブラウジングエリアで、新しいファイルの作成、ローカルファイルのオープン、GitHub へのコードの更新、すべてのオープンファイルのブラウジングなどの操作ができます;中央上部はコードを編集する場所で、コードの構文がハイライトされ、自動的に構文チェックが行われます。黄色は警告と提案、赤色は構文エラーです;下部は取引の詳細を照会し、スマートコントラクトをデバッグするためのインタラクティブなターミナルインターフェースです;右側は機能パネルで、スマートコントラクトのコンパイル、実行、テストを行います。全体のインターフェースは図 5-21 のようになります。
Remix の機能は非常に強力で、本書では詳しく述べませんが、興味のある読者は Remix の公式サイト https://remix.readthedocs.io/en/latest を訪れて確認できます。次に、Remix コンパイラを使用してスマートコントラクトを開発します。
Remix を開くと、デフォルトで Solidity 言語で書かれた投票のスマートコントラクトの例が表示されます。コードはかなり多く、ここでは詳しく説明しません。ここで Hello.sol という新しいファイルを作成します。左上の “+” ボタンをクリックし、ファイル名を “Hello.sol” と入力し、“OK” ボタンをクリックして保存します。以下のように表示されます。
新しく生成されたファイルの最初の行でコンパイラのバージョンを 0.4.0 以降のバージョンとして宣言し、次に “helloBlockchain” という名前のスマートコントラクトを定義します。このコントラクトには、単に “Hello Blockchain” という文字列を返す renderHello という関数が含まれています。以下のように表示されます。
コードの記述が完了したら、右側の機能パネルでバージョン番号 0.4.25 + のコンパイラを選択してコンパイルします。以下のように表示されます。コンパイルが成功すると、“Hello Blockchain” というスマートコントラクトの名前が表示されます。
次に、“Run” タブをクリックし、実行環境をローカルテスト環境に設定し、“helloBlockchain” スマートコントラクトを選択してから “Deploy” ボタンをクリックしてこのスマートコントラクトをデプロイします。以下のように表示されます。
Remix には 3 つの実行モードがあります。以下の通りです。
●JavaScript VM:このモードはブラウザ内でブロックチェーンをシミュレートし、コントラクトはこのシミュレートされたサンドボックス内で実行されます。ページをリフレッシュするとすべてのデータが消去され、持続性はありません。Web3 オブジェクトは注入されません。
●Injected Provider:Web3 オブジェクトが注入されたソースに接続します。Mist ブラウザまたは MetaMask がインストールされたブラウザでは、自動的にこのモードに切り替わります。
●Web3 Provider:リモートノードに接続します。ソースの URL アドレスとポートを入力する必要があります。例えば、geth、ganache などのクライアントが Web3 オブジェクトを含みます。
ここでは Injected Provider モードを選択します(図中の Provider は Web3 オブジェクト、つまり Injected Web3 です)。
スマートコントラクトのデプロイは、スマートコントラクトを Ethereum に書き込むことです。Ethereum 上での書き込み操作はすべて Ether を消費するため、この操作では Ether が消費されます。ポップアップウィンドウで “Confirm” ボタンをクリックして支払いを確認します。以下のように表示されます。
これでスマートコントラクトがローカルのテスト環境にデプロイされました。スマートコントラクトが成功裏にデプロイされた後、Remix のメインインターフェースの右下隅にデプロイされたスマートコントラクトと使用可能な関数 renderHello が表示されます。renderHello をクリックすると、その関数が呼び出され実行され、出力結果は文字列 “Hello Blockchain” になります。以下のように表示されます。
最後に、スマートコントラクトの開発プロセスをまとめると、全体の流れは以下の通りです。
1)新しい sol ファイルを作成し、スマートコントラクトの機能を記述します。ここでは “Hello Blockchain” を出力する機能を実現します。
2)コンパイラを使用してコードをコンパイルします。
3)エラーがなければ、コンパイラはコンパイル結果を生成し、バイナリファイルを作成します。
4)コンパイルに成功したスマートコントラクトをブロックチェーンシステムにデプロイします。
5)デプロイに成功すると、スマートコントラクトのアドレスとアプリケーションバイナリインターフェース(Application Binary Interface、ABI)が返され、スマートコントラクトと対話するために使用されます。
6)アドレスと ABI を使用してスマートコントラクトを呼び出します。
Truffle フレームワーク#
Solidity の基本構文とスマートコントラクトの開発プロセスを習得したら、DApp の開発フレームワークである Truffle をさらに学ぶことができます。
Truffle は Ethereum ベースの Solidity 言語向けの開発フレームワークです。Truffle は JavaScript に基づいており、DApp の開発をより簡単にすることを目指しています。以下の機能があります。
●組み込みのスマートコントラクトのコンパイル、リンク、デプロイ、およびバイナリファイルの管理。
●スマートコントラクトの自動化テストをサポート。
●スクリプト化された、拡張可能なデプロイとリリースフレームワーク。
●デプロイされたネットワーク環境の管理機能。
●EthPM または npm によるパッケージ管理、ERC190 標準の使用。
●コントラクトと直接通信するインタラクティブコンソール(コントラクトを書いた後、コマンドラインで検証できます)。
●スマートコントラクトの構築プロセスは、ニーズに応じてカスタマイズ可能。
●Truffle 環境内で外部スクリプトを実行することをサポート。
Truffle のインストールと一般的なコマンド#
Truffle はパッケージ管理ツール npm を使用してインストールできます。インストールコマンドは以下の通りです:
$ npm install -g truffle
インストールが完了したら、truffle コマンドを入力すると、その使用方法が表示されます。以下は主要な Truffle コマンドのいくつかの使い方の紹介です。
1. Truffle プロジェクトの初期化 ——truffle init
Truffle プロジェクトを初期化するには、truffle init と入力するだけで空のプロジェクトを初期化できます。first-DApp という名前の新しいフォルダを作成し、そのフォルダに入って truffle init を実行します。以下のように表示されます。
Truffle は自動的に空のプロジェクトを生成します。新しく生成された Truffle プロジェクトには、いくつかのフォルダと設定ファイルが含まれており、contracts フォルダはスマートコントラクトを保存するために使用されます;migrations フォルダはスマートコントラクトのデプロイ機能を実現します;test フォルダはコントラクトのテストファイルを保存するために使用されます;truffle.js はデフォルトの設定ファイルです;truffle-config.js は Windows 用のデフォルト設定ファイルで、ファイル名が truffle コマンドと衝突しないようにしています。Truffle プロジェクトの構造は以下の通りです。
2. コンパイルコマンド ——truffle compile
truffle compile コマンドを実行すると、スマートコントラクトファイルがコンパイルされ、成功すると現在のディレクトリの build フォルダに新しいスマートコントラクトのバイナリファイルが生成されます。以下のように表示されます。
3. デプロイコマンド ——truffle deploy
スマートコントラクトをデプロイする前に、設定ファイルを変更する必要があります。本章で使用するスマートコントラクト開発テスト環境は Ganache であり、そのクライアントはローカルの 7545 ポートをリッスンしているため、truffle.js ファイルを変更してローカルの 7545 ポートに接続する必要があります。以下のように表示されます。
変更が完了したら、スマートコントラクトのデプロイを行います。ターミナルに “truffle deploy” と入力すれば完了します。
4. テストコマンド ——truffle test
truffle test コマンドを実行すると、test フォルダ内のすべてのテストケースが実行されます。このコマンドは.js、.es、.es6、.jsx、.sol の拡張子を持つファイルを自動的に認識し、他の拡張子のファイルは無視されます。
5. ターミナルコマンド ——truffle console
truffle console コマンドを実行すると、インタラクティブなターミナルインターフェースが開き、スマートコントラクトの呼び出しやデバッグが簡単に行えます。
6. テンプレートのダウンロードコマンド ——truffle unbox [box-name]
インストールが完了したら、truffle コマンドを入力すると、その使用方法が表示されます。以下は主要な Truffle コマンドのいくつかの使い方の紹介です。
1. Truffle プロジェクトの初期化 ——truffle init
Truffle プロジェクトを初期化するには、truffle init と入力するだけで空のプロジェクトを初期化できます。first-DApp という名前の新しいフォルダを作成し、そのフォルダに入って truffle init を実行します。以下のように表示されます。
Truffle は自動的に空のプロジェクトを生成します。新しく生成された Truffle プロジェクトには、いくつかのフォルダと設定ファイルが含まれており、contracts フォルダはスマートコントラクトを保存するために使用されます;migrations フォルダはスマートコントラクトのデプロイ機能を実現します;test フォルダはコントラクトのテストファイルを保存するために使用されます;truffle.js はデフォルトの設定ファイルです;truffle-config.js は Windows 用のデフォルト設定ファイルで、ファイル名が truffle コマンドと衝突しないようにしています。Truffle プロジェクトの構造は以下の通りです。
Truffle には非常に便利なコマンドである truffle unbox [box-name] もあります。このコマンドはテンプレートをダウンロードするために使用され、box-name は実際にダウンロードするテンプレートの名前です。次のセクションでは、テンプレートの使用について詳しく説明します。
この drizzle テンプレートを使用するには、まず Truffle と Ganache 環境をインストールする必要があります。前述の通り、すでにインストールが完了しているので、次に truffle unbox drizzle コマンドを実行してこのテンプレートをダウンロードします。
これで DApp 開発に必要な基本知識が紹介され、準備が整いました。次に DApp の実際の開発を開始します。