スマートコントラクト,DAppsを作成するためのプログラミング言語であるSolidityの基本文法について記載します。
スマートコントラクト,DAppsとは
スマートコントラクトおよびDAppsとは、ブロックチェーンに保存され、所定の条件が満たされたときに仲介者の関与なしに契約の実行を自動化するプログラムのことを指します。
契約のワークフローを自動化して、条件が満たされたときにアクションをトリガーするようなこともできます。
ブロックチェーン上で利用されるこのようなプログラムのことをスマートコントラクトまたはDAppsと呼びます。
次に2つの簡単なスマートコントラクトのコードを紹介します。
値の設定をする簡単なスマートコントラクト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// ソースコードのライセンスがGPLバージョン3.0である事を明示 // SPDX-License-Identifier: GPL-3.0 /* * ソースコードがSolidityバージョン0.4.16からバージョン0.9.0の前までのバージョンであることを明示 * (バージョン0.9.0は含まない) * 明記することによって、作成したスマートコントラクトが新しいコンパイラのバージョンでコンパイルできないことを保証する */ pragma solidity >=0.4.16 <0.9.0; //コントラクトを定義 この中にスマートコントラクトの処理を記載します contract Sample { // uint (256ビットの unsigned integer)型の storedUintData という状態変数を宣言 uint storedUintData; //xという値を受け取り、storedUintDataに設定するためのsetファンクション function set(uint x) public { storedUintData = x; } //呼び出されたら、storedUintDataを返すgetファンクション function get() public view returns (uint) { return storedUintData; } } |
OpenZeppelinのフレームワークを利用したスマートコントラクト
1 2 3 4 5 6 7 8 9 10 |
// SPDX-License-Identifier: MIT pragma solidity >=0.4.16 <0.9.0; //OpenZeppelinのNFTライブラリをインポート import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; //OpenZeppelinライブラリのERC-721実装を継承し、MYNFTという独自のコントラクトを宣言 contract MyNFT is ERC721 { constructor() ERC721("MyNFT", "MNFT") { } } |
Solidityの基本文法
上記の二つのソースコードをもとにSolidityの基本的な文法を解説します。
Pragma
Pragmaとは、作成したSolidityに使用するコンパイラのバージョンを指定する手法です。
Solidityファイル内で一番最初に記載されるべきコードと定義されています。
Solidityはまだ出来たばかりの比較的新しいプログラミング言語です。現在も継続的に日々新しい機能や改善が導入されています。
上記2つのソース コードではSolidity バージョン 0.4.16からバージョン 0.9.0 までの機能をサポートしていることを明記していますが、下記のように記載し、コンパイラのバージョンを指定することもできます。
1 |
pragma solidity ^0.4.0; |
Contract
Solidity のContractとは、Ethereum ブロックチェーンの特定のアドレスに存在するコードとデータのコレクションを指します。
上記1つ目のスマートコントラクトでは、Sample というContractを定義しています。
そのコントラクトの中で、storedUintData という状態変数を宣言し、set および getファンクションを使用して、宣言した変数の値を変更または取得できるスマートコントラクトを定義しています。
Importing Files
SolidityではJavaScriptによく似た import ステートメントをサポートしています。
下記のimportの例では、”sample.sol” からすべてのグローバルシンボルをインポートしています。
1 |
import "sample.sol"; |
下記のimportの例では、”sample.sol” のすべてのグローバルシンボルをメンバーとする新しいグローバルシンボルnewSampleを作成しています。
1 |
import * as newSample from "sample.sol"; |
なお、現在のファイルと同じディレクトリからファイル x をインポートする場合、下記のようになります。
1 |
import "./x" as x; |
Comment
Solidityのコメント機能は、CとC++のコメントと同じような手法をサポートしています。
- // と行末の間のテキストはコメントとして扱われ、Solidity Compiler によって無視されます。
- 文字 /* と */ の間のテキストは、コメントとして扱われ、複数の行にまたがる場合も有効です。
1 2 3 4 5 6 |
// これはコメントです。 /* * これは複数行にわたるコメントをSolidityで表現した場合の例です * C,C++またJSに非常に似たコメントのやりかたですね */ |
基本データ型
Solidityの基本データ型は下記の通り。
int | 符号付き整数 |
uint | 符号なし整数 |
string | 文字列 |
bool | ブーリアン |
Array | 配列 |
Struct | 構造体 |
address | アドレス |
mapping | マッピング・連想配列 |
以下のコードは、異なるタイプのValues Typesの値を初期化しているコントラクト例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// SPDX-License-Identifier: MIT pragma solidity >=0.4.16 <0.9.0; contract SolidityTypes { // int型の初期化 int public intTest = 100; // 文字列型の初期化 string public str = "0xBrokers"; // ブーリアン型の初期化 bool public boolean = false; // Enumの定義 enum enum_0xbrokers { masa_, _0x, _brokers } //Enum型に設定された値を返すファンクション function Enum() public pure returns(enum_0xbrokers) { return enum_0xbrokers._brokers; } } |
Solidityのキーワード(予約語)
Solidityのキーワード(予約語)は下記の通り。
変数名、関数名、クラス名などの名前(識別子)として下記の名前は利用できません。
- abstract
- after
- alias
- apply
- auto
- case
- catch
- copyof
- default
- define
- final
- immutable
- implements
- in
- inline
- let
- macro
- match
- mutable
- null
- of
- override
- partial
- promise
- reference
- relocatable
- sealed
- sizeof
- static
- supports
- switch
- try
- typedef
- typeof
- unchecked
今回紹介したSolidityの仕様やコードをRemix IDEやHardhatで実際に実行やテストをして確認してみましょう。
実際に動かしたり、テストすることで理解が深まるかと思います。
hardhatのインストール手順
HardhatでスマートコントラクトのDeploy手順