cryptonerdcn

cryptonerdcn

Web3Rover_宿題:0 参考解答

Web3Rover の第一週の課題は締め切られ、35 件の課題が提出されました。これは学習者全体の約 40%を占め、初めての中程度の目標である低人数での高い参加を実現するためには良い結果と言えます。

image

今回の課題は 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 つだけであることを保証しています。

3 つ目:require(address(0) == from, "You can not give your Obolus to others.");

これは、 _beforeTokenTransfer内にあり、回答の中で最も見落とされやすいものです。よく考えてみればわかりますが、上記の 2 つだけでは、「mint した後に token を他の既に token を持っているウォレットに移す」という状況を防ぐことはできません。

したがって、この行のコードは、0 アドレス以外の人はこのトークンを転送できないように制限しています。なぜ 0 アドレスに制限する必要があるのかは、非常に良い考え問題です - この NFT の mint は、どのアドレスから mint されるのでしょうか?

3. (追加問題)ERC1155 が異なる trait を持つ pfp プロジェクトには適していない理由を指摘してください。#

この問題には実際には多くのことを言えますが、核心は ERC1155 が 2 重のマッピングを使用して 1 つのコントラクトで複数のトークンを格納するために設計されていることです。ここでのトークンは NFT だけでなく、FT も指します。

ERC1155 の tokenID と ERC721 の tokenID の最大の違いは、1155 では 1 つの tokenID が 1 つのトークンを表すことです。一方、721 では、トークンが 1 つしかないため、tokenID は各トークンの番号を表します。

今回の試験では 1155 が使用されており、tokenID は 1 つだけであり、ObolusSliver(つまり 0)を表しています。ObolusSliver のトークン自体は番号を持っていないため、他のトークンとは異なりません。この設計は、FT との互換性を持たせるためのもので、デフォルトの erc1155 インターフェースでは、ft と nft は同じ動作を示すことができます。

要するに、erc1155 は複数のトークンを規定しており、tokenID は異なる種類のトークンを識別するために使用されますが、同じ種類のトークンであっても NFT 自体には番号の違いはありません。一方、ERC721 は 1 つのトークンしか含めることができず、tokenID は各トークンの番号を識別するために使用されます。

結局のところ、721 の trait システムは完全に tokenID に依存して metadata を割り当てるため、この設計上の違いにより、erc1155 では同じ種類のトークンに異なる metadata をデフォルトで割り当てることはできません。

もちろん、これは絶対的なものではありません。実際、開発者は erc1155 の各種トークンごとに ID を記録するためのロジックを自分で追加することができますが、それにはより多くの作業とガス消費が必要です。


公式 Twitter:

https://twitter.com/web3_rover

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。