# NFT的“开图”是怎么实现的

By [xyyme.eth](https://paragraph.com/@xyyme) · 2022-03-15

---

我们知道，NFT 最开始 mint 之后，所有的图都是一样的，比如下面这种：

![MURI](https://storage.googleapis.com/papyrus_images/59f47f5eb39bc0a5facf990c824b72bfff945c4fef925ddfedd640f219140844.png)

MURI

（上图为 [MURI项目](https://opensea.io/collection/murixhaus)）

在经过项目方“开图”之后，每个图都有了各自的风格，比如下面这样：

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

Azuki

（上图为 [Azuki项目](https://opensea.io/collection/azuki)）

那么这一步是怎么实现的呢？

### 设置初始图片

其实原理很简单，我们知道，ERC721 中有一个字段 tokenURI，一般是由

> baseURI + tokenId

构成。在项目初期，管理员地址会将**未开图**的图片信息设置到 baseURI 上，一般是通过发送交易或者直接在合约构造方法中设置。以 MURI 为例，管理员是直接在构造方法中就设置了最初的 baseURI：

    constructor(bytes32 _merkleRoot, string memory contractBaseURI)
    ERC721A ("MURI", "MURI") {
        merkleRoot = _merkleRoot;
        baseURI = contractBaseURI;
    }
    

查询 baseURI 内容为：

> ipfs://QmTCAt4Y4r1HyHRyqwqHgrJvU7D78PSRuw4LefEbG5Ww49/

我们随便查询一个 tokenId，也就是直接在后面加上 tokenId，得到一个 Json 文本：

    {
      "name": "MURI [11]",
      "description": "MURI is a collection of 10,000 individual characters, each playing a role in the story between the worlds of Night City and its spirit.",
      "image": "ipfs://QmfJEERKhLJbenpMFBtcbC9pMssBBd6CjJTKW5K47UUdp7/",
      "attributes": [
        
      ]
    }
    

其中 image 字段存储的就是图片的 ipfs 地址，这就是我们前面看到的图片的 ipfs 地址。

### 开图

当管理员“开图”的时候，会发送一笔交易设置 baseURI。以 Azuki 为例，[这笔交易](https://etherscan.io/tx/0x4cf5e32afae76c300da14023f7d833a0a7923fbec0590f3d2f8cb1ff0ae2ac68)进行设置：

![Azuki设置baseURI的交易](https://storage.googleapis.com/papyrus_images/78b9184ef8daf82c4cf8cd8d5637c7f0c055f63065a2bbfcbaea624453bc9ea4.png)

Azuki设置baseURI的交易

在设置了 baseURI 之后，也就是已经**开图**了。我们在 baseURI 后面随便加上一个 tokenId，同样得到一个 Json 文本，继续查询 image 字段，就得到了开图后的相应 tokenId 的图片地址。

### 总结

其实开图的逻辑很简单，就是对 baseURI 进行更改，从而达到效果。

---

*Originally published on [xyyme.eth](https://paragraph.com/@xyyme/nft)*
