Conflux NFT 开发者指南

近期,随着 Conflux 生态的逐步建立,大量优质生态应用在 Conflux 中部署,Conflux 公链欣欣向荣起来。尤其是 NFT 相关应用,如雨后春笋般涌现。但是随之而来的,是良莠不齐的合约质量和标准兼容度。

为了整个 Conflux 链上 NFT 应用的繁荣和可持续发展,为了应用之间方便集成,为了保证合约质量和安全,建议所有 Conflux NFT 开发者 仔细阅读 本文。

遵循标准

 
NFT 开发者 应该 完全仔细阅读并完全遵循 EIP-721EIP-1155 标准。

建议 没有同质化代币和非同质化代币混合 使用场景的应用,采用并遵循 EIP-721标准。

标准合约接口和实现可以参考:
EIP-721:https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721
EIP-1155:https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155

通过 uri 或 tokenURI 方法获取的 NFT 元数据 URI 地址,建议使用 placeholder 格式,而非每个 tokenId 存储一个 URI。

线下 NFT JSON 元数据信息 应该 遵循各个标准的 Metadata 部分,建议 不论是 721 还是 1155,都遵循 1155 的 Metadata JSON Schema 规范,包含 name、image、description 等字段,并在多语言支持上采用 localization 字段和标准(而非使用非标准的结构和字段,比如 name_en 等)。

未来 ConfluxScan 或钱包应用,可能会对没有完全遵循 EIP-721EIP-1155 标准的合约,放弃支持或只提供有限的支持。

共建 Conflux 合约库

 

上面的 repo 包含了 Conflux 上常用的合约工具,比如内置合约、721/1155 扩展等。开发者可以按需使用。

欢迎所有开发者提 issue 或 pr,共同丰富合约库内容。

Enumerable


枚举功能可以 发现合约已经发行的和某个用户所拥有的 NFT。如果在合约中实现,会带来额外的存储成本和 Gas 消耗。尽管如此,为了保证 ConfluxScan 和其他具有 NFT 展示功能的钱包能够实时获取 NFT 数据,强烈建议 开发者在 CRC721 和 CRC1155 标准的合约中实现枚举功能。未来 ConfluxScan 可能会取消对 mint 事件的检索,未实现枚举功能的合约所发行的 NFT 将无法被查看。

Conflux 链上 Gas 成本较低,并且初期有代付机制,因此添加枚举功能带来的额外 Gas 和存储抵押费用是可以被完全覆盖的。

考虑到会给用户带来额外的 Gas 成本, EIP-721 中把可枚举扩展作为可选项,EIP-1155 标准直接去掉了可枚举扩展。对于 1155 合约,可以采用 Conflux 合约库中的 扩展实现。

Enumerable Gas Cost 比较


call safeTransferFrom, tokenId: 1, amount: 1, data: 0x
如果 1155 需要实现 Enumerable,建议基于 CRC1155 presets

Ethereum Conflux
不支持 IERC721Enumerable Code
txHash

Gas Used: 61,564
Code
txHash

Gas Used: 53,704
存储押金:128
支持 IERC721Enumerable Code
txHash

Gas Used: 87,888
Code
txHash

Gas Used: 75,828
存储押金:192
不支持 IERC1155Enumerable Code
txHash

Gas Used: 53,514
Code
txHash

Gas Used: 42,356
存储押金:64
支持 IERC1155Enumerable Code
txHash

Gas Used: 123,547
Code
txHash

Gas Used: 76,689
存储押金:256




支持 Enumerable 后,mint 操作会带来更多存储押金花费:

Conflux
不支持 IERC721Enumerable Code
txHash

mint Gas Used: 37,796
mint 存储押金:128
支持 IERC721Enumerable Code
txHash

mint Gas Used: 64,296
mint 存储押金:320
不支持 IERC1155Enumerable Code
txHash

mint Gas Used: 34,974
mint 存储押金:64
支持 IERC1155Enumerable Code
txHash

mint Gas Used: 74,013
mint 存储押金:512

其他注意事项

  1. 如需申请代付,需要先完成合约验证,详情参见Conflux 中的代付机制详解: Conflux 中的代付机制详解

  2. 如果应用有短时间内发送大量交易的需求,可以通过以下2个方式极大提高性能,避免被限流:
    1)通过mintBatch,一次mint多个nft;
    2)通过rpc batch 调用方式,一次性组装好100条交易,一次性发送给full node。

  3. pending检测工具:http://pendingtx.conflux123.xyz/

NFT 存储相关参考


【更多资料,请查看Conflux开发资料包:Conflux开发资料包

8 Likes

硬核

1 Like

强烈支持,开发NFT并不难,难的是动手前静下心去了解EIP721与EIP1155及其背后的历史。

另外建议正在开发或是计划进入NFT类的项目方,认真思考NFT技术背后的逻辑,产品能够解决什么样的痛点问题,价值体现在何处,如何推广运营。

太好了,终于有这样的干货了,现在社区符合标准的 NFT 合约真不多,加油加油~

赞啊,终于有标准了

帮补充具体读取方法

先用tokenCountOf(账户)得到账户中nft数量
然后遍历,用tokenOfOwnerByIndex 拿到单个的id 然后uri(id) 后面一样了

教程里的2.0工程范例经过多个社区朋友测试使用修改,基本稳定。

2 Likes

举手提问:
我的合约根据 ERC721 的标准写的,元数据是 1155 格式,在cfx区块链浏览器正常访问,但是在 moonswap/nft 无法访问到,据我了解 moonswap 是cfx 比较重要的生态,但是它似乎并不像 opensea 那样会将链上符合标准的NFT 都读取出来,这是我使用的元数据格式不对或者是我的合约缺少某个关键函数还是因为 moonswap 就是只读取自家的 nft?

mark

:rofl:没人吗,我的这个example地址 自助铸造NFT

当然时moonswap需要你找他们合作才能上架呀~~
这种随便上传就可以mint的估计挺难的~~

符合标准的范例工程和教程分享如下:
下载其中的NFT2.0工程。

并且提供了两个批量空投函数,很实用。

2 Likes