cryptonerdcn

cryptonerdcn

Web3Rover_Homework:0 参考答案

Web3Rover 第一周的作业已经截止,共收到 35 份作业,占 learner 中的约 40%,算是较好的初步实现了中门槛,低人数,高参与的目标。

image

本期作业一共两题 + 附加题一题,共 10+10+5=25 分。25 分和 20 分的回答皆为 11.4%,没有 0 分。

下面是参考答案:

1,指出入学考试考试使用的 obolus 合约的一个多余的变量。#

A:mintRate。这里其实是我的一个失误,本来是想设定一个价格,防止有人在测试网上大量 mint,但后来想到测试网拿水不用成本,定低了没意义,定高了(超过一次能拿的水)又影响真正的学习者进来,于是最终取消了定价但忘记删除了这个变量。

这题有一些同学回答是 ObolusSliver 的 ID,不知道是为何。这个变量虽然可以不用定义,但直接在代码里使用属于使用 magic number,并不推荐。

2,指出 obolus 合约是如何做到一个钱包只能拥有一个的。#

A:这一题准确来说有三处,所以其实真正答完的只有一位(但第二处没答我也算对了)。

第一处:require(balanceOf(msg.sender, ObolusSliver) == 0, "You already have one Obolus.");

这里是确保 mint 前钱包中的 ObolusSliver 数为 0。
此处重点是 ERC1155 的balanceOf(address, tokenId),这里就是上面所说的,你可以直接使用 0,但因为是魔数,并不推荐。

第二处:require(amount == 1, "Wrong amount. Should be 1");

这条保证了每次 mint 必须只能 mint 一个。

第三处:require(address(0) == from, "You can not give your Obolus to others.");

这条是回答中最容易被忽略掉的一条,在 _beforeTokenTransfer中。大家仔细想一下就知道,如果仅凭上面两条,是没法防住 “mint 之后将 token 转入其他已经有 token 的钱包达到持有数大于 1” 这种情况。

所以这行代码直接限制了除了 0 地址之外,没有任何人能将该 token 转移。至于为什么要限制为 0 地址其实也是一个很好的思考题 -- 有没有想过,这个 NFT 的 mint,是从哪个地址 mint 出来的?

3,(附加题)指出为什么 ERC1155 不适合用于有着不同 trait 的 pfp 项目。#

这题其实能说很多很多,但核心就在于 ERC1155 是通过双层 mapping 来实现一个合约可以存储多种 token 的,这里的 token 不仅仅指 NFT,也同样指 FT。

ERC1155 的 tokenID 和 ERC721 的 tokenID 最大不同在于,在 1155 中,一个 tokenID 代表着一token。而在 721 中,因为总共只有一种 token,所以 tokenID 代表的是每token 的编号。

这次考试使用的是 1155,大家可以看到 tokenID 只有一个,ObolusSliver (也就是 0),即代表着这个 erc1155 只包含了一token。而深入到 ObolusSliver 这个 token 里面,每一个 token 本身是没有自己的编号的,也就是和别人的并无不同。这种设计其实是为了兼容 FT,在默认的 erc1155 接口下,ft 和 nft 可以表现出一样的行为。

总而言之,erc1155 规定了多token,tokenID 是用来标记不同种类的 token 的,每种 token 即使是 NFT 自己内部是和 FT 一样没有编号上的差别的。而 ERC721 只能包含一种 token,tokenID 是用来标记每token 的编号。

说到底,721 的 trait 系统是完全依赖于 tokenID 来分配 metadata 的,这种设计上的不同也导致了,在 erc1155 中由于同一种 token 没有编号上的区别,默认情况下是没有办法为同一种里每一个 token 分配不同的 metadata 的。

当然这一切并不绝对,事实上开发者完全可以自己添加逻辑来记录 1155 下每一种 token 里的每一个的 id,只不过需要更多的工作和更多的 gas 消耗。


我们的官方推特:

https://twitter.com/web3_rover

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。