Web3Rover の第一週の課題は締め切られ、35 件の課題が提出されました。これは学習者全体の約 40%を占め、初めての中程度の目標である低人数での高い参加率を達成しました。
今回の課題は 2 問と追加問題 1 問で、合計 10 + 10 + 5 = 25 ポイントです。25 ポイントと 20 ポイントの回答はどちらも 11.4%で、0 ポイントはありません。
以下は参考答えです:
1. 入学試験で使用される obolus コントラクトの余分な変数を指摘してください。#
A:mintRate。これは実際には私のミスで、テストネット上で大量の mint を行う人を防ぐために価格を設定しようとしたものでしたが、後でテストネットで水を手に入れるのにコストがかからないことに気づき、低く設定する意味がないと思いました。高く設定すると(一度に手に入る水を超える場合)本当の学習者の参加に影響を与えるため、最終的に価格設定を取り消しましたが、この変数を削除するのを忘れました。
この問題には、ObolusSliver の ID と回答した生徒もいましたが、なぜかはわかりません。この変数は定義しなくても構いませんが、コード内で直接使用することはマジックナンバーの使用になり、おすすめしません。
2. obolus コントラクトが 1 つのウォレットのみを所有できるようにする方法を指摘してください。#
A:正確に言うと、3 つの箇所がありますので、実際に完全に答えたのは 1 人だけです(ただし、2 番目の箇所は回答されていませんが、私は正解としました)。
1 つ目:require(balanceOf(msg.sender, ObolusSliver) == 0, "You already have one Obolus.");
これは、mint 前にウォレットの ObolusSliver の数が 0 であることを確認しています。
ここで重要なのは、ERC1155 のbalanceOf(address, tokenId)
です。これは先ほど言ったように、0 を直接使用することはできますが、マジックナンバーの使用になるため、おすすめしません。
2 つ目:require(amount == 1, "Wrong amount. Should be 1");
これは、毎回 mint する際に 1 つだけ mint できるように保証しています。
3 つ目:require(address(0) == from, "You can not give your Obolus to others.");
これは、_beforeTokenTransfer
内で行われていますが、回答の中で最も見落とされやすいものです。よく考えてみればわかりますが、上記の 2 つだけでは、「mint した後に token を他の既に token を持っているウォレットに移す」という状況を防ぐことはできません。
したがって、この行のコードは、0 以外のアドレスでは誰もその token を移動できないように制限しています。なぜ 0 アドレスに制限する必要があるのかは、非常に良い考え問題です - この NFT の mint は、どのアドレスから mint されるのでしょうか?
3. (追加問題)なぜ ERC1155 は異なる trait を持つ pfp プロジェクトには適していないのかを指摘してください。#
この問題には実際にはたくさんのことが言えますが、核心は ERC1155 が 2 重のマッピングを使用して 1 つのコントラクトで複数の token を格納するために設計されていることです。ここでの token は NFT だけでなく FT も指します。
ERC1155 の tokenID と ERC721 の tokenID の最大の違いは、1155 では 1 つの tokenID が 1 つの token を表すことです。一方、721 では、全体で 1 つの token しかないため、tokenID は各 token の番号を表します。
今回の試験では 1155 が使用されており、tokenID は 1 つだけであり、ObolusSliver(つまり 0)を表しています。ObolusSliver という token 自体は、自身に固有の番号を持っていないため、他の token とは異なりません。この設計は、FT との互換性を持たせるためのもので、デフォルトの erc1155 インターフェースでは、ft と nft が同じ動作を示すことができます。
要するに、erc1155 は複数の token を定義し、tokenID は異なる種類の token を識別するために使用されます。各 token が NFT であっても、内部的には FT と同じように番号の違いはありません。一方、ERC721 は 1 つの token しか含めることができず、tokenID は各 token の番号を識別するために使用されます。
結局のところ、721 の trait システムは完全に tokenID に依存して metadata を割り当てるため、この設計上の違いにより、erc1155 では同じ種類の token に異なる metadata をデフォルトで割り当てることはできません。
もちろん、これは絶対的なものではありません。実際には、開発者は 1155 の各種 token ごとに ID を記録するためのロジックを追加することができますが、それにはより多くの作業とガスの消費が必要です。
公式 Twitter: