【CryptZombies】レッスン5チャプター7:ERC721 Approve
approve / takeOwnershipの2つの関数で、トランスファーは2段階で発生します。(チャプター5参照)
①トークン所有者がapprove関数を呼び出し、それに新たな所有者のaddressと彼に送る_tokenIdの情報を与える。
②新たな所有者がtakeOwnership関数を_tokenIdで呼び出すと、コントラクトは彼が承認済みの新たな所有者であるかを確認してから、彼にトークンを移転する。
これは2度の関数呼び出しで発生するので、その2度の間で誰がどのトークンについて受け取りを承認されているか記録するデータ構成が必要です。
テストの実行
①まず初めに、zombieApprovalsというマッピングを定義せよ。uintからaddressを指し示すマップにすること。こうすることで、誰かが_tokenIdでtakeOwnership関数を呼び出すときに、マッピングで誰がトークン受け取りを承認されているかをさっとチェック可能だ。
mapping (uint => address) zombieApprovals;
②approve関数では、トークン所有者のみが、受け手にトークンを受け取る許可を与えられるようにしておきたい。 なので、approve関数にonlyOwnerOf修飾詞を加えよう。
function approve(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) { // 3. ここに関数を定義すること }
③関数の中身に、_tokenIdがキーのzombieApprovalsが_toアドレスと同等となるよう設定せよ。
function approve(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) { zombieApprovals[_tokenId] = _to; }
④最後に、ERC721規格にはApprovalイベントがあるから、関数の最後でこれを発生させ流ようにせよ。erc721.solをチェックして_ownerの引数にmsg.senderを使うよう確かめること。
function approve(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) { zombieApprovals[_tokenId] = _to; Approval(msg.sender, _to, _tokenId); }
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network