函数定义与访问控制

函数定义与访问控制

学习目标

掌握 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年3月8日 15:11
下一篇 2026年3月21日 01:05

相关推荐

  • 区块链核心技术

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

    2026年3月10日
    7900
  • 引用类型详解:数组、结构体、映射、字符串

    引用类型详解:数组、结构体、映射、字符串 学习目标 掌握 Solidity 中四种引用类型(数组、结构体、映射、字符串/变长字节数组)的定义和使用方法。 前置知识 已学习值类型(整型、布尔、地址、定长字节数组等)。 数组(Array) storage 中的数组 Solidity 中数组分为两种: 静态数组 T[K]:长度固定,编译时确定 动态数组 T[]:长…

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

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

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

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

    Web3与WASM 2026年3月10日
    8700
  • Solidity 入门与开发环境

    Solidity 入门与开发环境 学习目标 理解智能合约的本质与核心特性 掌握合约在以太坊上的运行原理(Transaction + EVM) 认识 Solidity 语言特点与开发工具链 编写并部署第一个智能合约 前置知识 了解区块链基本概念(区块、交易、共识) 了解以太坊账户模型(EOA 与合约账户) 基本编程经验(任意语言均可) 一、智能合约的根本性质 …

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