【CryptoZombiesを触ってみた】Lesson4で学んだこと

【CryptoZombiesとは】

Solidityでスマートコントラクトの構築を学習できるサイト
日本語で丁寧に説明してくれるので、プログラミングやったことない人でも学習できる。

cryptozombies.io

【はじめに】

Solidityは未経験ですが、JavaScriptは触ったことがあります。
そんな人が自分用の学習メモとして書いています。

【学んだこと】

payable修飾子

ブロックチェーン上にあるコントラクトを呼び出す際にETHを受け取ることができる。

contract OnlineStore {
  function buySomething() external payable {
    // 関数呼び出し時、0.001ETHが送られてきたか確認する
    require(msg.value == 0.001 ether);
    // 0.001ETHが送られてきた場合に実行する処理
    transferThing(msg.sender);
  }
}
// buySomething関数を呼び出す(web3.js)
// valueに0.001ETHを設定
OnlineStore.buySomething({from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001)})

CryptoZombiesより引用

withdraws関数とtransfer関数

コントラクトに送られたETHはコントラクトのアカウントに貯められる。貯まったETHをコントラクト以外で使用するにはコントラクトから引き出す処理(withdraws関数)が必要になる。transfer関数を使用すると指定したイーサリアムのアドレスに送金できる。

contract GetPaid is Ownable {
  function withdraws() external onlyOwner {
    // transfer関数でownerにETHを送る
    // this.balanceでコントラクトに貯まっているETHの残高を取得する
    owner.transfer(this.balance);
  }
}

CryptoZombiesより引用

乱数

ハッシュ関数のkeccak256で乱数を生成する。ただし、この方法で作成した乱数を使用しランダムな結果にしても脆弱性(※)が含まれる。
※自分のノードに向けてトランザクションを発行し、自分の都合の良い結果になるまで繰り返し行うことができる脆弱性。対策としてはoracle(イーサリアムブロックチェーン外の乱数関数にアクセスする)を使う。

uint once = 0;
uint random = uint(keccak256(once));
once++;
uint random = uint(keccak256(once));

else

JavaScriptと同じ

if (age < 30) {
  // 30歳未満
} else {
  // 30歳以上
}

【できたもの】

ゾンビ同士のバトル機能を追加
バトルに勝つとゾンビのレベルが上がる。更に新たなゾンビを生み出し、自分のゾンビ軍団に加わる。

f:id:takuyafujita:20180917041746j:plain
f:id:takuyafujita:20180917041804j:plain