言語の基本を理解する
通常、すべての Solidity コントラクトには次のものが含まれています。
- pragma ディレクティブ
- 状態変数
- 関数
- events
実稼働レベルのスマート コントラクトをプログラミングするために知る必要があることは他にもありますが、これらのことを知れば順調に作業を開始できます。
これらの概念を理解すれば、さまざまなユース ケースのスマート コントラクトの作成をすぐに開始できます。
pragma ディレクティブ
pragma は、コンパイラに対して、その Solidity のバージョンが必要なものと一致しているかどうかを確認するために使うキーワードです。 一致している場合、ソース ファイルを正常に実行できることを意味します。 一致していない場合は、コンパイラのエラーが発生します。
必ず Solidity の最新バージョンをコントラクト定義に含めるようにします。 Solidity の現在のバージョンを確認するには、Solidity の Web サイトを参照してください。 最新のバージョンをソース ファイル内で使用します。
バージョンの pragma ディレクティブは次のようになります。
pragma solidity ^0.7.0;
この行は、ソース ファイルが、バージョン 0.7.0
よりも上の 0.7.9
までのコンパイラでコンパイルできることを意味します。 バージョン 0.8.0
以降は、ソース ファイルを正常にコンパイルできない破壊的変更が発生する可能性があります。
状態変数
状態変数は、どの Solidity ソース ファイルにとっても重要です。 状態変数の値は、コントラクト ストレージに永続的に格納されます。
pragma solidity >0.7.0 <0.8.0;
contract Marketplace {
uint price; // State variable
Note
コントラクトのソース ファイルは常に、contract ContractName の定義で始まります。
この例では、状態変数を型 uint の price
という名前にしています。 整数型の uint は、この変数が 256 ビットの符号なし整数であることを示します。 つまり、0 から 2256 -1 までの範囲にある正の数値を格納できます。
すべての変数の定義について、型と変数名を指定する必要があります。
また、状態変数の可視性を次のように指定することもできます。
- public: コントラクト インターフェイスの一部であり、他のコントラクトからアクセスできます。
- internal: 現在のコントラクトからのみアクセスされます。
- private: 定義されているコントラクトに対してのみ公開されます。
関数
コントラクト内では、実行可能なコード単位は関数と呼ばれます。 関数によって、1 つのタスクを実現するための 1 つのアクションを記述します。 これらは再利用可能であり、ライブラリなどの他のソース ファイルからも呼び出すことができます。 Solidity の関数は、他のプログラミング言語の関数と同様に動作します。
関数を定義する基本的な例を次に示します。
pragma solidity >0.7.0 <0.8.0;
contract Marketplace {
function buy() public {
// ...
}
}
このコードは、他のコントラクトからアクセスできることを意味する public の可視性を持つ、buy
という名前の関数を示しています。 関数には次の可視性指定子のいずれかを使用できます: public、private、internal、external。
関数は、内部的に、または別のコントラクトから外部的に呼び出すことができます。 関数を使用すると、それらの間でパラメーターと値を渡すために、パラメーターを受け取り、変数を返すことができます。
パラメーターである price
という整数を受け取り、整数を返す関数の例を次に示します。
pragma solidity >0.7.0 <0.8.0;
contract Marketplace {
function buy(uint price) public returns (uint) {
// ...
}
}
関数の修飾子
関数の修飾子を使用すると、関数の動作を変更できます。 これらは、関数が実行される前に条件をチェックすることによって機能します。 たとえば、販売者として指定されたユーザーのみが販売目的の品目を掲載できるようにすることができます。
pragma solidity >0.7.0 <0.8.0;
contract Marketplace {
address public seller;
modifier onlySeller() {
require(
msg.sender == seller,
"Only seller can put an item up for sale."
);
_;
}
function listItem() public view onlySeller {
// ...
}
}
この例には、次の項目が示されています。
- address 型の変数。これには、販売者であるユーザーを表す 20 バイトの Ethereum アドレスが格納されます。 これらの変数については、このモジュールで後ほど詳しく説明します。
- 販売者だけが品目を掲載できることを示す
onlySeller
という修飾子。 - 関数本体が挿入される場所を示す特殊な記号である
_;
。 - 修飾子
onlySeller
を使用した関数定義。
関数定義で使用できるその他の関数修飾子は次のとおりです。
- pure: 状態に対する変更またはアクセスを許可しない関数を表します。
- view: 状態に対する変更を許可しない関数を表します。
- payable: Ether を受け取ることができる関数を表します。
events
イベントは、コントラクト内で実行されるアクションを表します。 関数と同様に、イベントには、イベントが呼び出されたときに指定されている必要があるパラメーターがあります。
イベントを呼び出すには、イベント名とそのパラメーターを指定したキーワード emit を使用する必要があります。
pragma solidity >0.7.0 <0.8.0;
contract Marketplace {
event PurchasedItem(address buyer, uint price);
function buy() public {
// ...
emit PurchasedItem(msg.sender, msg.value);
}
}
イベントを呼び出すと、イベントは、ブロックチェーンの特殊なデータ構造であるトランザクション ログにトランザクションとしてキャプチャされます。 これらのログは、コントラクトのアドレスに関連付けられ、ブロックチェーンに組み込まれて、そこに永続的に維持されます。 ログとそのイベント データは、コントラクト内からアクセスできず、変更することもできません。