如何验证你的 NFT 是否「安全」?

NFT 是如何存储多媒体信息的

NFT (Non-Fungible Token) 是一种可以承载多媒体信息以及其归属权的非同质化代币,其目前主流由 ERC-721 和 ERC-1155 协议支撑。在 OpenSea 上一个 NFT 可以附带上至 40 MB 的多媒体信息,这对于目前的以太坊链来说实在是太大了,所以多媒体信息是不可能跟着 NFT 一起上以太坊链的。那么 NFT 到底是如何附带多媒体信息呢?

其实,以 ERC-721 协议为例,目前的 NFT 就像是一个超链接,本身不携带任何多媒体数据,而是指向了一个远端内容。具体地说,在 ERC-721 协议中规定了一个 tokenURI() 的方法:

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string);

它的作用是传入 tokenId,返回一个字符串链接说明该代币的内容指向。这个链接通常会指向一个 JSON 文件,格式大概为以下形式:

{
  title: 'xxx',
  name: 'xxx',
  type: 'object',
  imageUrl:
    'https://xxx',
  description: 'xxx',
...

描述了该代币的各种信息,包括标题 title,名称 name,类型 type,描述 description,以及最重要的多媒体信息地址 imageUrl(还有很多其他的描述字段,这里没有全部列出)。

为什么说有的 NFT 「不安全」

从上面讲解 NFT 存储多媒体信息的原理可以看出,要想让一个 NFT 指向一个图片,一共会有三个步骤:

  1. 调用合约 tokenURI() 方法得到该 NFT 的 metadata 地址。
  2. 解析 metadata 得到 NFT 的各种属性和 imageUrl 地址。
  3. imageUrl 地址请求传回图像信息。

这三步中,每一步出了问题都会导致 NFT 无法显示其内容。其中,步骤 1 是被合约限制不可更改的,即当合约被编译上链后,我们可以信任其指向的 metadata 地址就被保证不能更改了。

但是对于步骤 2 和 3,目前相当大部份的 NFT 是令其 metadata 地址和 imageUrl 地址指向「传统」链接。这里「传统」的意思是中心化服务器所提供的链接,例如 www.baidu.com。于是就会产生信任问题:

  1. 我无法信任这些链接不会被更改或重定向,除非我拥有整个内容提供链的所有权(基本是不可能的)。
  2. 当前互联网的网页平均寿命是 33 个月,我不能信任这些链接就是那些可以活过 33 个月的幸运儿。
  3. 一旦内容失效,我可能会依旧保留有由以太坊链鉴定的、该艺术品的所有权,但我依旧会遭受经济损失。

作为案例,2021 年 2 月 12 日被以 389000 美元卖出的 Death of the Old ,其内容指向可以被确定为「传统」地址。除非购买者可以保证 niftygateway,comcloudinary.com 都处于他本人的控制下,否则他的资产会一直存在一定的风险。

https://api.niftygateway.com/warnymphvolume1/27300010001/

{
  "description": "Death of the Old By Grimes x Mac. Music: Anhedonia {Demo} by Grimes. Resolution: 1920x1080. Date: 02/12/21",
  "background_color": "ffffff",
  "external_url": "https://niftygateway.com/#/",
  "image": "https://res.cloudinary.com/nifty-gateway/video/upload/v1614182003/Max/Grimes/Death_of_the_Old_xps5pc.png",
  "name": "Death of the Old #1/1",
  "animation_url": "https://res.cloudinary.com/nifty-gateway/video/upload/v1614182003/Max/Grimes/Death_of_the_Old_xps5pc.mp4"
}

有什么非中心化的存储更好的方案吗?

当然有,答案就是 IPFS。IPFS 是一种类似于 p2p 的,将数据在网络上分散存储的协议。他有两个非常优秀的特质:

  1. 只要世界上还有一个人在运行 IPFS 节点,那 IPFS 网络就可以被访问。
  2. 没有中心化权利可以决定哪一个资源能被删除或者修改。如果 IPFS 网络决定删除一个数据,那整个网络所有节点都需要同意这个行为。

这两个特质简直是让我们觉得 IPFS 就是为 NFT 而生的(当然不止是为 NFT)。

所以,更好的方案是所有 NFT 的 metadataimageUrl 数据都被 IPFS 所保存,这样我们可以信任他们会是持久化的。

如何检查自己的 NFT 是否存在风险?

这里我来举例子的 NFT 是 Trajectory。它的合约地址是 0x2a46f2ffd99e19a89476e2f62270e0a35bbf0756tokenId2

简单版(只支持以太坊主链):

  1. 准备好你所拥有的 NFT 的合约地址和 tokenId
  2. 登陆 https://checkmynft.com/
  3. 分别填写合约地址和 tokenId,点击 Check My NFT 按钮

  1. 稍等片刻,你会被重定向到另一个页面。在这个页面往下翻,直到看到 Asset Storage

这里观察 Stored on 字段,如果显示的是 ipfs 则说明你的 NFT metadata 正在由去中心化的提供商提供内容服务。否则则说明你的 NFT 存在一定风险。

然后,打开 URI 中的链接。如果你的 metadata 已经是 IPFS 提供了的话,那你可能需要一个本地 IPFS 节点或者使用 ipfs.io 的代理服务才能打开 IPFS 网址。打开后内容应该是一个 JSON 文件,观察 imageUrl 或者其他 URL 是否拥有 ipfs 子字符串(例如 https://ipfsgateway.makersplace.com/ipfs/QmNopeEan1r728EGpAYZw8fFvCXfuXtnadC3JCeY5mo9LB 虽然是 HTTP 协议,但也是 IPFS 进行存储,因为链接中有明显的 ipfsgateway 标志,说明该 IPFS 内容正在使用 HTTP 进行代理,本质上也是 IPFS)

复杂版:

简单版中所提供的查询工具,本质上是将接下来我会介绍的步骤打包成了一个一键工具。所以如果你不信任这个工具的话,可以使用我接下来提供的方法进行查询。

  1. 准备好你所拥有的 NFT 的合约地址和 tokenId
  2. etherscan 上观察自己 NFT 的合约地址

  1. 点击 Contract 栏,然后点击 Read Contract

  1. 找到 tokenURI 方法,输入自己的 tokenId 后点击查询

5

方法会返回你的 NFT 的 metadata 所在链接。这时可以通过观察该链接是否携带 ipfs 等标志字符串来确定其是否为 IPFS 提供服务。

然后,打开这个链接。如果你的 metadata 已经是 IPFS 提供了的话,那你可能需要一个本地 IPFS 节点或者使用 ipfs.io 的代理服务才能打开 IPFS 网址。打开后内容应该是一个 JSON 文件,观察 imageUrl 或者其他 URL 是否拥有 ipfs 子字符串(例如 https://ipfsgateway.makersplace.com/ipfs/QmNopeEan1r728EGpAYZw8fFvCXfuXtnadC3JCeY5mo9LB 虽然是 HTTP 协议,但也是 IPFS 进行存储,因为链接中有明显的 ipfsgateway 标志,说明该 IPFS 内容正在使用 HTTP 进行代理,本质上也是 IPFS)

总结

个人认为,使用 IPFS 进行 NFT 内容的存储应该是被写进 ERC 协议才对,否则的话给人的感觉就始终好像差点意思。有任何观点也欢迎在评论区讨论。

2 Likes

学习

1 Like

有用吗

2 Likes

学习

1 Like