实战:调整NFT智能合约,减少70%的铸币Gas成本

文章非常严谨讨论了各种实现的 gas 消耗,以及低效代码带来的深远影响,并给出了实现方案。

在这篇文章中,你将学习如何降低NFT的铸币成本,通过为你的用户节省真金白银来增加销售的机会。

Gas成本是NFT项目的一个重要因素。特别是在ETH价格高企。无论你能做什么来降低成本,你都应该这样做。在Shiny Object Social Club,我们已经找到了许多直接的解决方案,而很多创作者仍缺少了解。

当Shiny成员Craig Burgess分享他的项目Real Fake Turnips的超低铸币Gas成本时,我们的开发者Jonathan SnowTom Hirst想搞清楚原因。其使用的智能合约使用了我们以前见过的模式,所以我们进行了测试。

我们想与更广泛的社区分享这一点,以便你的下一个NFT项目可以受益。下面是我们发现的简单解释,以及改进你的代码的步骤。

作为参考,这里是我们用来测试交易的前后合约:

*免责声明:本文中可能有指向其他合约的链接。我们测试并部署了上述的许多变化。在不了解其使用的情况下,请不要使用合约中的任何代码。在某些情况下,我们重视部署的速度,而不是代码审查,并希望在真实网络上有这些代码供我们测试,并供社区审查。

太长不看版(TLDR)

以下是我们的主要发现:

如果你避免使用ERC721Enumerable,并用Counter代替totalSupply()来追踪代币ID,买家可以节省高达70%的铸币手续费和高达35%的转账费。

image-20220713184850555

截图自:https://twitter.com/tomosman/status/1459639356822638595

建议你阅读本文的剩下部分,以了解更多的细节,获得Gas节省技巧,并听取我们关于智能合约效率为更广泛的空间利用的理念。

什么是Gas,为什么它很重要?

当你向区块链写入数据时,你要支付交易费用。这些费用通常被称为 Gas费

执行一个功能的全部交易费用是通过使用的Gas单位的数量和乘以单位Gas单位的价格来计算的。

一个有用的比喻是将执行智能合约交易比作计划一次旅行。你可能知道目的地,以及它有多远,但旅行的费用可能更多或更少,这取决于你特定车辆的油耗(gas)。

执行智能合约是类似的,因为当协议上单位Gas price高时,总的费用就会更贵。意味着,铸造一个NFT在某些时候会比其他时候花费更多,但你仍然可以做一些相对减少成本的事情。即专注于减少交易使用的Gas,就像买一辆更节省油耗的汽车。你到达同样的目的地,但旅程的成本会减少。

为了防止被滥用,区块链上支付Gas费是必要的。如果交易是免费的,区块链就会被邪恶的交易塞满。真正的交易将很难通过。简而言之,为交易附加费用可以防止协议因过度使用而陷入停顿。

虽然我们已经确定了Gas费用的重要性,但我们需要谈谈相关NFT空间的问题。随着越来越多的人对NFT感兴趣,了解购买NFT的真实成本的人会越来越少(按比例的话)。例如,当消费者铸造一件艺术品NFT时,他们将支付创作者的作品费+区块链的交易费。这可能是出乎他们意料之外,并很失望,特别是在交易费与比作品价格差不对甚至超过时,尤为如此。

还有一个需求需要考虑。以太坊很活跃,DeFi、altcoins和DAO代币与NFT智能合约交易一起争夺区块空间。当网络流量大时,Gas成本更高,因此节点可以收取更多费用来处理交易。而且,那些想把自己的交易推到队列前面的人,会支付这些费用,这往往会把新来者和普通用户排除在外。

交易费用的计算方式和不同操作的具体Gas成本,已经随着时间的推移而改变。以太坊的大多数用户,以及一些开发者,不会注意到这些更新。但是,当你专注于智能合约的优化时,他们是很重要的,要保持跟踪。最近的EIP-1559更新对Gas费用产生了直接的影响,在这里解释一下是很有用的。

在这次升级之前,提交交易的用户会设定单位Gas的最高价格。当前 合理的Gas价格和你设置的最大价格之间的差异部分,都将作为小费给处理你的交易的矿工。在EIP-1559中,这些费用被明确地分割。用户现在可以选择自己愿意支付的单位Gas的最高价格,以及一个单独的优先费。优先费是给矿工的小费,而最高价格是用户愿意为每单位Gas支付的绝对最高价格。当你看每单位Gas是如何定价的,这就变得复杂了。

译者注:EIP1559 实施后,用户将可以设置两个参数 Max Fee Per GasMax Priority Fee Per Gas,分别表示用户愿意为单位 Gas 付出的最大价格,以及愿意支付给矿工小费价格。用户的实际交易代价将会是 min(Max Fee - Base Fee, Max Prioirity Fee) + Base Fee * Gas Usedmin() 是一个函数,表示在这两者中取小的那个值;给矿工的支付也是由这个函数决定的。用户为交易支付的最大手续费价格不会超过 Max Fee,给矿工支付的最大手续费价格不会超过 Max Priority Fee。

