Solidity0.8.4引入的自定义错误(customerror)是require("message")的高效替代品。它不仅在部署时节省大量字节码,还在交易失败(revert)时显著降低返回数据带来的gas开销。
Solidity 0.8.4 引入的自定义错误(custom error) 是 require("message") 的高效替代品。它不仅在部署时节省大量字节码,还在交易失败(revert)时显著降低返回数据带来的 gas 开销。
// require string 会存储字符串,很贵
require(msg.sender == owner, "Not owner")
//0x08c379a0 // Error(string) 选择器 (4 bytes)
//0000000000000000000000000000000000000000000000000000000000000020 // 字符串偏移 (32 bytes)
//0000000000000000000000000000000000000000000000000000000000000009 // 字符串长度 (32 bytes)
//4e6f74206f776e65720000000000000000000000000000000000000000000000 // "Not owner" 补齐到 32 字节
//总长度 = 4 + 32 + 32 + 32 = 100 字节(实际更可能是 4 + 32 + 32 + 32 = 100,因为字符串补零)。
// 自定义错误,不存储字符串
error NotOwner(address caller);
if (msg.sender != owner) revert NotOwner(msg.sender);
//0x9c2eb2d2 // NotOwner() 选择器 (4 bytes)
//0000000000000000000000001234567890123456789012345678901234567890 // 参数 (32 bytes)
//总长度 36 字节(无参数时为 4 字节)。对比 require 的 100 字节起步,体积缩减超过 60%,且参数越多节省越夸张。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码