初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【CryptZombies】レッスン5チャプター8:ERC721 takeOwnership

takeOwnership関数は、msg.senderがそのトークン/ゾンビを受け取ることを承認されているか確認し、承認されていれば_transfer関数を呼び出すだけでOKです。

テストの実行

①初めに、requireステートメントを使って、zombieApprovalsでキーが_tokenIdの場合にmsg.senderと同等となるようにせよ。こうしてもしmsg.senderがトークンを受け取ることが承認されていなかった場合、エラーが投げられる。

function takeOwnership(uint256 _tokenId) public {
    require(zombieApprovals[_tokenId] == msg.sender);
  }

②_transfer関数を呼び出すには、トークン所有者のアドレスを知る必要がある。(_fromの引数として必要だ)。幸い、このアドレスはownerOf関数で参照可能だ。ではownerというaddress変数を宣言し、それがownerOf(_tokenId)と同等となるようにせよ。

ownerOf関数はerc721.solに格納されているので、そちらを参照します。

function takeOwnership(uint256 _tokenId) public {
    require(zombieApprovals[_tokenId] == msg.sender);
    address owner = ownerOf(_tokenId);
  }

③最後に、_transfer関数を呼び出して、必要な情報全てを渡せ。(ここでは、_toの引数にmsg.senderを使う。なぜなら関数を呼び出しているのは、トークンが送られるべき者だからだ)。

function takeOwnership(uint256 _tokenId) public {
    require(zombieApprovals[_tokenId] == msg.sender);
    address owner = ownerOf(_tokenId);
    _transfer(owner, msg.sender, _tokenId);
  }

注: 上の2と3のステップは1行のコードにて行うことができるが、少しばかり読みやすくするために分割している。


お疲れさまでした!


<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network