这篇文章详细介绍了以太坊智能合约的创建成本,包括影响成本的多个因素以及每个步骤的燃气费用计算。作者提供了示例代码和详细的计算过程,使读者能够清楚理解不同组成部分对整体成本的影响。最后,文章还解释了如何将燃气费用转换为美元,实用性很强。
智能合约创建成本从 \$10 到 \$2,000不等,假设以太坊的价格在 \$1,500 到 \$2,000之间。最大的因素有 1) 以太坊价格,2) 编译后合约的大小(以字节为单位),3) 当前以太坊网络上的气体价格。
有六个组成部分决定了部署合约所需的气体量。气体的美元成本取决于市场和网络的情况。我们将在本文中计算所有这些数字。
让我们以在 Remix 中部署一个最小的 Solidity 合约 为例。
pragma solidity 0.8.7;
contract Minimal {
constructor() payable {
}
}
智能合约创建Gas成本
请注意,Remix 显示的部署成本为 66,862。我们将在本文中逐步分析这笔费用。
我们将构造函数设置为可支付,并将优化器设置为 200 次运行。这会使智能合约变得更小。
让我们来汇总一下
21,000 gas | 部署
32,000 gas | 创建
总计: 53,000
我们仍然有 13,862 气体需要计算。
交易字节码为
0x6080604052603f8060116000396000f3fe6080604052600080fdfea2646970667358221220c5cad0aa1e64e2ca6a6cdf28a25255a8ebbf3cdd5ea0b8e4129a3c83c4fbb72a64736f6c63430008070033
每个十六进制字符都是一个字节,因此让我们添加空格以便于阅读。
要这样拆分,可以使用以下 python 代码。
import itertools
## 注意我们手动移除了开头的 "0x"
s = "6080604052603f8060116000396000f3fe6080604052600080fdfea2646970667358221220c5cad0aa1e64e2ca6a6cdf28a25255a8ebbf3cdd5ea0b8e4129a3c83c4fbb72a64736f6c63430008070033"
s = " ".join(["".join(group) for group in itertools.zip_longest(s[::2], s[1::2])])
print(s)
我们得到
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33
每个非零字节费用 16 气体,而每个零字节 (00) 费用 4 气体。为了计算它们,我们可以使用这个 python 一行代码:
s = "60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33"
## 非零字节
print(len(list(filter(lambda x: x != '00', s.split(' ')))))
## 零字节
print(len(list(filter(lambda x: x == '00', s.split(' ')))))
我们有 75 个非零字节和 5 个零字节。计算结果为 $75 \times 16 + 5 \times 4 = 1220$ 气体
21,000 gas | 部署
32,000 gas | 创建
1,220 gas | 字节码成本
总计: 54,220 gas。
我们还有 12,642 气体需要添加到总成本 66,862。
让我们再看看字节码
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33
加粗部分是部署代码。第一部分是初始化代码。我们需要将每个部署代码乘以 200 气体,以获得成本。这比上面的字节码成本高,因为它存储在以太坊状态中。
我们再用 python 计算一下。
deployment_code = '60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33'
print(len(deployment_code.split(' ')))
## 63
$63 \times 200 = 12,600$ 气体
所以到目前为止的细节如下:
21,000 gas | 部署
32,000 gas | 创建
1,220 gas | 字节码成本
12,600 gas | 已部署字节码
总计: 66,820
快到了!我们缺少 42 气体以达到 66,862 的目标。
我们还需要考虑初始化字节码的实际执行。
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe
我们可以使用 evm playground tool 将其转换为更方便的格式。
PUSH1 0x80 | 3 气
PUSH1 0x40 | 3 气
MSTORE | 12 气
PUSH1 0x3f | 3 气
DUP1 | 3 气
PUSH1 0x11 | 3 气
PUSH1 0x00 | 3 气
CODECOPY | 9 气
PUSH1 0x00 | 3 气
RETURN | 0 气
INVALID | 未执行
总数为 42,如预期的那样。这些Gas成本是通过运行 remix 调试器获得的。
智能合约部署气体调试
现在已完成,我们已计算完每个智能合约部署组成部分。
所以这是最终细分:
21,000 gas | 部署
32,000 gas | 创建
1,220 gas | 字节码成本
12,600 gas | 已部署字节码
42 gas | 部署执行成本
总计: 66,862 gas
请注意,如果我们在构造函数中设置存储变量,费用会更高。我们必须为每个设置的变量支付 22,100 气体。但为了使这次讲解可操作,我们省略了这种情况。
请查看我们关于 solidity 气体优化 的文章,以了解如何降低部署成本。这里获得的所有Gas成本数字都来自 Ethereum Yellow Paper。
将“气体”单位转换为美元的公式为
$\text{gas} \times \text{gas per gwei} \times \text{price of ether} \div 1 \text{ billion}$。
每个 gwei 的气体费用可以从像 ethgasstation 或 etherscan 的网站上获得。在我们的例子中,假设以太坊的价格为 \$1,000,气体价格为 20 gwei,成本将为
$66,862 \times 20 \times 1000 \div 1 \text{ billion} = $1.34$
最初发布于 2022年12月31日
- 原文链接: rareskills.io/post/smart...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!