【Solidity】修饰符

访问修饰符

  • private:可修饰函数和状态变量;表示仅能在合约内部访问

  • internal:可修饰函数和状态变量;表示仅能在合约内部或者继承合约内部访问

  • public:可修饰函数和状态变量;表示任何地方都能访问

  • external:仅可用于修饰函数;表示仅能在合约外部访问

solidity 复制代码
contract Demo {
    uint private privateVar = 1;
    uint internalVar = 2; // default internal
    uint public publicVar = 3;

    function privateFunc() private view returns (uint) {
        return privateVar;
    }

    function internalFunc() internal view returns (uint) {
        return internalVar;
    }

    function publicFunc() public view returns (uint) {
        return publicVar;
    }

    function externalFunc() external pure returns (uint) {
        return 4;
    }

    function testFuncInDemo() public view {
        privateVar + internalVar + publicVar;

        privateFunc();
        internalFunc();
        publicFunc();
        // externalFunc();
    }
}

contract Child is Demo {
    function testFuncInChild() public view {
        publicVar + internalVar + publicVar;

        // privateFunc();
        internalFunc();
        publicFunc();
        // externalFunc();
    }
}

contract External {
    Demo demo = new Demo();

    function testFunc() public view {
        demo.publicVar;

        // demo.privateFunc();
        // demo.internalFunc();
        demo.publicFunc();
        demo.externalFunc();
    }
}

在 Solidity 中,public 修饰的状态变量会自动生成 getter 函数,一般情况下 可以直接访问变量,但也有需要调用 getter 的情况:

solidity 复制代码
contract Demo {
    uint public publicVar = 1;
}

contract DemoExternal {
    Demo demo = new Demo();

    function testFunc() public view returns (uint) {
        demo.publicVar; // 直接访问
        return demo.publicVar(); // 通过 getter 访问
    }
}

函数修饰符

  • pure 函数既不能读取也不能修改合约的状态变量。
  • view 函数可以读取合约的状态变量,但不能修改它们。
solidity 复制代码
contract Demo {
    uint public x = 10;

    function pureFunc(uint a, uint b) public pure returns (uint) {
        return a * b;
    }

    function viewFunc() public view returns (uint) {
        return x;
    }
}

会修改状态变量的函数不需要函数修饰符:

solidity 复制代码
contract Demo {
    uint public count;

    function increment() external {
        count++;
    }
}

变量修饰符

  • 可用 constant 关键字声明在编译时确定值的常量
  • 可用 immutable 关键字声明在部署时确定值的变量。
solidity 复制代码
contract Demo {
    uint public constant NUM = 100;
    address public immutable OWNER;

    constructor() {
        OWNER = msg.sender;
    }
}

数据修饰符

在函数中,可用 storage、memory、calldata 修饰引用类型数据。

  • storage:可用于本地变量;会告诉编辑器,此处操作的是数据引用
  • memory:可用于本地变量、参数、返回值;会告诉编辑器,此处操作的是数据副本
  • calldata:可用于参数;会告诉编辑器,数据只读
solidity 复制代码
contract Demo {
    struct Person {
        string name;
        uint256 age;
    }
    Person[] public persons;

    // calldata: 可用于参数; 会告诉编辑器, 数据只读
    function addPerson(string calldata _name, uint256 _age) public {
        persons.push(Person(_name, _age));
    }

    function getPerson(
        uint256 _index
    ) public view returns (string memory, uint256) {
        // memory: 可用于本地变量、参数、返回值; 会告诉编辑器, 此处操作的是数据副本
        return (persons[_index].name, persons[_index].age);
    }

    function updatePerson(
        uint256 _index,
        string calldata _name,
        uint256 _age
    ) public {
        // storage: 可用于本地变量; 会告诉编辑器, 此处操作的是数据引用
        Person storage person = persons[_index];
        person.name = _name;
        person.age = _age;
    }
}
相关推荐
ZDGJ609916 小时前
外盘期货与内盘期货交易时间核心区别
区块链
cd_9492172117 小时前
数据使用控制的工程实现:数字合约、策略引擎与沙箱环境
区块链
Bczheng121 小时前
三十六.区块链网络(7)--修复net与测试例子
区块链
LedgerNinja21 小时前
WEEX API 稳定性实战:限频、重试与风控的工程化清单
运维·区块链
IvorySQL1 天前
PG 日报|修复高 IO 并发场景,解决预读机制耗尽本地缓冲区缺陷
数据库·人工智能·sql·postgresql·区块链
明月_清风2 天前
🛠️ Web3 DApp 开发全栈工具指南:从智能合约到前端交互,一文掌握
web3
明月_清风2 天前
🚀 Web3 新手全面入门指南:24 个核心概念一次讲透
web3
北冥you鱼3 天前
OpenZeppelin Contracts 完全指南:从入门到精通,构建安全的智能合约
安全·区块链·智能合约
财迅通Ai4 天前
科源制药领投企业航脑科技布局梳理:北大实验室、EXROBOT与工作犬脑电课题
人工智能·科技·区块链·科源制药
ZDGJ60994 天前
外盘与国内期货交易品种核心区
区块链