Solidityの基本的な文法まとめ

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー SEGAさん、DIVAの筐体ください(ズザー

はじめに

今日は、Solidityの基本的な文法を一通り紹介していきたいと思います。

とはいえ、繰り返しですが、僕がブログに書く事なんて、Crypto Zombies の足下にも及ばないですからね!
こんなブログを読んでる暇があったら、 Crypto Zombies をやろう!(笑)

Version Pragma

pragma solidity ^0.4.24

コンパイラのバージョン指定を行います。指定されたバージョン以外のコンパイラではコンパイルされない事を保証します。
つまり、指定しなくても動きます。(たぶん)

上の例では、「0.4.24以上、0.5未満のコンパイラで、どうぞよろしく!」という意味ですね。
バージョンの幅の指定方法は、まあ、おなじみの記法になっております。

Import

import "some.sol";

上記の例は、対象のファイルをそのまま丸ごと取り込むようなイメージです。

ES6よろしくな import 記法もサポートされていて、状況に合わせて様々なインポート方法を選ぶことができるみたいです。

// some.solの中身をsomeに格納
import * as some from "some.sol";
// ES6的ではないけど、上記と同じ意味で
import "some.sol" as some;
// someの中からsymbol1と、symbol2をaliasという名前でインポート
import { symbol1, symbol2 as alias } from "some.sol";

ファイルのパスは、相対パスと絶対パスの違いがあるらしいけど、まあ、そこはいい感じに雰囲気で指定してほしい。

Contract

そもそも、「Contractって何よ?」って話だと思いますが、他言語で言うところの、Class であるとか Interface であるとかを足して2で割ったくらいのイメージでいいと思います。難しい事は考えない主義で!

State Valiables

Contract直下の変数は、基本的にはすべてブロックチェーンに記録されるようです。
また、Solidityは静的な型付け言語のため、変数の定義時に必ず型の指定が必要です。

contract Human {
// この変数を変更すると、それはブロックチェーン上に記録されます
// つまり、この変数を変更するには、ガス料金がかかるのであります
string name;
}

Function

まあ、みんながよく知る関数ですね。注意点としては、「アクセス修飾子は後ろに書く」という事でしょうか。後述しますが、Solidityでは、関数の修飾子は全て後ろに並べます。

contract Human {
// 引数とか、返値の型の指定も必須
function say(string text) public returns (string) {
return text;
}
// 返値に名前をつけられるが、これってドキュメント以上の利用方法って何かあるのかしら?
function eat(string food) public returns (string food) {
return food;
}
}

Modifier

Solidityでは、関数の修飾子を自分で定義する事ができるようになっています。
「修飾子」っていうのは、関数の実行の前後に処理を差し込んで、関数の挙動を制御するためのものです。

contract Human {
bool washedHand = false;
uint hangry = 0;
modifier needWashedHand() {
// さらっと登場しましたが、まあ、assert的なものです
// 条件を満たさない場合にエラーを発生させます
require(washedHand == true);
// `_;` の記述は必須で、元の関数をどのタイミングで呼び出すかを制御している
_;
}
// 引数を取る事も可能
modifier needHangry(uint _hangry) {
require(hangry >= _hangry);
_;
}
function eat(string food) public needWashedHand needHangry(50) returns (string food) {
return food;
}
}

Struct

変哲もない構造体やな!

contract Human {
struct Parameters {
uint height;
uint weight;
address account;
}
}

Enum

列挙型ですな。

contract Human {
enum State { Live, Dead }
State state = State.Dead;
}

さいごに

一通り、Solidityの基本的な文法に関してまとめてみました。
今回 Event に関してはタッチしなかったのですが、別の記事で切り出して解説をしたいなあと思っています。
あと、変数の型に関しても、ブロックチェーン特有の型があるので、別記事で紹介させてください。