函数定义与访问控制

函数定义与访问控制

学习目标

掌握 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://www.walker-learn.xyz/archives/7491

(0)
Walker的头像Walker
上一篇 2026年3月10日 06:00
下一篇 2026年3月10日 04:00

相关推荐

  • 继承多态与库合约

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

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

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

    Web3与WASM 2026年3月10日
    9500
  • Gas机制与转账设计

    Gas机制与转账设计 学习目标 理解区块链的经济模型与激励机制 掌握 Gas、Gas Price、Gas Fee 的概念与关系 理解 Ether 单位与转换 掌握合约转账设计(receive / fallback / payable) 区块链的经济系统 为什么需要经济模型? 计算与存储资源是稀缺的:每个节点都要执行和存储所有交易 共识和 trustless …

    2026年3月10日
    6800
  • 存储位置与拷贝机制:storage、memory、calldata

    存储位置与拷贝机制:storage、memory、calldata 学习目标 理解 EVM 中三种数据存储位置的特点,以及引用类型在不同存储位置之间赋值时的拷贝规则。 前置知识 已学习值类型和引用类型(数组、结构体、映射、字符串)。 三种存储位置 storage —— 持久化存储 类似数据库,数据永久保存在区块链上 成员变量(状态变量)默认存储在 stora…

    Web3与WASM 2026年3月10日
    10300
  • 区块链核心技术

    区块链核心技术 学习目标 理解区块链底层核心技术:哈希函数、默克尔树、数字签名、加密技术 掌握主流共识机制的原理与分类 了解区块的运行原理与整体架构 认识联盟链的特点与应用场景 前置知识 基本的计算机科学概念(数据结构、算法) 对密码学有初步认知(非必须) 已阅读 01-Web3 概述与愿景 一、哈希函数 1.1 什么是哈希函数 哈希函数(Hash Func…

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