写点什么

如何将 NFT 元数据从 IPFS 转移到智能合约中

作者:devpoint
  • 2022 年 7 月 19 日
  • 本文字数:1886 字

    阅读完需:约 6 分钟

Millionaire’s Mining Club 首次推出时,NFT 元数据存储在 IPFS 上。当时这似乎是正确的选择,但后来 IPFS 开始限制其灵活性,从那时开始探索将 NFT 元数据存储在智能合约中。

什么是 NFT Metadata

根据 ERC-721 NFT 标准,NFT 可以具有可选的 tokenURI 功能。tokenURI 有一个 tokenId 的输入,并返回一个字符串 URI,其中包含描述 NFT 的附加元数据。这个 tokenURIOpenSea 这样的平台如何发现关于 NFT 的图像、属性、统计信息、详细信息等。


来看一个例子:


{  "name": "Founders Edition",  "description": "Founders Edition Nifty Miner",  "external_url": "https://miningclub.app/token/0",  "image": "https://gateway.pinata.cloud/ipfs/QmTyeUQzwCnAPx9ZruQA9isdHP4YDdmbr1boqDSXFJGBbp/founders-electric-blue+.png",  "background_color": "ffffff",  "attributes": [    {      "trait_type": "Mint Number",      "value": 1,      "display_type": "number"    },    {      "trait_type": "Edition",      "value": "Founders"    },    {      "trait_type": "Rarity",      "value": "Ultra Rare"    },    {      "trait_type": "Highlight",      "value": "Electric Blue"    },    {      "trait_type": "Quality",      "value": "Perfect"    }  ]}
复制代码


这是描述 OpenSea 上 Founders Edition NFT(tokenId 为 0)的元数据。

为什么将元数据存储在 IPFS 上?

最初开始将元数据存储在 IPFS 上,这算是行业标准了,是大多数项目存储元数据的方式。这通常适用于大多数具有不可变 NFTS(或不改变的 NFT)的项目。


Pinata 在 IPFS 之上提供了一个 https URI 封装器,为 OpenSea 提供了查询 NFT 元数据的简便方法。

为什么不在 IPFS 上存储元数据?

有了 Millionaire’s Mining Club,IPFS 成了一个限制,每次 NFT 数据发生变化时,都必须将一组新的元数据推送到 IPFS。


查询 IPFS 可能非常慢。


IPFS 还需要一台始终打开并连接到 IPFS 网络的机器来提供文件,通常涉及像 Pinata 这样的固定服务。每次对 IPFS 进行更改时,Pinata 也必须更新。


Nifty Miner NFT 需要更大的灵活性,需要能够立即更新元数据并从智能合约本身触发更新。使用 IPFS,这很快变得复杂起来。

如何在智能合约中存储元数据

智能合约了解有关 NFT 的所有信息,并且可以轻松更新属性。找到一种将元数据也存储在智能合约中的解决方案是有意义的。除了通常习惯的标准 URI,还有数据 URI。


示例数据 URI:data:application/json;base64,eyJoZWxsbyI6IndvcmxkIn0=


此数据 URI 的类型为 application/json,它也是 base64 编码的。 base64 编码对于 OpenSea 解析 URI 很重要。


此数据 URI 的内容是:


{"hello":"world"}
复制代码

在智能合约中存储元数据的限制

第一个限制是 URI 的大小。 URI 的最佳实践限制为 2,000 个字符。所以最好尽可能地保持在这个限制之下。如果 NFT 元数据超过此限制,则 Data URI 解决方案将不起作用。


现在必须将大量字符串数据存储在智能合约中。这将增加部署智能合约的成本,但更重要的是会使智能合约面临超过智能合约大小 24KB 限制的危险。


元数据的更改可能需要重新部署智能合约。

解决方案

解决方案是部署一个单独的 JsonMetadata 智能合约。这将使主要 NFT 智能合约保持庞大的大小,使保持在 24KB 的限制之下。


然后可以从主 NFT 智能合约调用 JsonMetadata 方法并返回数据 URI。


这是 JsonMetadata 智能合约的一个小片段。


import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";import "@openzeppelin/contracts/utils/Base64.sol";contract JsonMetadata is AccessControlUpgradeable {  string public _baseUri;  string constant _dataUri = "data:application/json;base64,";  function getVipCardUri() public view returns (string memory) {    bytes memory json = abi.encodePacked(      '{"description":"VIP Card","external_url":"',      _baseUri,      'vip-card.png","image":"',      _baseUri,      'vip-card.png","animation_url":"',      _baseUri,      'vip-card.glb","name":"VIP Card","background_color":"ffffff","attributes":[{"trait_type":"Status","value":"VIP"},{"trait_type":"Access","value":"Whitelist"}]}'    );    return string(abi.encodePacked(_dataUri, Base64.encode(json)));  }}
复制代码

总结

在 IPFS 上存储 NFT 元数据限制了我们的动态 NFT。元数据需要与 NFT 一样动态。数据 URI 提供了一种将 NFT 元数据直接存储在智能合约中的解决方案。


发布于: 刚刚阅读数: 4
用户头像

devpoint

关注

细节的追求者 2011.11.12 加入

专注前端开发,用技术创造价值!

评论

发布
暂无评论
如何将 NFT 元数据从 IPFS 转移到智能合约中_智能合约_devpoint_InfoQ写作社区