# 你只知道NFT就是一张图片，却未必清楚它到底放在哪里

By [扁宇宙日志](https://paragraph.com/@0x2357) · 2022-05-10

---

不管你是否买过NFT，可能听别人说过，自己也这么认为，NFT其实就是一张JPG（图片）。

这话一点没错，可是，你买的这张图片，它到底放在哪里？你怎么证明它是属于你的？

如果有人问你这个问题，而你却不知道该如何回答，那人家可能要在心里骂你傻逼了。

有一位大佬（沃兹基·索德）就曾经说过：

> 世界上最傻逼的事情，不是花大钱买一张JPG，而是花大钱买了一张JPG，却不知道它到底放在哪里。

这个问题如此重要，关乎智商和尊严，每一个人都不该忽视。今天，就由我来为大家揭晓这个答案。

* * *

1\. NFT到底是怎么“买”的？
-----------------

我们首先要搞清楚一个问题：NFT到底是怎么买的？

想必很多人都会说：自己Mint，别人空投，或者在Opensea上面直接买。

这三种方式表面上看起来各不相同，本质上其实都一样，都是在区块链上增加一条交易记录，**说明某个智能合约发行的某个编号的图片的所有权，是属于你的钱包地址**\*。

从此之后，只要钱包是你的，NFT就是你的。钱包丢了，就什么都没了。

这也是为什么你买NFT需要支付Gas费的原因：往区块链上记录信息，是需要付费的。

需要注意的是，这个交易记录里，只记录了**合约地址**和**图片的编号**，没有记录图片的存放位置和其它数据。（绝大多数情况如此）

2\. 我买的图片在哪里可以看到？
-----------------

这个问题，我相信并不是每个人都清楚。

有些人会说，图片就在Opensea啊，每次只要交易结束，用钱包登陆Opensea，就能看到刚买的图片。

可是，Opensea是怎么知道你买了这个图片（NFT）呢？

因为它知道你的钱包地址。

众所周知，区块链上的所有信息都是公开的。当你在Opensea连接钱包以后，它就能查到你这个钱包的所有交易记录，自然会知道你这个钱包地址拥有属于哪个合约的哪个编号的NFT。

前面说过，交易记录里面只记录了NFT的合约地址和图片编号。那么，Opensea在只知道这两者的情况下，是从哪里找到这个图片并展示出来的呢？

答案是智能合约。

3\. 如何通过智能合约找到我的图片？
-------------------

既然 Opensea通过合约地址和图片编号就能找到图片，我们一定也可以。下面就以我之前发布的 **草泥马NFT** 为例，来说明这个过程。

### 3.1 查看智能合约地址和图片编号

首先在Opensea找到 草泥马NFT这个项目的合集，地址如下：

[https://opensea.io/collection/caonima](https://opensea.io/collection/caonima)

选择其中任意一个NFT并打开，在图片下方找到 **Details** 这一部分，点击之后就能看大**Contract Address** 和 **Token ID** 这两项，分别对应的就是智能合约地址和图片编号。（见下图）

![](https://storage.googleapis.com/papyrus_images/a5a32e5c26c52c0c2b42d8a5d21d677b2c5b50e8535407d40f2ba1917edec2de.png)

在这里，你只需要记下**Token ID**也就是图片编号2357即可，在合约地址上直接点击，会打开一个新的页面，在这里可以查到关于这个智能合约的所有信息。

### 3.2 通过智能合约查询NFT的数据文件

根据上面一步，我们打开智能合约的查看页面：

[https://polygonscan.com/address/0x53bfe75d581717aa63d3da391e7ff9b4357a82d0](https://polygonscan.com/address/0x53bfe75d581717aa63d3da391e7ff9b4357a82d0)

在页面中先找到 **Contract**， 然后选择 **Read Contract**：

![](https://storage.googleapis.com/papyrus_images/46d38abc7d7b9a9dba975e383ac71a18767a1e7b494f0d79dcd88ebbdfb6b33f.png)

在下面函数列表中找到 **TokenURI** 这个查询函数，并输入图片编号2357，然后点击**Query**进行查询，结果如下：

![](https://storage.googleapis.com/papyrus_images/8a25ce6515f06b5844ce3b615d5024e0fd7fdb78d2c054f20521bdc47dca445b.png)

可以看到，我们根据图片编号查到了它的数据文件是一个地址：

`ipfs://QmRnWJzYApCZUs6NqLvGXFjyYn9xmNBrcYEp4u9hDN1cuG/2357.json`

这个用ipfs开头的地址是不能用普通浏览器直接打开的，因为它存储在ipfs网络上（一个常用的、用于存储文件的去中心化网络，感兴趣的自己研究）。

### 3.3 通过数据文件找到图片的真正存放位置

要想打开上面的数据文件，需要对它简单加工一下，把它开头的`ipfs://`替换成：

`https://ipfs.io/ipfs/`

替换后的完整地址是这样的：

h[https://ipfs.io/ipfs/QmRnWJzYApCZUs6NqLvGXFjyYn9xmNBrcYEp4u9hDN1cuG/2357.json（开头第一个h需要删掉）](https://ipfs.io/ipfs/QmRnWJzYApCZUs6NqLvGXFjyYn9xmNBrcYEp4u9hDN1cuG/2357.json%EF%BC%88%E5%BC%80%E5%A4%B4%E7%AC%AC%E4%B8%80%E4%B8%AAh%E9%9C%80%E8%A6%81%E5%88%A0%E6%8E%89%EF%BC%89)

在浏览器里打开这个加工过的地址，可看到里面的数据：

![](https://storage.googleapis.com/papyrus_images/10fd5e052e2cd6f8e151de259244fc5a016566a07751a3294461d001813ae888.png)

我们需要的是里面**image**这一行，这里记录了图片的存储位置：

    ipfs://Qmc481V4BUgxMZkJXe4XEUwFPn4mrvBsWjLFFLt8dzFay6/2357.png
    

这个地址是ipfs开头，说明图片也是存储在ipfs网络上的，要想用浏览器打开它，看到它的真面目，我们需要和刚才一样的步骤对它进行加工。

加工之后的图片地址是：

h[https://ipfs.io/ipfs/Qmc481V4BUgxMZkJXe4XEUwFPn4mrvBsWjLFFLt8dzFay6/2357.png（开头第一个h需要删掉）](https://ipfs.io/ipfs/Qmc481V4BUgxMZkJXe4XEUwFPn4mrvBsWjLFFLt8dzFay6/2357.png%EF%BC%88%E5%BC%80%E5%A4%B4%E7%AC%AC%E4%B8%80%E4%B8%AAh%E9%9C%80%E8%A6%81%E5%88%A0%E6%8E%89%EF%BC%89)

在浏览器打开图片地址，终于看到了它真正的样子。这一刻，你是什么样的心情呢？花那么钱就买了这样一张图片，激动不？

![](https://storage.googleapis.com/papyrus_images/75369436f7fdd22b78700afa2e99191bbddab1ce7c07767188be3027d356f83b.png)

4\. 如何通过智能合约证明图片是属于你的？
----------------------

回到本文开头提出的问题，如何证明你买的那个图片属于你？当然还是要靠智能合约。

还是在前面 **3.2** 的智能合约查询界面， 找到**ownerOf**这个查询函数，输入图片的编号，点击Query查询，返回的就是拥有者的钱包地址。你只要能证明这个钱包是你的，那么这个图片就是你的。

![](https://storage.googleapis.com/papyrus_images/846524dd7e52c6c36c831a345a5274ece094ffa2e230b4b91355739ce5699c67.png)

说到这里，相信你已经搞清楚了通过智能合约买到一张图片的过程。请仔细思考一个问题：

**你买到的图片真的就是你的吗，有没有被篡改的可能？**

5\. 结语
------

本文是一个简单科普文，**旨在向刚入门的朋友做一些介绍，文中对很多问题进行了简化问题，只说了最常见、最主流、最简单的情况（谁杠谁傻逼）**，希望大家可以举一反三，触类旁通。

如果文中有实质性错误，欢迎批评指正。Mirror这里好像不能直接评论，找我反馈可以通过下面的名片：

[https://muselink.cc/2357](https://muselink.cc/2357)

---

*Originally published on [扁宇宙日志](https://paragraph.com/@0x2357/nft)*
