函数定义与访问控制

函数定义与访问控制

学习目标

掌握 Solidity 函数定义、可见性修饰符、交易属性、modifier 和构造函数。


函数定义

一般形式

function fname([参数]) [可见性][交易属性][modifier...] returns(返回值) { ... }
  • 函数签名fname([参数]) —— 唯一标识一个函数
  • 返回值returns(返回值) —— 声明函数返回的类型

函数可见性

Solidity 提供四种可见性修饰符,控制函数的调用范围:

修饰符 说明
public 完全可见,内部和外部都能调用
private 仅本合约可见,子合约也不能访问
internal 本合约和子合约可见(类似 Java 的 protected)
external 仅外部调用(通过 this 在内部调用会产生新的 message)

注意:变量默认 internal,函数默认 public。这与其他编程语言不同!

可见性示意图

A 合约
├── private   pri()    → 仅 A 内部
├── internal  inter()  → A 内部 + 子合约 B
├── public    pub()    → 全部可见    ←── C 合约可调用
└── external  ext()    → 仅外部      ←── C 合约可调用

B is A(继承 A)
├── inter()  可访问
└── pub()    可访问

交易属性

交易属性决定函数是否修改链上状态,直接影响 gas 消耗:

属性 说明
默认(无修饰) 写操作,全网广播,共识确认,消耗 gas
view 只读操作,读取合约状态,不消耗 gas(外部调用时)
pure 纯函数,与合约状态无关,只依赖输入参数

完整示例

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.2 <0.9.0;

contract NumberStorage {
    uint public x;

    // 写操作(默认):修改状态,消耗 gas
    function setX(uint px) public {
        x = px;
    }

    // view:只读状态
    function getX() public view returns(uint) {
        return x;
    }

    // pure:与状态无关的纯计算
    function add(uint a, uint b) private pure returns(uint) {
        return a + b;
    }
}

函数修饰器(Modifier)

Modifier 类似 AOP(面向切面编程),常用于访问控制和前置条件检查。

  • require / revert 进行条件检查,不满足时回滚交易
  • _; 表示执行被修饰的函数体
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract NumberModifier {
    uint private number;

    modifier nonZero() {
        require(number != 0, "Number is zero and cannot be processed.");
        _;
    }

    function doubleNumber() public nonZero {
        number *= 2;
    }

    function resetNumber() public {
        number = 0;
    }
}

构造函数(Constructor)

构造函数在合约部署时调用一次,常用于初始化状态变量。msg.sender 是合约部署者的地址。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Constructor {
    address public owner;
    uint public x;

    constructor(uint _x) {
        owner = msg.sender;
        x = _x;
    }
}

综合实例:Ownable 合约

结合构造函数、modifier 和可见性控制,实现一个「仅拥有者可操作」的权限管理合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "not owner");
        _;
    }

    function setOwner(address _newOwner) external onlyOwner {
        require(_newOwner != address(0), "invalid address");
        owner = _newOwner;
    }
}

Counter 合约示例

一个简单的计数器合约,展示 external 可见性的使用:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Counter {
    uint public count;

    function inc() external {
        count += 1;
    }

    function dec() external {
        count -= 1;
    }
}

主题测试文章,只做测试使用。发布者:Walker,转转请注明出处:https://walker-learn.xyz/archives/7491

(0)
Walker的头像Walker
上一篇 2026年5月12日 13:11
下一篇 2026年5月11日 20:19

相关推荐

  • 动态调用与Fallback机制

    动态调用与Fallback机制 学习目标 掌握 call 动态调用的语法与使用场景 理解 calldata 数据结构(selector + 参数编码) 掌握 fallback / receive 函数的触发机制 理解 tx、msg、block 三种上下文变量的区别 call 动态调用 基本语法 (bool success, bytes memory data…

    2026年3月10日
    11800
  • 继承多态与库合约

    继承多态与库合约 学习目标 掌握 Solidity 继承机制与多态 理解 C3 线性化算法 掌握库合约(library)的定义和使用 继承基础 继承定义 使用 is 关键字 继承的实现方式是代码拷贝:部署后变成一个合约 可见性与继承 private:子合约不可见,但不能定义同名成员 internal:子合约可见 public:完全可见 event 和 mod…

    Web3与WASM 2026年3月10日
    10000
  • Web3 概述与愿景

    Web3 概述与愿景 学习目标 理解 Web1、Web2、Web3 的演进历程与核心区别 掌握 Web3 的核心理念:去中心化、数据确权、用户主权 了解 Web3 带来的创新机会与全新商业模式 熟悉 Web3 开发者的学习路线图 前置知识 基本的互联网使用经验 对软件开发有初步了解(非必须,但有助于理解技术部分) 一、Web1 → Web2 → Web3 的…

    Web3与WASM 2026年3月10日
    11900
  • Solidity 值类型详解

    Solidity 值类型详解 学习目标 掌握 Solidity 的整型、布尔、地址、定长字节数组、枚举等值类型 理解 EVM 256 位机器架构对类型设计的影响 掌握类型转换规则(隐式 vs 显式) 了解溢出问题的历史与解决方案 理解 Solidity 中所有类型的默认值机制 一、整型(int / uint) 1.1 基本概念 Solidity 提供有符号整…

    Web3与WASM 2026年3月10日
    15700
  • 合约交互与 ABI

    合约交互与 ABI 学习目标 掌握合约间调用方式、接口定义、ABI 数据结构、Web3.js 访问合约的方法。 合约间调用基础 EOA(外部账号)发起调用,可能触发合约间的调用链 调用者必须持有被调用合约的地址 方式一:同文件内直接调用 当两个合约在同一个文件中时,可以直接通过合约类型和地址进行调用: // SPDX-License-Identifier: …

    2026年3月10日
    12300
简体中文 繁体中文 English