这里需要记住的是,存在一个基础价格(Base Fee)以 Gwei 为单位的价格,以太坊会基于网络需求的自动调整区块Gas大小。区块容量不是由它能处理的交易数量决定的,而是由交易使用的Gas决定的。如果前一个区块的填充率超过50%(译者注:填充率是使用的 Gas 与 区块可用Gas 的比值),基本Gas价格(Base fee)将增加12.5%。如果前一个区块的填充率为50%,则没有变化。如果填充率低于50%,基本 交易成本将最多减少12.5%。

为了使交易成功,你的单位Gas的最高价格应该至少是基本Gas价格(Base fee)加上承诺给矿工的优先费。如果没有,交易可能会被卡住。因为它的价格不具有竞争性。

虽然这篇文章不是关于交易Gas本身是如何运作的,但对了解低效智能合约的更广泛影响是有帮助的。如果一个智能合约使用了超过必要的Gas,这是否会人为地增加区块填充率,实际上带来基本Gas价格的增加,反过来,也使同样低效的智能合约在交易费用上花费更多。

我们是否因缺乏优化使以太坊的Gas问题长期存在?

Gas问题随着ETH价格的上涨而加剧。从而使可用性成为比以往更大的挑战。

如果你想启动一个NFT项目,这就带来了一个问题。你可以建议人们等到Gas费低的时候,但如果它永远不会下降到你的目标受众 可接受的水平呢?无论你的铸币价格是多少,Gas费将阻挡许多人。

幸运的是,在这个Gas 费用中,有一部分是在你的开发团队的控制范围内的;通过使用更少的Gas,使你的合约执行更加 节省Gas

我们接下来的测试主要是对基于ERC721的智能合约进行优化。我们想看看,如果我们使用以节省Gas为重点的方法,是否能对终端用户保持相同的结果。结果令人大开眼界。

模板代码的好与坏

许多NFT项目使用了由OpenZeppelin维护的ERC721标准合约,这是一个具有基本功能的模板智能合约库,可以在此基础上构建。大多数非同质化代币项目只继承其核心功能后进行小的补充

web3的一个口号是协作和可组合性的好处。开放源代码允许开发人员在现有的、经过测试的工作基础上进行建设。加密货币项目比以往任何时候都更加开放,所有人都可以在Etherscan上看到智能合约代码并从中学习。

这里有很多好处。团队可以更快地推出项目,开发成本更低(意味着消费者可以得到更便宜的铸造成本),而且安全性通常更好,因为开放源代码比封闭源代码在市场经过了更多的考验。

任何想启动NFT项目的人都可以看看Bored Ape Yacht Club合约,并实现类似的东西。

那么,有什么不好的呢?在一个StackOverflow向所有人提供代码的世界里,开发者很容易变得懒惰。我们都拷贝了一些代码片段并在项目中使用它们,而没有花时间去理解它们。在Solidity开发中,开发人员的资源是稀缺的,疏忽会受到真正的金钱代价的惩罚。

智能合约的不可变性(部署后不能编辑)意味着不能像传统软件环境那样修补低效率的问题。你现在写的代码必须在项目的生命周期内都是好的。

在一个基于ERC721的项目中,Gas的低效率会长期伤害你和你的用户。

发现

Shiny’s Discord 频道,Craig Burgess分享了他项目的一个新的营销角度,投资者的反馈非常积极,他们注意到铸币时的低Gas费。在一般市场上感觉Gas费用很高的环境中,尤其如此, 其帮助 Real Fake Turnips 项目取得良好的开端。

image-20220713185031837

但这并不是我们第一次看到这种情况。Shiny开发者Jonathan Snow指出,他在为Entrope项目铸币时,也看到了一个不寻常的Gas费用。

他在建造自己的产品时也遇到了平均的Gas消耗问题,作为优化的坚持者,我们决定亲手实践下。

我们能找到一个模式吗?作为开发者,我们想了解这里发生了什么。为什么其他大多数智能合约的铸币成本更高?Jonathan和Tom迅速结对,开始测试,审查结果,并编写了这篇文章。

论点

我们将Real Fake Turnips智能合约与Entrope智能合约进行了比较。然后与其他大多数项目进...

剩余50%的内容订阅专栏后可查看

点赞 3
收藏 9
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论
翻译小组
翻译小组
0x9e64...7c84
大家看到好的文章可以在 GitHub 提 Issue: https://github.com/lbc-team/Pioneer/issues 欢迎关注我的 Twitter: https://twitter.com/UpchainDAO