web3学习系列——solidity进阶

101 阅读1分钟

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

image.png

调用不存在的函数时会触发fallback

image.png