🙆‍♀️

Solidity初心者のCryptoZombiesまとめ(中級編チャプター1)

2022/08/24に公開

はじめに

業務でブロックチェーン周りの開発に携わるようになったので、スマートコントラクト実装の基礎学習としてSolidityのチュートリアル「CryptoZombies」をやってみた。
SolidityはJavascriptに似ていると言いつつ、やはり言語特有のお作法があったりしたので、CryptoZombiesを通して各章ごとに学んだことを自分なりにまとめた。
(※Solidityの文法について重点的に記載していくため、サンプルコードとその補足がメイン)

CryptoZombies

https://cryptozombies.io/jp

チャプター1で学べること

コントラクトの基本的な書き方や構成要素、関数宣言の方法など。

コントラクト

// Solidityのコンパイラのバージョンを宣言
pragma solidity ^0.4.19;

// コントラクト
contract HelloWorld {
}

状態変数

contract Example {
  // データ型 変数名 = 代入値;
  uint myUnsignedInteger = 100;
}

構造体

  • 複数の要素を持つデータ型のこと
struct Person {
  uint age;
  string name;
}
Person[] public people;

// 構造体を生成する
Person satoshi = Person(172, "Satoshi");

// 配列に生成した構造体を格納
people.push(satoshi);

配列

// 固定長配列(2つの数値を格納できる)
uint[2] fixedArray;

// 固定長配列(5つの文字列を格納できる)
string[5] stringArray;

// 可変長配列
uint[] dynamicArray;

// publicで宣言すると、自動的にgetterメソッドが作成される
Person[] public people;

関数

  • Solidityでは、関数はデフォルトでpublicになっている
  • private関数はアンダースコア(_)で始める。関数のパラメーターも同様
// 関数の定義
function eatHamburgers(string _name, uint _amount) {
}

// 関数の呼び出し
eatHamburgers("vitalik", 100);

// private関数の宣言方法(※private関数はアンダースコア(_)で始める)
uint[] numbers;
function _addToArray(uint _number) private {
  numbers.push(_number);
}

戻り値

  • 関数の宣言に戻り値の型を含む
// returns で戻り値を宣言
string greeting = "What's up dog";
function sayHello() public returns (string) {
  return greeting;
}

関数の修飾子

view修飾子

  • データの読み取り専用(スマートコントラクトを動かす際に手数料がかからない)
  • ただし、同じコントラクト内のviewが付いてない関数から実行される場合は手数料がかかる
// view関数
function sayHello() public view returns (string) {

pure修飾子

  • データの読み込みも書き込みも不可能(引数で受け取った値のみ使用可能)
// pure関数
uint hoge = 3;
function _multiply(uint a, uint b) private pure returns (uint) {
  // 以下はOK
  return a * b;
  
  // 以下はエラーになる
  return a * b * hoge;
}

Keccak256(ケチャック256)

  • イーサリアムで使われているハッシュ関数(文字列をランダムな256ビットの16進数にマッピングする機能)
//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");

型キャスト

uint8 a = 5;
uint b = 6;

// a * b はuint8ではなくuintで返すから、エラー
uint8 c = a * b; 
// 正しく動作させるために、bをuint8に型キャスト
uint8 c = a * uint8(b); 

イベント

  • ブロックチェーンで何かが生じたときに、コントラクトがアプリのフロントエンドに伝えることができるもの
  • 特定のイベントをリッスン(接続待ち)状態にして、何かあった時にアクションを起こすこともできる
// イベントの宣言(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;
}

// フロントエンド(JavaScript側)
YourContract.IntegersAdded(function(error, result) {
  // 結果について何らかの処理をする
})

チャプター1のまとめ

他言語の経験があれば、理解しやすい内容だと思う。
ただview修飾子とpure修飾子の使い分けなど、CryptoZombies内では軽く触られていただけだったので、深く理解したい場合は、やはり自分で調査して理解を深める必要があると思った。

次のチャプターはこちら

Discussion