Solidity中常见的修饰符以及它们的可见性和用法

目录


前言

在Solidity中,修饰符是用于修改函数或状态变量的行为的关键元素之一。它们允许您在不改变函数或状态变量本身的情况下,添加额外的逻辑或约束条件。下面是Solidity中常见的修饰符以及它们的可见性和用法:


一、solidity修饰符包括什么?

solidity的修饰符包括:Public(公共)、External(外部)、Internal(内部)、Private(私有)、ViewPure。

二、具体用法

1.Public(公共)

  • 可见性:任何人都可以调用。
  • 用法:通常用于声明在合约外部可调用的函数。

代码如下(示例):

function publicFunction() public {
    // 函数逻辑
}

2.External(外部)

  • 可见性:只能从合约外部调用。
  • 用法:通常用于节省gas,因为外部函数不会将调用者上下文的状态存储到堆栈中。

代码如下(示例):

function externalFunction() external {
    // 函数逻辑
}

3.Internal(内部)

  • 可见性:只能在当前合约内部或继承合约中调用。
  • 用法:通常用于在合约内部实现重要的逻辑。

代码如下(示例):

function internalFunction() internal {
    // 函数逻辑
}

4.Private(私有)

  • 可见性:只能在当前合约内部调用。
  • 用法:通常用于封装只能在合约内部使用的辅助函数。

function privateFunction() private {
    // 函数逻辑
}

5.ViewPure

  • 可见性:可以与任何可见性修饰符一起使用,用于声明函数不修改合约状态。
  • 用法:通常用于读取状态或执行计算而不修改状态。

function viewFunction() public view {
    // 读取状态但不修改
}

function pureFunction() public pure {
    // 不读取或修改状态
}

6.综合应用

这些修饰符可以组合使用,例如,一个函数可以同时具有publicview修饰符,表示它是一个公共的只读函数。

以下是一个示例合约,演示了这些修饰符的用法:

pragma solidity ^0.8.0;

contract Example {
    uint256 public publicData;
    uint256 internal internalData;
    uint256 private privateData;

    constructor() {
        publicData = 100;
        internalData = 200;
        privateData = 300;
    }

    function externalFunction(uint256 _value) external {
        // 可以调用
        publicData = _value;
    }

    function internalFunction(uint256 _value) internal {
        // 可以调用
        internalData = _value;
    }

    function privateFunction(uint256 _value) private {
        // 可以调用
        privateData = _value;
    }

    function getData() public view returns (uint256, uint256, uint256) {
        // 可以读取,不修改状态
        return (publicData, internalData, privateData);
    }
}

在这个示例中,externalFunctioninternalFunctionprivateFunction分别展示了不同可见性修饰符的用法。getData函数展示了如何结合view修饰符使用,以表明函数只读取状态而不修改它。


总结

1、private:能被继承、不能在外部调用、能在内部调用。

2、internal:能被继承、不能在外部调用、能在内部调用。

3、external:不能被继承、能在外部调用、不能在内部调用,可以通过“this”关键字强行调用

4、public:能被继承、能在外部调用、能在内部调用,它的权限最大。

5、pure:能读取全局变量、不能修改全局变量、不会消耗Gas。

7、view:能读取全局变量、不能修改全局变量、不会消耗Gas。