函数定义与访问控制

函数定义与访问控制

学习目标

掌握 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
上一篇 5天前
下一篇 2025年2月26日 17:17

相关推荐

  • 区块链核心技术

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

    1天前
    500
  • 合约交互与 ABI

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

    1天前
    400
  • 继承多态与库合约

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

    Web3与WASM 20小时前
    400
  • Solidity 入门与开发环境

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

    1天前
    1200
  • Web3 概述与愿景

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

    Web3与WASM 19小时前
    600
简体中文 繁体中文 English