编译参数
本章讲解 Solidity
编译器参数 optimizer
和 optimizer_runs
的用途。
在 Solidity
编译器中,我们经常会看到两个编译参数 optimizer
和 optimizer_runs
。
这两个选项用于调整 Solidity
编译器的优化行为,以改善生成的字节码的性能和效率,从而在一定程度上降低智能合约的部署和执行成本。
optimizer
optimizer
决定是否启用编译器的优化功能。
当设置为 true 时,编译器会尝试优化生成的字节码,以减少编译后的合约大小,以及执行合约所需的 gas 成本。
在以太坊上执行操作一个交易,比如合约部署或者函数调用,都需要消耗 gas,而 gas 的成本与交易的复杂性和字节码的长度有关。通过优化字节码,可以减少这些操作的成本。
optimizer
= true,表示要启用编译器的优化功能,反之则关闭优化功能。
optimizer
的默认值为 false,也就是不启用优化功能。
optimizer_runs
optimizer_runs
用来指定优化器应该假设的交易次数。这个参数告诉编译器优化器,合约预计将被执行多少次,以便在多次执行中减少总成本。
这个参数只有在 optimizer
为 true 的时候,才会起作用,通常会设置为 optimizer_runs
= 20000。
这个编译参数的值可以帮助编译器决定优化的程度。
较高的值意味着优化器将更多地关注减少运行时 gas 成本,而可能会增加合约部署的成本;较低的值则可能会使得部署成本较低,但增加运行时的 gas 消耗。
20000 是一个常用的平衡值,旨在优化频繁执行的合约的总成本。
solc 示例
当使用 Solidity
编译器 solc
编译智能合约时,可以通过命令行参数或配置文件来指定优化选项,包括启用优化器和设置优化运行次数。
在命令行中运行 solc
时,可以使用 --optimize
来启用优化器,以及使用 --optimize-runs
来指定优化运行的次数。例如:
solc --optimize --optimize-runs=20000 YourContract.sol
我们无论使用 solc、remix、hardhat 或者 foundry 编译合约的时候,都可以启用合约优化功能。
我们常常会看到这样的设置:
optimizer = true optimizer_runs = 20_000
这两个设置是在编译 Solidity
智能合约时用来优化生成的字节码,以便减少部署和执行合约所需的 gas 成本。
选择合适的优化级别可以帮助智能合约开发者在部署成本和执行效率之间找到平衡点,特别是对于那些将被频繁调用的合约来说尤其重要。