编译选项

Liquid 项目根目录下的Cargo.toml配置文件中有一个特殊的名为[profile.release]的 section,此 section 中用于配置合约的编译及优化选项,其内容如下所示:

[profile.release]
panic = "abort"
lto = true
opt-level = "z"
overflow-checks = true

其中:

  • panic = "abort",当发生panic时,Rust 程序的默认行为是执行堆栈解退(Stack Unwinding),此时会依次执行各个栈上对象的析构函数以释放资源。此配置项用于更改此默认行为,使得当panic发生时,合约直接终止且不执行堆栈解退,从而有助于减少字节码的体积。由于合约在虚拟机中执行,当合约执行终止时,所有的资源都将会被宿主环境直接回收,因此无需担心资源泄露的问题;
  • lto = true,此配置项用于开启链接时优化(Link Time Optimization)。开启 LTO 后链接器将会对整个项目进行分析并进行跨模块优化,有助于减少合约字节码的体积;
  • opt-level = "z",此配置项用于指定编译器的优化等级,z级别的优化将会在优化性能的同时专注于缩小字节码的体积;
  • overflow-checks = true,此配置项用于开启运行时算数溢出检查。开启后,Rust 语言编译器将会项目中每一处执行算数运算的代码后插入溢出检查代码。当运算过程中出现算数溢出时,会直接引发panic。关闭该选项能够获得更快的执行速度和更小的字节码体积,但是也会削弱合约的安全性。

可以根据自身的需求调整这些编译配置项,但是调整之前务必对可能造成的后果做到心知肚明。一般而言,默认的编译选项已经足够应付大部分场景的需求。