jjzjj

Conflux 树图区块链 “数字藏品" 合约标准和编写规范

Conflux中文社区 2024-03-20 原文

Conflux 树图链欣欣向荣,尤其是“数字藏品”等相关应用,如雨后春笋般涌现。但是随之而来的是良莠不齐的合约质量和标准兼容度。

"数字藏品"是在区块链上发行的具有一定文化背景、艺术价值或者收藏价值的“藏品”,需要和普通的非同质化代币 (NFT)相区分,相关接口需要更加规范和标准。

为了整个 Conflux 树图链上“数字藏品”应用的繁荣和可持续发展,为了应用之间方便集成,为了保证合约质量和安全,我们编写了《“数字藏品" 合约标准和编写规范》,请所有“数字藏品”开发者务必仔细阅读本文,并遵循以下标准和规范。如果合约不满足以下标准和编写规范,则不能称为是Conflux树图链上的 “数字藏品”。

1. 遵循 OpenZeppelin 标准

OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts) 提供了一个经过社区审查的智能合约库,其中包括了 ERC 721 (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) 和 ERC 1155 (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol) 的实现。

在部署到 Conflux 链上之前,请确保你的合约 至少包含了 上述任一实现的全部内容。对于其他非 OpenZeppelin 的 ERC 721 和 ERC 1155 合约标准的实现,需要保证对外暴露的接口名称与 OpenZeppelin 的实现一致。

name 和 symbol 属性在合约中是必须的,否则无法在 ConfluxScan 和第三方应用上完整展示 NFT 信息。

2. 非同质化

任何时候 都要保证您的合约所发行的 “数字藏品” 是 非同质化的 : 每一个 tokenId 都只对应一个 “数字藏品”,不能存在一个 tokenId 下有多个副本的情况。

优先考虑使用 ERC 721 标准,足够满足大多数情况的使用。

如果希望使用 ERC 1155 标准,也请务必保证一个 tokenId 对应1个 “数字藏品”,以免造成用户对于“数字藏品“ 价值的疑虑。

3. 使用枚举函数

枚举接口的作用强调"去中心化"显示数据。使用枚举函数能方便第三方应用(ConfluxScan 和钱包等)查询您部署的合约保存的 NFT 信息,否则无法保证您的 NFT 能够被 ConfluxScan 和钱包正确显示。所有的 CRC-721 合约都 必须包含 以下合约中的全部枚举函数:

  • ERC721Enumerable: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Enumerable.sol

  • CRC721Enumerable: https://github.com/conflux-fans/conflux-contracts/blob/main/contracts/token/CRC721/extensions/CRC721Enumerable.sol

所有的 CRC-1155 合约都 必须包含 以下合约中的全部枚举函数:

  • CRC1155Enumerable: https://github.com/conflux-fans/conflux-contracts/blob/main/contracts/token/CRC1155/extensions/CRC1155Enumerable.sol

更多枚举相关内容请参考: https://conflux-technical-support.gitbook.io/conflux-nft-kai-fa-zhi-nan/he-yue-mei-ju-han-shu-shuo-ming/mei-ju-kuo-zhan-enumeration-extension

4. 设置代付合约

Conflux 的代付机制通过一种赞助机制来补贴用户对智能合约的使用,通过引入内置的代付合约,与受到赞助的合约交互将不需要花费 CFX 来支付燃气费,让余额为零的新账户也能够调用智能合约。

因此,请务必在您的合约中 引入代付合约,并设置 燃气费代付,保证任何用户与你的合约交互都能被代付机制赞助而无需花费 CFX,在当下环境,这对于你的 NFT 应用的合规性很重要。范例工程合约 NFT 1.0 和 2.0 默认配置了代付,部署后在 https://confluxscan.net/sponsor 申请即可。

项目方如果希望获得代付设置方面的帮助,请联系: scan@confluxnetwork.org

代付机制详情请见:

  • Conflux 中的代付机制详解: https://forum.conflux.fun/t/conflux/11949

  • 为合约设置 Sponsor: https://forum.conflux.fun/t/sponsor/13014

5. 合约验证

将合约部署到主网后,请务必在 ConfluxScan 上进行验证。

合约验证之后会有如下几个好处:

  1. 合约验证之后可在 Scan 上看到 Solidity 源码及 ABI,更加透明,人人可审查合约逻辑。

  2. 验证之后的合约可直接在 Scan 合约详情页,调用合约方法读取合约状态,或通过链接 Fluent 更新合约状态。

  3. 合约验证之后,Scan 会显示绿色✅标识,用户更放心。

如何验证合约请参考:

  • 与合约交互:

    https://conflux-technical-support.gitbook.io/conflux-nft-kai-fa-zhi-nan/step-1-ren-shi-confluxscan/yu-he-yue-jiao-hu#ru-he-yan-zheng-he-yue

  • ConfluxScan 验证合约: https://wiki.conflux123.xyz/books/tutorials/page/confluxscan

TO BE CONTINUED

本规范持续更新中,更多内容请点击下方“阅读原文”

有关Conflux 树图区块链 “数字藏品" 合约标准和编写规范的更多相关文章

  1. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

  5. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  6. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  7. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  8. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  9. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  10. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

随机推荐