プログラミングのゴミ箱

日々の学習の中で知らなかったことについて、調べたことを解説します。

Crypto Zombieで始めるSolidity入門①

今回のシリーズではCrypto ZombieというSolidityの学習が出来るサイト(しかも無料で)の内容を自分なりにまとめます。
入門編はこれ一つで全部学べるみたいなので、みなさんもぜひやってみてください!

cryptozombies.io

コントラクトの書き方

新しいコントラクトを作るときには以下のように書きます。

pragma solidity ^0.4.19;

contract HelloWorld {

}

pragmaというのはsolidityのバージョンを指定してプログラムのバグを起こさないために書くものです。
contractという記述のあとにコントラクト名を書くことで新たなコントラクトを作ることができます。

状態変数

コントラクト内の変数は状態変数と呼ばれます。
普通の変数との違いは、状態変数に記述された値はブロックチェーン上に保存されます。
そう、こんなに簡単にブロックチェーンに値を保存できるんです!

contract Example {
  // この部分がブロックチェーン上に記載される
  uint hoge = 100;
}

uintというのは型のことで、符号なし整数(正の整数)を表しています。

演算

solidityでも普通のプログラミング言語と同じような方法で演算ができます。
注意してほしいのは、同じ型同士でしか演算ができません。これも普通の言語と同じですね。

1 + 2 // 足し算
1 - 2 // 引き算
1 * 2 // 掛け算
1 / 2 // 割り算
1 % 2 // 余り
1 ** 2 // 累乗

型キャスト

どうしても違う型同士で演算したり、状態変数の型を変更したい場合は型キャストを使う。

uint8 a = 5;
uint b = 6;

uint8 c = a * b; // => Error

uint8 c = a * uint8(b); // => Success!

構造体

複雑なデータ型を扱うために構造体というものがあります。
構造体とは複数のプロパティを含む値の雛形のようなものです。

struct Person {
  uint age;
  string name;
}

配列

配列は複数の値を持ちます。
一般的なプログラミング言語にも配列は存在しますが、solidityの配列の書き方は少し特殊かもしれません。

uint[2] fixedArray; // 2つの整数を持つ配列
string[5] stringArray; // 5つの文字列を持つ配列
uint[] dynamicArray; // 任意の数の整数を持つ配列

このように配列の長さを指定することが出来ます。
長さが決まっている配列を固定長配列。長さが決まっていないものを可変長配列といいます。
[]の中に何も入れないと可変長配列になります。
以下は配列に構造体を追加する例です。

struct Person {
  uint age;
  string name;
}

Person[] public peaple; // publicで指定された変数はすべての場所から見ることが出来る。

Person satoshi = Person(172, "Satoshi");
peaple.push(satoshi);
// peaple => [{172, "Satoshi"}]

関数

関数は以下のようにして定義します。

function hoge(string _a, uint _b){}
hoge("fuga", 0) // 呼び出し

引数は(型 名前)という形で指定します。

Public/Private関数

public関数とは誰でも呼び出しができる関数のことを指します。
デフォルトではすべての関数はpublicになっており、誰でもどこからでも実行可能です。
一方、private関数は自分のコントラクト内からのみ実行可能です。
public関数とprivate関数は以下のように指定します。

//private関数
function _hoge() private {}

//public関数
funciton fuga() publick {}

private関数はpublic関数と見分けるために先頭にアンダースコア(_)をつけることが慣習となっています(付けなくてもプログラム的には問題ありません)。

戻り値

関数に戻り値がある場合は、その戻り値の型を指定してあげる必要があります。

funciton hoge() public returns (string) {
  return "fuga";
}

修飾子

先程の関数はコントラクト内のデータを読み込んだり、編集をしたりしない関数です。
本来値を読み込んだり編集したりしたくない関数の中でうっかりそれをやってしまわないように、関数にpureとviewという修飾子をつけることができます。
pureはデータの読み込みも編集もしない関数。viewはデータの読み込みはするが編集はしない関数であることを表します。

// pure関数
funciton hoge() public pure returns (string) {
  return "fuga";
}

uint test = 1;
// view関数
functon hoge2() public view returns (uint) {
  return test;
}

Keccak256

keccak256とはSHA3に基づいて値をハッシュ化するsolidityの組み込み関数です。
好きな文字列を与えると、256ビットのハッシュ化された値を返します。

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");
//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256("aaaac");

イベント

イベントはSolidityにしか無い特殊な操作です。
ブロックチェーンに何かが生じたことをコントラクトがフロントエンドに伝えることができます。

event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
  uint result = _x + _y;
  // 関数が呼ばれたことをアプリに伝えるためにイベントを発生させる:
  IntegersAdded(_x, _y, result);
  return result;
}

このようにすることで、関数addが呼ばれたときに新しい値_x, _y, resultをフロントエンドが受け取ることができます!!すげぇ。

イベントが発生したことはweb3.jsというライブラリで受け取ることができます。