Solidity学习04 默认值、常量、修饰器

变量默认值

常用值类型变量的默认值
boolean: false
string: ""
int: 0
uint: 0
enum: 枚举中的第一个元素
address: 0x0000000000000000000000000000000000000000 (或 address(0))
function:
-internal: 空白函数
-external: 空白函数
引用类型的默认值,组成成员均为其默认值
delete操作符:
使用delete操作符会将变量更新为默认值

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

// 变量初始值

contract MyContract {
    uint public age;

    function Test()
        public
        returns (uint initinalValue, uint changedValue, uint deletedValue)
    {
        // 初始化值
        initinalValue = age;
        age = 100;
        // 更新后的值
        changedValue = age;
        // 执行delete操作后的值
        delete age;
        deletedValue = age;
    }
}

部署后调用Test函数
image

常数

两个常数关键字
constant 和 immutable
constant常数只能在定义时赋值。在其他地方赋值的话,会报错。

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

contract MyContract {
    uint256 constant NUM = 0;
    function changeNum() public {
        NUM = 100;
    }
}

image

immutable 可以在声明时赋值、也可以在构造函数中赋值
若既在声明时赋值又在构造函数中赋值,则会变为构造函数中的赋值

contract ImmutableExample {

    // 声明并初始化 immutable 变量
    uint256 public immutable IMMUTABLE_NUM = 0;
    uint256 public immutable IMMUTABLE_TEST;
    // 利用构造函数初始化immutable变量,因此可以利用
    constructor() {
        IMMUTABLE_NUM = 100;
        IMMUTABLE_TEST = test();
    }

    function test() public pure returns (uint256) {
        uint256 what = 9;
        return (what);
    }
}

构造函数 constructor

与c#一样,sodility的构造函数用于在合约初始化时进行一些操作。
不同的是,sodility的构造函数的关键字是constructor。

修饰器

类似于c#的[Authorize],可以在函数执行前做一些校验

// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;

contract BaseContract {
    address public owner;
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
}

contract MyContract is BaseContract {

    constructor() {
        owner = msg.sender; // 在构造函数中初始化 owner 变量为部署人
    }

    // 使用onlyOwner修饰器,限制只有合约owner能执行该合约
    function sayHello() public view onlyOwner returns (string memory res) {
        res = "Hello";
    }
}

上面代码限制了只有owner能执行sayHello()函数。
使用owner地址,成功调用
image
使用其他地址,调用失败,revert
image

posted @ 2021-01-15 11:25  sorachannel  阅读(1026)  评论(0)    收藏  举报