ERC-721 两个值得注意的小细节
市场依然平淡。与其讨论不断下降的地板价,本周让我们一起回顾一些 NFT 基础知识。
大家对 ERC-721 一定并不陌生。但是 ERC-721 到底是什么?有哪些与其相关的小细节值得我们特别关注?
基础知识
ERC-721 是一个标准。它定义了一套代码规则,用于在以太坊区块链上记录与 NFT 有关的信息。尽管 ERC-721 不是强制性的,但它被广泛接受为 NFT 项目的标配。
ERC-721 的全称是 Ethereum Request for Comment-721(以太坊征求意见稿第721号)。ERC-721 源自第721号 Ethereum Improvement Proposal(以太坊改进提案,EIP)。EIP 经过审查和最终确定后,就会成为 ERC。
EIP-721 于2017年9月由 Dieter Shirley 首先提出。后来 Shirley 根据 EIP-721 的原始版本在2017年末共同开发了 CryptoKitties(加密猫),引爆了当时的以太坊社区。EIP-721 于2018年1月24日由 William Entriken、Dieter Shirley、Jacob Evans 和 Nastassia Sachs 正式提交。2018年6月21日,EIP-721 被接受为最终版本,成为 ERC-721。
ERC-721 为任何 NFT 指定了两个标识符,合约地址和 token ID。它们的结合使得 NFT 变得真正的独一无二。例如,只有一个 Bored Ape Yacht Club(合约)#3749(token ID)。
来源:Bored Ape Yacht Club #3749
虽然 ERC-721 标准化了许多东西,但它的设计产生了两个问题,分别是所有权和 metadata。
所有权
ERC-721 允许大家在 NFT 智能合约中登记 NFT 的所有权。采用这种登记方式导致你购买的 NFT 不会出现在你的名下。相反,是你的名字出现在你购买的 NFT 下面。换句话说,不是你的 NFT 属于你,而是你属于你的 NFT。
当铸造(创建)NFT 时,一系列信息以 ERC-721 合约的名义在以太坊区块链上被记录,包括合约地址、token ID、所有者地址等。如果 NFT 从一个地址被转移到另一个地址,NFT 并没有从一个钱包转移到另一个钱包,真正发生的只有 ERC-721 合约中的所有者地址被更新而已。
这意味着某个特定地址的 NFT 余额存储在各种 ERC-721 合约中。如果我想知道你拥有多少只无聊猿,我需要挨个检查那10,000只无聊猿的链上记录,并验证每只猴子的所有者地址是否与你的匹配。如果我还想看看你的 Azuki,我需要对 Azuki 合约重复相同的过程。ERC-20 合约事实上使用相同的机制。这就是为什么你必须手动添加你刚刚购买的土狗的合约地址,这样 Metamask 才可以进入该合约并获得关于你到底买了多少的信息。
如果以上听起来太抽象,让我举一个生活中的例子。假设你在超市买菜,你会把苹果、鸡蛋和牛排都放进购物车里。结完账,你带着一袋你买的所有东西离开。如果你在超市外等候的朋友想知道你买了什么,他们只需看看购物袋里都装的啥就行了。这是现实世界中的方式。
在区块链的世界里,你买一样东西的方式,是把你的名字写在上面。如果你买了一个苹果,你就在苹果上写下自己的名字,而不是带着苹果离开。如果你的朋友想知道你买了什么,他们需要进到超市里面,挨个浏览货架上的每一件商品,检查上面是否写着你的名字。还记得吗,你的苹果不属于你,相反,你属于你的苹果。
如果我们想找出一个特定地址的 NFT 余额,我们需要查看现存的每一份 ERC-721 合约。这对于像 MetaMask 这样的钱包应用来说是不现实的。因此,MetaMask 依赖中心化的数据提供商来获取此类信息。
现在,MetaMask 通过调用 OpenSea 的 API 来显示你的 NFT(同样,MetaMask 通过调用 Infura 的 API 来显示你的 ERC-20 余额)。这就是为什么一些 NFT 在购买后需要几个小时才能出现在你的钱包里,而不是立刻。
如果 OpenSea 从其网站上删除了某个 NFT,它也会从其 API 中删除它。因此,这个 NFT 将从你的 MetaMask 钱包中消失,即便那个 NFT 合约中仍然显示你是其所有者。
在某种程度上,OpenSea 通过他们提供的 API 规定了谁拥有什么 NFT。尽管存储在区块链上的信息不能被更改,但当这些信息被检索和呈现时可能会被扭曲。具有讽刺意味的是,构建区块链的初衷是为了消除第三方风险。但是,为了保证用户体验,中心化的第三方仍然在人们与区块链交互的过程中发挥着不可或缺的作用。而这在可预见的未来不太可能改变。
ERC-721 的设计从根本上限制了一个非托管钱包正确显示一个人拥有的所有 NFT。如果一个 NFT 从你的钱包里消失,不要惊慌。你多半没有丢失它,只是 OpenSea 决定你不应该拥有它。
Metadata
ERC-721 允许 NFT 的相关数据存储在链下并且可以被修改。这带来两个方面的风险。首先,链下存储设施可能变得无法访问。其次,Metadata 可以在没有所有者许可的情况下被更改。
当谈到 NFT 时,大多数人会想到图像、音乐、文章等。但是像图像这样的数据不能直接存储在链上,因为它们占用了太多的空间,存储它们太贵了。这样的 NFT 数据通常存储在链下,然后将指向该数据的链接转换为一种被称为 JSON(JavaScript Object Notation)的格式。事实上,不仅是指向图像的链接,NFT 名称、描述以及属性都是 JSON 文件的一部分,也被称为 NFT 的 metadata。
来源:OpenSea
ERC-721 没有规定 JSON 文件的格式细节。不过,大多数 NFT 项目都使用 OpenSea 推荐的格式。下面展示了上述 NFT 示例的 JSON 文件内容。
来源:OpenSea
然而,即使是 JSON 文件也太大了,无法存储在区块链上。实际上,NFT 中只存储一个指向其 JSON 文件的链接。
因此,要上传一个 NFT 的图像,需要经过四个步骤:
上传图像到网上并生成一个链接。 创建一个包含该链接以及其他相关信息的 JSON 文件。 上传 JSON 文件并生成另一个链接。 通过 ERC-721 合约中的 URI 将 NFT 指向第二个链接。
写在最后
END
Nervos 网址:https://www.nervos.org/
中文电报群:https://t.me/NervosNetworkcn
中文推特:https://twitter.com/CKBMeta
中文Discord:https://discord.gg/f2qa52tJnz
《Nervos 入门手册》:ckborg.bit.host