【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;
    }
}
相关推荐
z***I39410 小时前
区块链跨链交互技术
区块链
Tony Bai10 小时前
Go 在 Web3 的统治力:2025 年架构与生态综述
开发语言·后端·架构·golang·web3
许强0xq21 小时前
Q10: 对于地址白名单,使用 mapping 还是 array 更好?为什么?
面试·职场和发展·web3·solidity·evm·gas
搜移IT科技1 天前
XRP最新价格波动引发市场关注,XBIT以技术优势防护XRP爆仓安全
区块链
终端域名1 天前
Dill:Web3超级计算机的革新架构与生态蓝图
架构·web3·区块链·数字货币·加密货币
2501_941147421 天前
区块链与智能合约技术在供应链管理与交易透明化中的创新应用研究
区块链·智能合约
CryptoRzz2 天前
印度股票数据 PHP 对接文档 覆盖 BSE(孟买证券交易所)和 NSE(印度国家证券交易所)的实时数据
android·服务器·开发语言·区块链·php
wa的一声哭了2 天前
WeBASE管理平台部署-WeBASE-Web
linux·前端·网络·arm开发·spring boot·架构·区块链
print(未来)2 天前
智能合约驱动的去中心化金融系统在多链环境中的风险管理与优化策略
区块链
大白猴2 天前
什么是 “信任模型” 和 “安全假设”?
安全·去中心化·区块链·智能合约·意图·信任模型·安全假设