本文提供了一个73条清单,帮助开发者有效编写NFT智能合约,包含多个步骤和最佳实践,从准备阶段到部署后任务,涵盖安全性、测试、Gas节省等方面。通过结构化的方式和代码示例,旨在帮助阅读者了解编写安全、高效的NFT合约的重要性,同时指出了在学习中应关注的关键概念。
遵循这个73点的检查清单,不再写坏的NFT智能合约。
这是在以太坊上编写NFT合约时的一组最佳实践。
一个关于实现NFT合约的常见最佳实践的一站式资源。
旨在总结每个项目并让你意识到它的存在。为了简洁起见,这里不能详细描述每个项目。如果对任何内容不熟悉,请自行研究。
一些点被详细展开,包括代码示例,而一些仅作为一句话的提醒或简单的是/否检查项列出。
这是一个有用的检查清单,可以用来检查你的智能合约。
但如果你还在学习,尚未编写自己的智能合约,这就是一个NFT学习路线图:
浏览列表
你能实现这个功能吗?
不可以?阅读相关内容,学习如何实现它。即使你不使用它,也要知道它是做什么的,以及它为什么重要。
可以?继续下一个要点。
请记住,这不是一个100%完整的列表。它也不能替代安全审计的必要性。
注意:本指南基于我们在YouTube频道上发布的一系列视频。所有视频均包含在下面的适当部分中。你可以选择阅读或观看,具体取决于你的偏好。视频内容是相同的,但包含更多的解释和细节。
这个检查清单的73个要点被分为8个类别:
准备(第1 - 7点)
安全基本要素(第8 - 17点)
测试(第18 - 29点)
节省Gas费(第30 - 42点)
部署(第43 - 48点)
铸造(第49 - 63点)
管理(第64 - 70点)
上线后(第71 - 73点)
有用的资源
你可以从头到尾浏览这个列表。它分成了按时间顺序排列的部分,从准备阶段开始,直到上线后阶段结束。或者你可以专注于特定部分,比如如果你只对Gas优化或铸造阶段感兴趣。
如果你更喜欢观看,而不是阅读,这份指南被分为四个视频,涵盖了本指南中的所有材料。
本视频涵盖了准备(第1 - 7点)、安全基本要素(第8 - 17点)和测试(第18 - 29点)。
如何编写一个好的NFT智能合约 - 第1部分 | NFT PhD - YouTube
QuickNode
131K 订阅者
如何编写一个好的NFT智能合约 - 第1部分 | NFT PhD
QuickNode
搜索
信息
购物
点击以取消静音
如果播放未能尽快开始,请尝试重启你的设备。
你已退出登录
你观看的视频可能会添加到电视的观看历史中并影响电视推荐。要避免这种情况,请取消并在你的计算机上登录YouTube。
取消确认
分享
包含播放列表
检索共享信息时发生错误。请稍后再试。
稍后观看
分享
复制链接
观看
0:00
/ •直播
•
订阅我们的YouTube频道获取更多视频! 订阅
ERC-721
当前广泛使用的标准。
一些ERC-721 NFT项目:CryptoKitties、Crypto Coven、Cool Cats。
ERC-1155
批量转账
支持可替代、半可替代和非可替代代币
在发生错误时可以被回退
ERC-1155代币的例子:adidas Originals NFT
有关所有可以部署的区块链的更多信息:什么技术来部署NFT | NFT PhD
有关NFT存储的更多信息:什么技术来部署NFT | NFT PhD
Solidity - 从Solidity网站下载最新版本
Hardhat - 灵活、可扩展、快速的以太坊开发环境
Foundry - 快速、可移植且模块化的以太坊应用程序开发工具包,由Rust编写
Gnosis Safe - 在以太坊上管理数字资产的平台。
如果你的项目由多个人组成,由外部拥有的账户(本质上是钱包)管理你的业务的加密资金并不是一种安全的方法。如果某位员工采取了不当行为或对私钥不够谨慎,那么资金将永远消失。即使你的企业只有你自己,这仍然是一种糟糕的资金管理方式。
Gnosis Safe解决了这个问题。它是一种多签解决方案,本质上是一种在多个区块链上运行的智能合约钱包,需要最少数量的人批准交易才能进行(M-of-N)。
例如,如果你的企业有3位主要利益相关者,你可以设置钱包要求2人或3人中的2人(2/3)在发送交易前批准。这确保没有一个人可以妥协资金。
区块链上的任何东西都是公开的,包括私有变量
tx.origin唯一真实的用例是检查智能合约是否在调用你的代码。将其用于验证可能导致网络钓鱼攻击。
这两个值将具有相同的哈希。在这种情况下,使用 abi.encode 而不是 abi.encodePacked:
考虑到不同的参数可以返回相同的值,攻击者可能利用这一点,通过修改先前函数调用中元素的位置来有效绕过授权。如果这是某个重要管理功能的一部分,这将成为问题。
在Solidity函数中调用多个函数的顺序是未定义的
Solidity并没有规定在这种情况下哪个函数优先被调用:
method1可能在method2之前被调用,或method2在method1之前被调用,取决于Solidity版本。
如果这些函数可能导致状态变化或引用内存中的同一位置,这将是一个高度问题。
仔细检查代码,确保可以容忍以任意顺序调用函数。
任何人都可以通过直接将以太发送给智能合约来改变合约的余额。即使你通过在msg.value不为零时回退来覆盖receive和fallback函数,另一智能合约仍然可以selfdestruct并强制将以太发送到另一个地址,从而绕过这些检查。
如果你的逻辑期望一个地址的余额保持精确值或静态状态,那么这种假设可能会被打破。
参见 Force Feeding 阅读更多关于为何依赖合约的以太余额进行准确比较是不可靠的。
delegate调用赋予被委托地址无限权力。这只应该与你控制的合约一起使用,并确保被委托的地址不能被未经授权的用户更改。
如果这个函数没有考虑到外部函数调用可能会回退的可能性,可能会出现拒绝服务的情况。
如果你调用一个外部合约,该函数可能会回退。如果这是故意的,那么你的合约将无法完成其交易。
在承诺使用某个版本的Solidity编译器之前,检查 soliditylang.org 以了解是否存在已知漏洞。
浏览发布公告:https://blog.soliditylang.org/category/releases/
这种漏洞的最常见表现是闪电贷攻击。如果你的合约在一个池中检查资产的价格,那么恶意用户可以使用闪电贷操控该资产价格,从而在你的合约中造成意外行为。
如果你的网站展示了存储在智能合约中的字符串,并且智能合约允许用户设置任意字符串(例如给NFT起昵称),那么他们可以通过<script>
标签向网站注入恶意JavaScript。
前端安全也非常重要,尤其是当涉及到连接区块链的网站和钱包中的用户输入时。
特定于你的区块链。
工具类型:形式验证、符号执行、代码检查器和测试覆盖率分析器。
智能合约中的一个bug可能会导致公司的终结。100%覆盖率虽然麻烦,但这是值得支付的代价。
运行单元测试需要创建断言——简单且非正式的语句,指定智能合约的要求。
随后测试每个断言,检查在执行时是否为真。
与合约相关的断言示例包括:
“只有管理员可以暂停合约”
“非管理员无法铸造新代币”
“合约在出现错误时回退”
仅仅因为代码的覆盖率是100%并不意味着角落情况也经过测试。
如果你将<
替换为≤
,这将导致测试失败。
变异测试会自动变异代码并重新运行测试,以告知你测试的有效性。
使用 prettier 以保持代码格式一致。这使得代码更易于阅读。
Slither - Trail of Bits提供的静态分析工具。
Echidna - Trail of Bits的模糊测试工具。
Manticore - Trail of Bits的符号执行工具。
MythX - 智能合约安全的付费服务。
Mythril - MythX 免费版。
ETH Security Toolbox - 创建配置有Trail of Bits安全工具的docker容器的脚本。
ethersplay - ETH反汇编器
Consensys Security Tools - Consensys工具列表
这与忘记在函数上添加 onlyOwner 修饰符有关。这导致了Parity钱包被冻结的事件。
查看每个函数,考虑需要做什么以及谁应该被允许调用它。
输入整数的合理最小值或最大值是什么?(请注意,require(x >= 0) 是必要的检查)
数组或字节预期的长度是多少?
确保公共函数只执行最少的要求
作为测试的一部分,模拟铸造完毕。当你铸造最后一个NFT时会发生什么?前端和后端都是。
你能否继续铸造?你看到错误了吗?显示了什么类型的信息?
eth-gas-reporter - 以太坊测试套件的Gas报告工具
示例输出:
尽管此检查清单的目标是帮助你编写最佳的NFT智能合约,但这并不意味着遵循它后你不再需要审核代码。你仍然需要进行审计。但因为你的代码结构和质量会更好,最后可能会支付更少的费用。
本视频涵盖节省Gas费和优化(30 - 42点)
如何编写一个好的NFT智能合约 - 第2部分 | NFT PhD - YouTube
QuickNode
131K 订阅者
如何编写一个好的NFT智能合约 - 第2部分 | NFT PhD
QuickNode
搜索
信息
购物
点击以取消静音
如果播放未能尽快开始,请尝试重启你的设备。
你已退出登录
你观看的视频可能会添加到电视的观看历史中并影响电视推荐。要避免这种情况,请取消并在你的计算机上登录YouTube。
取消确认
分享
包含播放列表
检索共享信息时发生错误。请稍后再试。
稍后观看
分享
复制链接
观看
0:00
/ •直播
•
订阅我们的YouTube频道获取更多视频! 订阅
与ERC721相比,如果你要铸造多个代币,ERC721A使铸造变得更便宜。
当用户铸造多个代币时,ERC721A只更新一次铸造者的余额,并将那一批代币的所有者设置为整体,而不是逐个代币。
ERC721A的问题在于,由于这项铸造优化,用户在转移代币时将产生更高的Gas费用。
平均而言,使用ERC721A转移代币的成本高出55%。
决定是否使用ERC721A时,考虑转移代币的额外成本,并考虑用户是否会铸造大批量代币。
使用ERC721A的合约:Azuki(合约代码)、goblintown(合约代码)、Moonbirds(合约代码)
增加更多功能是诱人的,例如使链下查询更容易。
问题在于你添加的任何额外功能都会增加Gas成本。
ERC721Enumerable扩展在任何转移时都会增加大量开销(合同在用户铸造时向用户转移,或任何用户之间的转移)。
ERC721Enumerable使用4个映射和一个数组来跟踪每个用户拥有的代币ID。在每次转移时写入这些结构会消耗大量的Gas。
映射的优势在于你可以不必迭代数组就能访问任何值。
缺点是你无法迭代映射。
safeMint用于防止将ERC721铸造到不支持ERC721转移的合约,从而防止ERC721Token被卡在那。如果你确定这不会发生(几乎总是如此),你可以直接使用 _mint 来节省Gas费用。
尽管映射比使用数组更便宜,如果你计划拥有许多(1000+)用户在白名单上,它仍然可以是一个非常昂贵的解决方案。
你只需将一个哈希(仅32字节)写入智能合约,而不是需要写入数千个地址。
这使得将白名单写入智能合约尽可能便宜+它与白名单的大小无关(如果白名单是10个或10,000个地址,费用是相同的)。
有几个缺点:
要检查一个地址是否在Merkle树中,你需要提供所谓的Merkle证明。
算术操作可以被包装在unchecked块中,这样编译器就不会包含额外的操作码来检查下溢/上溢。这可以使你的代码更加节约成本。
节省的费用并不巨大,但如果你有许多不同的算术操作,或者例如在for循环中修改迭代器的值,那么你可以通过unchecked块为用户节省一些Gas。
Solidity编译器自带集成优化工具。
优化器能够降低部署和函数调用的Gas费用。
要使用优化器,你需要启用它并设置“运行次数”。
它的工作方式是做出一些牺牲,这些牺牲可能会增加结果字节码的大小,从而增加智能合约的部署成本。
总是最好将优化器打开。当优化器关闭时,部署和调用函数的Gas成本都更高。
当关闭优化器时,部署的费用要高得多,几乎是两倍。
测试不同的“运行次数”设置。默认值为200,但可以测试为1、200、1000、5000,甚至必要时高达一百万(Uniswap对此合同采用了这种方式)。
只有在合同过大而无法部署时,才会降低优化器。
在Solidity中,变量打包是将小存储变量并排放置,以便它们坐落于一个256位的插槽中。
如果不需要完整的256位,变量打包可以节省部署成本。
虽然你可以通过变量打包节省Gas在部署上的开支,但用户将不得不支付额外的费用。每当从存储中提取一个小于256的uint(甚至是bool)时,EVM会将其转换为uint256。这种额外的转换会消耗Gas,因此最好避免。
external不允许合约本身调用函数,而public允许。尽管它们完成相同的事情(允许外部调用),但外部调用更节省Gas,因为Solidity不需要考虑两个入口点。
循环遍历用户可以推送任意数量条目的数组,可能会导致函数在Gas需求超出区块限制时无法再执行。
对不转移以太或外部调用的函数使用OpenZeppelin的非重入修饰符是浪费Gas。
在一个事务中不要两次读取同一个存储变量。将其缓存到局部变量中。
唯一的例外是当你在处理不受信任合约进行账本记录时。
写入区块链和读取区块链是Gas成本中最昂贵的活动。尽可能避免。
本视频涵盖了部署(第43 - 48点)和铸造(第49 - 63点)阶段。
如何编写一个好的NFT智能合约 - 第3部分 | NFT PhD - YouTube
QuickNode
131K 订阅者
如何编写一个好的NFT智能合约 - 第3部分 | NFT PhD
QuickNode
搜索
信息
购物
点击以取消静音
如果播放未能尽快开始,请尝试重启你的设备。
你已退出登录
你观看的视频可能会添加到电视的观看历史中并影响电视推荐。要避免这种情况,请取消并在你的计算机上登录YouTube。
取消确认
分享
包含播放列表
检索共享信息时发生错误。请稍后再试。
稍后观看
分享
复制链接
观看
0:00
/ •直播
•
订阅我们的YouTube频道获取更多视频! 订阅
许多部署工具要求将私钥未加密地加载到硬盘上。
如果必须这样做,必须采取措施隔离计算机或在部署后立即转移合同的所有权。
使用硬件钱包进行扁平化和部署也是一个好策略。
有多个原因:安全性、隐私、在多个链上的相同钱包地址,以及虚荣地址。
安全性: 如果你只使用钱包执行一个操作(合约部署),你可以最大程度地减少钱包被攻击的风险。尤其是如果你使用硬件钱包。
隐私: 你可能不想将已部署的合约与你相关联,出于隐私原因或为了在铸造开始之前保持合约的秘密。
相同钱包地址(在EMV兼容的L2上):合约地址是确定性的:它是你的钱包地址和账户nonce(即你的钱包发布的交易数量)的哈希。这意味着如果你的钱包的第一笔交易是部署合约,那么在你部署的所有L2上都会得到相同的地址。
虚荣地址: 使用与上述相同的想法,你可以使用一些软件生成数百万个以太坊地址,以找到与nonce 0结合后产生一个好看的合约地址。不过,如果该工具是公开的,可能不太建议这样做,因为有人可以使用同样的工具生成你虚荣地址的私钥并危害它。
https://etherscan.io/chart/gasprice - 历史Gas价格图表
https://etherscan.io/gastracker - 当前Gas价格
检查即将发布的NFT项目,以确保没有热门项目在你的上线日期铸造:
安装 hardhat-etherscan 插件
铸造逻辑是常见的错误源,你不希望这些错误永远留在代币中。
保持代币合约尽可能简单。
固定pragma
当你自己设置编译器版本时,不要使用 pragma solidity ^0.8.7。这使得验证者不清楚使用了哪个版本的Solidity。仅在你不是编译它的库代码中使用这种模式。
而是用 pragma solidity 0.8.7。
没有魔术数字
适当使用可读性关键词(小时、天、以太、1_000_000等)
在Solidity中,1 days会自动转换为86400秒,这更加可读。
使用 1_000_000 而不是 1000000 以提高可读性。
在处理以太坊数量时使用以太关键词,当涉及到10**18的数量表示。
缺失的require消息
不具描述性或误导性的变量名、函数名或注释
避免名称如mapping3或data,因为它们非常模糊。
确保变量名精确、准确且可描述。
不准确或过时的注释也应被标记。
未使用的变量
有关存储选项的更多信息:什么技术来部署NFT | NFT PhD
不要分享URLs。
小心在测试网上启动,以免泄露元数据。
确保仅存储必需的数据在区块链上。存储许多变量以存储数据在开发智能合约时是更容易的,但在区块链上存储是非常昂贵的。存储成本不仅在合同方面(你支付它们),还在铸币方方面,当不必要的存储数据影响铸造的Gas价格。
有关更多详细信息和特定优化策略,请参见Gas优化部分。
有一个功能可以限制代币供应。如果在推出系列后,你决定初始供应量太大,它将允许你限制系列的大小。
至少要限制每个钱包的铸造数量。
问题1: 揭示你的代币元数据(允许抢购者推断代币的稀有性)
仅在代币铸造后揭示元数据
使用分批逐渐揭示。所有链上数据都可能被读取和利用。因此,在铸造开始前不要验证自己的合约。
问题2: 以确定性订单铸造代币(允许抢购者推断铸造稀有代币的正确时间)
你可以使用oracle进行随机化(例如,Chainlink),但即便如此,高级抢购者也可以通过“窥探”NFT来规避这一点,并在铸造的NFT不那么稀有时回退交易。
不幸的是,没有100%的方法可以解决第二个问题。
你可以选择添加白名单,但这仅在整个NFT集合可以限于白名单社区时有效。
一个合约示例,利用Meebit并仅在其为稀有Meebit时铸造。
*(自Seaport以来过时)
*
以前,你可以预先批准OpenSea合约,以便你的NFT持有人无需调用setApproval。
随着Seaport的推出,这不再是必要的。
(要查看示例实现,请查看 Crypto Coven合约)
防止重入威胁:
确保所有状态变化在调用外部合约之前完成。
使用防止重入的函数修饰符,例如 OpenZeppelin的ReentrancyGuard。
Crypto Coven 合约标题
Moonbirds NatSpec 注释
启用非ETH的提款(示例)
一种允许ERC20代币提款的函数
一种方便且节省Gas的方式来向用户解释操作失败的原因。
到目前为止,你可以使用字符串提供有关失败的更多信息(例如,revert("资金不足。")),但它们相当昂贵,尤其是在部署成本上,并且在其中使用动态信息是困难的。
新的Solidity错误类型。
对于真正且可证明的随机数,使用oracle,例如 Chainlink。
在其他所有情况下,简单的 keccak256 哈希函数与一些伪随机种子,如 block.timestamp 或 msg.sender 应该是足够的。
如果出现问题,你可能需要在未来退款给买家,或者即使没有问题,你也想为单个购买保留退款选项,你需要有一个函数来处理。尤其是在大规模情况下,你不想手动操作。
Merkle树。
验证函数可在 OpenZeppelin合约 中找到。
本视频涵盖了管理功能(第64 - 70点)、上线后活动(第71 - 73点),以及提供有用资源+学习路线图的一部分,适合刚开始接触NFT智能合约的人。
如何编写一个好的NFT智能合约 - 第4部分 | NFT PhD - YouTube
QuickNode
131K 订阅者
如何编写一个好的NFT智能合约 - 第4部分 | NFT PhD
QuickNode
搜索
信息
购物
点击以取消静音
如果播放未能尽快开始,请尝试重启你的设备。
你已退出登录
你观看的视频可能会添加到电视的观看历史中并影响电视推荐。要避免这种情况,请取消并在你的计算机上登录YouTube。
取消确认
分享
包含播放列表
检索共享信息时发生错误。请稍后再试。
稍后观看
分享
复制链接
观看
0:00
/ •直播
•
订阅我们的YouTube频道获取更多视频! 订阅
EIP-2981是该行业目前提供的最佳方案,但并不是广泛支持的。
而且,执行起来并不容易。
interface IERC2981 {
/// @notice 被调用时提供销售价格以确定应支付多少版税
/// @param _tokenId - 查询版税信息的NFT资产
/// @param _salePrice - 指定的NFT资产的销售价格 _tokenId
/// @return receiver - 应向其发送版税支付的地址
/// @return royaltyAmount - 对于 _salePrice 的版税支付金额
function royaltyInfo(
uint256 _tokenId,
uint256 _salePrice
) external view returns (
address receiver,
uint256 royaltyAmount
);
}
```### 65\. 提取资金
这个点应该很明显,但一个好的清单应该涵盖所有要点,包括明显的要点:不要忘记提款功能。如果你忘记了,你会在合同中留下资金而无法提取。
### 66\. 提取代币
包含一个对任何ERC20代币执行相同操作的功能。
你的合同可以通过多种方式获取这些代币,如果不实现这个简单的功能,损失数千美元将是不幸的。
### 67\. 使tokenURI可升级
对于一些项目(链上或链上想要的项目),有一种方法来更新tokenURI功能是很有用的,以防将来发现错误。通过将实现委托给不同的合同,做到这一点相对容易。
如果你以后想升级你的NFT外观或在链上和链下渲染之间切换,你应该使你的元数据合同可以更换。
使用这个合同的: [OKPC](https://opensea.io/collection/okpc) ( [合同](https://etherscan.io/address/0x7183209867489e1047f3a7c23ea1aed9c4e236e8#code)), [Watchfaces](https://opensea.io/collection/watchfaces-world) ( [合同](https://etherscan.io/address/0x8d3b078d9d9697a8624d4b32743b02d270334af1#code))

可升级的tokenURI功能
### 68\. 减少供应量
添加一个功能以减少代币的供应量。例如,如果你决定发行10,000个NFT但在铸造开始后希望重新考虑并减少供应到5,000或其他数字,你将能够使用供应减少功能来实现。没有它,你就只能困于最初的数字。
### 69\. 高效的暂停实现
希望最好,但也要为最坏的情况做好准备。如果在铸造阶段出了状况,能暂停一个合同可能会拯救该项目。
### 70\. 当重要事项改变时发出事件

在合同顶部设置事件,重要事项发生时发出事件。
## 上线后
### 71\. 与团队分享利润
如果你跟随准备阶段,你应该已经有了一个利润分配计划,并且已经实施了多签钱包。如果没有,现在是时候去做了。
### 72\. 制定长期所有权计划
利润不仅来自铸造阶段,还来自版税、潜在的二次销售等。拥有对项目有投入的团队可以确保长期成功。这可能已经在准备阶段完成,和上面的点一样,但如果没有,请在铸造后立即执行,当时最大炒作已经消退,现在一切都是关于持续执行。
### 73\. 在OpenSea、LooksRare等配置你的收藏
[OpenSea](https://opensea.io/)、 [LooksRare](https://looksrare.org/)、 [X2Y2](https://x2y2.io/),以及许多其他市场,涵盖许多不同的区块链。确保在潜在买家可能在的地方配置你的收藏。你想确保它有一个良好的主图片、主横幅和描述。确保所有元数据都被市场正确抓取,并且显示每个商品的所有信息。确保你的收藏和所有商品在每个平台上看起来都很好。
## 有用的资源
### 合同阅读器
[https://www.contractreader.io/](https://www.contractreader.io/)
在合同阅读器中的合同示例:[WatchfacesWorld 合同。](https://www.contractreader.io/contract/0x8d3b078d9d9697a8624d4b32743b02d270334af1)
- 分析合同时很有用
- 易于分享给他人
- 比Etherscan更好

在ContractReader加载的WatchfacesWorld合同
### 优秀的NFT智能合约示例
学习OG们(但不要抄袭他们)
- [Azuki](https://etherscan.io/address/0xed5af388653567af2f388e6224dc7c4b3241c544#code)
- [Crypto Coven](https://etherscan.io/address/0x5180db8f5c931aae63c74266b211f580155ecac8#code)
- [goblintown](https://etherscan.io/address/0xbce3781ae7ca1a5e050bd9c4c77369867ebc307e#code) (创意)
- [Scientists](https://etherscan.io/address/0xa310425046661c523d98344f7e9d66b32195365d#code) 来自KaijuKingz
[优秀智能合约](https://github.com/fiveoutofnine/cool-contracts/) \- 一个GitHub库,包含智能合约供审核和学习。
经验法则:更新的通常更好,较旧的更易于阅读和学习。
### 智能合约开发指南
在QuickNode有大量的[智能合约开发指南](https://learnblockchain.cn/tags/smart-contracts)。
通过简单的教程学习如何开发智能合约。从编写代码到部署和测试智能合约,QuickNode都能帮助你。
一些有用的指南:
- [如何创建和部署ERC-721(NFT)](https://learnblockchain.cn/article/11525)
- [如何创建和部署ERC-1155 NFT](https://learnblockchain.cn/article/11503)
- [查找以太坊主网上的特定地址的所有NFT](https://www.quicknode.com/guides/knowledge-base/look-up-all-nfts-for-a-given-address-on-ethereum-mainnet)
- [NFT项目常见安全缺陷及如何防护](https://www.quicknode.com/guides/web3-security/common-security-flaws-around-nft-projects-how-to-protect-against-them)
### 刚开始?所有学习的最佳资源
1\. 阅读[Solidity文档](https://docs.soliditylang.org/)
2\. 阅读大量代码
- 几乎所有智能合约代码都已在Etherscan上发布,学习的最佳方式是看看其他项目如何编写代码。
- 另一个好的资源是查看[GitHub上的开源Solidity项目](https://github.com/trending/solidity?since=monthly)
3\. Solidity与NFT教程

[Patrick的32小时Solidity课程](https://www.youtube.com/watch?v=gyMwXuJrbJQ) ← 必看!

[OpenSea ERC721指南](https://docs.opensea.io/docs/getting-started) \- 购买和出售OpenSea的可自定义市场的简单教程

[CryptoZombies](https://cryptozombies.io/) \- 这是互联网上第一个关于NFT的教程,并不断更新,提供最新信息。通过建立一个僵尸游戏来学习。
4\. [Solidity模式](https://github.com/fravoll/solidity-patterns)
- 一组用于Solidity的设计和编程模式。
- 每个模式都包含代码示例和详细说明,包括背景、影响和模式的附加信息。
- 适用于Solidity版本0.4.20。请注意,更新的版本可能会更改某些功能。
5\. 启动你自己的项目
- 没有什么比实践经验更重要
- 启动自己的NFT项目或与艺人一起合作创造
- 通过这样做获得经验,不断想出新主意和实验,甚至尝试重新创建一个项目。
### NFT API
当你的智能合约准备就绪并运行时,你需要一个前端来呈现你的NFT,以最佳(和最简单)的方式展示它们。
从区块链检索NFT元数据是一项繁琐且耗时的工作。[QuickNode NFT API](https://www.quicknode.com/nft-api) 为你完成这项繁重的工作,涵盖以太坊和Solana的NFT,使你所需的数据可搜索且可访问。
### 更先进了?
专注于安全性。
安全游戏:
- [Ethernaut](https://ethernaut.openzeppelin.com/) \- 这是必玩的!
- [Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)
### 不要忘记
- 享受乐趣
- 你可以做到
- 你很棒
## 总结
**如何编写一个好的NFT智能合约?**
- 从准备阶段开始(以避免后期错误)
- 首先关注安全性
- 无论你做什么 - 测试!这是为安宁支付的小代价
- 所有这些都会花钱,所以记得节省气体费用。为自己和所有购买和交易的人。
- 在部署阶段不要把自己弄得筋疲力尽
- 对用户最重要的阶段:铸造。不要让他们失望
- 考虑带有变更意识的管理员功能的未来
- 提前想好上线后会发生什么
- 不要忘记享受乐趣
干得好!你已经学会了如何编写一个好的NFT智能合约并成功地将其部署到区块链上。要了解更多,请查看我们其他的智能合约编写教程[这里](https://learnblockchain.cn/quicknode)。
## 来源
- [NFT合约清单](https://twitter.com/w1nt3r_eth/status/1541621057332736001) by [WINTΞR 💙💛](https://twitter.com/w1nt3r_eth/) (在Twitter上关注他,获取持续的智能合约干货)
- [优秀NFT合约中的常见模式](https://learnblockchain.cn/article/4339) by [SolidNoob](https://www.solidnoob.com/)
- [发送你的智能合约进行审核前的终极100+点清单](https://jeffrey-scholz.medium.com/the-ultimate-100-point-checklist-before-sending-your-smart-contract-for-audit-af9a5b5d95d0) by [Jeffrey Scholz](https://twitter.com/Jeyffre)
- [NFT气体优化终极指南](https://medium.com/@WallStFam/the-ultimate-guide-to-nft-gas-optimization-7e9289e2d88f)
- [NFT项目常见安全缺陷及如何防护](https://www.quicknode.com/guides/knowledge-base/common-security-flaws-around-nft-projects-how-to-protect-against-them)
- 大量代码(编写和阅读)
- 经验(自己的和借来的)
#### 我们 ❤️ 反馈!
[让我们知道](https://airtable.com/shrKKKP7O1Uw3ZcUB?prefill_Guide+Name=How%20to%20Write%20a%20Good%20NFT%20Smart%20Contract) 如果你有任何反馈或新的主题请求。我们期待你的声音。
>- 原文链接: [quicknode.com/guides/eth...](https://www.quicknode.com/guides/ethereum-development/nfts/how-to-write-good-nft-smart-contract)
>- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!