xyyme.eth

Posted on Mar 15, 2022Read on Mirror.xyz

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

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

MURI

(上图为 MURI项目

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

Azuki

(上图为 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 为例,这笔交易进行设置:

Azuki设置baseURI的交易

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

总结

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

NFT