constant和immutable
pragma solidity ^0.8.0;
contract Example {
// constant变量在编译时就需要确定其值
uint public constant CONST_VALUE = 1;
// immutable变量的值在构造函数中设定,之后不可更改
uint public immutable immutableValue;
constructor(uint _value) {
immutableValue = _value; // 在部署合约时设置immutable变量的值
}
}
总结
- 使用
constant
适合那些在写合约代码时就已经知道且不会变化的值。 - 使用
immutable
适合那些直到部署合约时才确定的值,一旦合约部署后,这些值不应该再被修改。
二者都有助于优化合约的gas消耗,但它们适用的场景和限制有所不同。
自定义错误
// 定义自定义错误
error NotOwner();
// 使用修饰器检查调用者是否为所有者
modifier onlyOwner() {
if (msg.sender != owner) revert NotOwner();
_;
}
在这个例子中,如果
restrictedAction
函数被非所有者调用,onlyOwner
修饰器将使用revert NotOwner();
抛出NotOwner
错误。这种方式的优势在于,当合约很大或错误消息很长时,使用自定义错误而不是
require
语句可以显著节省部署和执行合约的gas成本。
receive和callback
发生Transact时会自动调用receive
调用不存在的函数时会触发fallback