プログラミングのゴミ箱

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

Crypto Zombieで始めるSolidity入門④

この記事は前回の続きです。
前回の記事はこちら↓
chanichiwasshoi.hateblo.jp


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

コントラクトでコインを扱う

Payable関数

 スマートコントラクトを呼び出す人はガス代以外に、コントラクトあてに任意量のコインを送ることが出来る。
 送られたコインをSolidityメソッド側で受け取るには、呼び出される関数にPayableという修飾子を付けなければならない。

  function buySomething() external payable {
    require(msg.value == 0.001 ether);
    transferThing(msg.sender);
  }

送られたコインの量はmsg.valueでアクセス可能だ。
フロントエンド側からは以下のようにして呼び出す。

OnlineStore.buySomething({from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001)})

valueを見ると0.001etherが送られていることが分かるので、この関数は実行される。

Transfer関数

 送られてきたコインを引き出すことができなければ、そのコインはずっとアカウントに閉じ込められたままになってしまう。コインを他の場所へ送るには以下のようにすれば良い。

  function withdraw() external onlyOwner {
    owner.transfer(this.balance);
  }

こうすることで、オーナーのアカウントに送られてきたコインを転送できる。
また、支払いが多すぎた場合に送り返す処理は以下の通りである。

uint itemFee = 0.001 ether;
msg.sender.transfer(msg.value - itemFee);