えんじにゃーず・ハイ

主にエンジニアや技術情報についてつらつら書き連ねるブログです

CryptoZombies勉強会#4を開催しました

折り返し

頑張っていきましょう。

f:id:areph:20180630011325p:plain

ということでCryptoZombies勉強会#4を開催しました。

今回はレッスン4です。

レッスン4でやったこと

レッスン4はレッスン3に引き続きSolidityの特色を孕んだ内容がメインとなる。etherを送信したり引き出したりする修飾子を学びつつゾンビバトルシステムのゲーム部分を重点的に進めることになる。

  • 可視性修飾子
    • public/privateとinternal/external
    • セキュリティを考慮し基本的にはprivateで外部には公開しない
    • 必要になった時に必要になった時の分だけ可視性を上げるのが良い
  • 状態修飾詞
    • view/pure
    • viewはブロックチェーンへの書き込みは行わない
    • pureはブロックチェーンへの参照も行わない
      • 単純な計算など
    • どちらも外部から直接callされた場合はgasが不要
    • ただし、別の関数からcallされた場合はgasが発生する
    • 読み取りのデータとして提供するのが良さそう
    • Solidityはどちらを修飾するかコンパイル時に警告を出して教えてくれるのでそれに従うのが良い。頭いいね
  • payable修飾子
    • payable修飾子が付与された関数は呼び出しと同時にetherを送ることができる
    • 関数の引数としてはちょっと特殊
    • 「誰が」「どれぐらいのEther」を送るのかを指定
    • スマートコントラクトの強い特徴の一つといえる
  • this.balance
    • payable修飾子で送信されたvalueの値が加算されている
  • address.transfer
    • address型に実装されているtransfer関数
    • この関数を使ってEtherをaddressに対して送金する
    • Etherのやり取りをするのに欠かせないキーワードとなる
  • 乱数について
    • セキュリティ的に非常に難しい問題
    • Zombieの例ではkeccak256関数を使って乱数を作り出しているが、本文にも記載されている通り、ハッシュパワーを使って操作できてしまう
    • こちらの記事が詳しい
    • 乱数を使う場面は多くなるので、使いたいな、と思った時はどのように対応するかを検討したほうが良い
  • ゾンビの勝敗ロジック
    • 乱数を使ってどのように勝敗を決めるのかを考える
    • 確率を100として剰余演算で勝率を求める
  • 構造体に勝敗カウントの属性を追加
    • 最低限必要なuintのbit数を考慮する
  • クールダウンの設定
    • 1日1回のみ攻撃できるようになり、これでよりゲームっぽくなる

総括

今回はあまり目新しい機能は少なく、ゲーム性ロジックがメインとなった。

ただ、payableとtransferはスマートコントラクトでは非常に重要な要素なのでしっかり覚えていきましょう。