リファクタリング再び、transfer、approve、takeOwnership、またしても括弧問題、、今回の記事ではこのような内容が書かれております。前回の記事でも取り上げた括弧の使い方は、多少糸口が見えたような、、、見えないような、、、w
引き続き進める事で解決できるかもしれませんので、頑張って続けますからね!!
それでは開演します!
CryptoZombies | イーサリアムでのゲーム開発を学ぶ
リファクタリングという言葉が出ましたね!
過去記事でも説明しているので過去記事はこちら👉レッスン4:BattleOfZombie③
前回のブログでも書きましたが、関数修飾子としてownerOfという名前で宣言してて、前回は関数としてownerOfという名の宣言をしていました。。やっぱりこれ、エラーの原因になるとのことなので手直しする必要があるとのこと。関数修飾子名と関数名が一緒はダメって事らしいね!
しかも、ERC721のコントラクトにも関数の宣言としてownerOfが宣言されているため、関数修飾子の方の名前を変えてあげないといけないとの事なので変更が必要であるとの見解にいたります。
っという事ですな。それではテストだ!!
1では、修飾子名の定義をonlyOwnerOfに変更せよ。との事なので、
変更前:ownerOf 変更後:onlyOwnerOf
となります。
2では、feedAndMultiply関数でもownerOf修飾子を使っているので、同じく変更するだけなので、1と同様の回答となります。
実は他にもownerOf修飾子を使った部分はありますが、これを全てテストでやってしまうのは時間の無駄になってしまうため、ゾンビちゃんがやってくれるから安心してくれ、との事です!
ほいほいっ!これでチャプター4は完了ですね。
次行きまっしょい!!
コンフリクトという言葉が出て来ました!イメージとしては先ほどの状況を考えるとわかりやすいと思いますが、重複している状態の事をさしているのでownerOf修飾子をonlyOwnerOfに変更した事により、コンフリクトは解決した、という事だ!
トランスファーに関しては過去に既出だが、輸送するという意味だね。
トークンの移転方法は二つの異なるトークン移転方法を持つとな。。
言い方がなんとなく回りくどい感じがしますね、、、、理由はありそう、、
1番目の方法は、
まずは送り先のaddress、そして送りたいトークンのIDを送ってから、transfer関数を呼び出す。
2番目の方法は、
所有者がまずapprove関数を呼び出し、送り先のaddressと送りたいトークンのIDを関数に送る。受け取り側がtakeOwnership関数を呼び出すと、コントラクトが受取人が所有者から承認されているかをチェックし、承認済みの場合はトークンを転送する。
んんっ!??1番目2番目って言っているけど、これって手順って事だよね?
まずはtransfer(転送する)、その次にapprove(承認する)して、そしたらtakeOwnership(所有権を得る)という流れ。
回りくどいというよりも、この3つの工程があるよって、事よね。
ちょっと違うけど言いたいことはZaifに入金する作業に似ているような、、、w
口座から振り込む前に、Zaifにログインしてから入金を許可させる処理をして、入金待ちにしておいてから、口座から振り込む、みたいなw
同じ流れではないけど、そういう手続きをしないと、ちゃんと送れないし受け取れないよというERC721のルールってことですな。
一応transfer関数とtakeOwnerShip関数は別物でそれぞれで、送ることができるが、所有者側が関数を呼び出すのか、受け取り側が関数を呼び出すのかの違いが出て来るって事らしい。。
取り消し線で消してはいますが、不安なので一応残しておきますw
1では、_transferという関数を定義せよ、パラメーターは3つ、でprivateということなので、
function _transfer(address _from, address _to,uint256 _tokenId) private {}
となりますね。
2では、中身としてまずは受け取り側のownerZombieCountを加算する必要があるとの事なので、、
ownerZombieCount[_to]++;
となりますね。
3では、ownerZombieCountを減らす事が必要とのことなので、、
ownerZombieCount[_from]–;
となります。
4では、zombieToOwnerマッピングを_tokenIdから_toに変更したいとのことなので、
zombieToOwner[_tokenId] = _to;
となります。
5では、Transferイベントを起こさなくてはならないとの事なので、どんな引数が必要かはerc721.solにあるのでそれを見ると、、
Transfer(_from, _to, _tokenId);
となります。
長いテストでしたねw
まとめると、、
function _transfer(address _from, address _to,uint256 _tokenId) private {
ownerZombieCount[_to]++;
ownerZombieCount[_from]–;
zombieToOwner[_tokenId] = _to;
Transfer(_from, _to, _tokenId);
}
となります!
前回更新したブログで、、()と[]の違いってなんなんだ!?と悩みましたが、ここで解消できた気がします!
どう使い分けしたかというと、、
引数を渡すのが()で
更新する場合は[]を使う、、
という使い方で分けましたw
厳密には説明足りてないと思いますし、考え方としては違う可能性が大いにありますが、またはっきりしたら書いて行こうと思いますw
本日は葛藤の多い1日でしたなw
成長するために必要な工程なので、引き続き頑張りますよ!!!!
CryptoZombies | イーサリアムでのゲーム開発を学ぶ
それではまた明日!