【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;
    }
}
相关推荐
小明的小名叫小明6 小时前
区块链技术原理(14)-以太坊数据结构
数据结构·区块链
二十雨辰21 小时前
[TG开发]照片机器人
java·web3
终端域名1 天前
中本聪思想与Web3的困境:从理论到现实的跨越
web3·区块链·元宇宙
大白猴2 天前
大白话解析 Solidity 中的防重放参数
区块链·智能合约·solidity·时间戳·重放攻击·nonce·防重放参数
小明的小名叫小明2 天前
区块链技术原理(12)-以太坊区块
区块链
大白猴2 天前
大白话解析“入口点合约”
区块链·智能合约·solidity·以太坊·账户抽象·入口点合约·erc4337
余_弦2 天前
区块链中的密码学 —— 零知识证明
算法·区块链·以太坊
木鱼时刻3 天前
肖臻《区块链技术与应用》第14-15讲 超越货币:以太坊如何用“智能合约”开启去中心化应用时代
去中心化·区块链·智能合约
电报号dapp1193 天前
公链开发竞争白热化:如何设计下一代高性能、可扩展的区块链基础设施?
web3·去中心化·区块链·智能合约
爱看科技3 天前
微美全息(NASDAQ:WIMI)Raft携手节点动态评估:引领联盟链高性能共识新潮流
去中心化·区块链