当前位置: 首页 > news >正文

Solidity 入门教程(三):函数 Function 详解 —— 用对函数,写好合约

函数是 Solidity 中的核心组成部分,是合约响应外部调用、实现内部逻辑的“发动机”。掌握函数的定义方法、访问权限、函数类型(view/pure/payable)、继承关键字(virtual/override)对于写出高质量的智能合约至关重要。

一、函数基本结构

function <函数名>([参数]) [可见性] [函数类型] [virtual|override] [修饰符] [returns(返回类型)] 
{// 函数体
}

二、可见性(Visibility)

对比示例

contract VisibilityDemo {// 公开函数,用户可以调用function sayHello() public pure returns (string memory) {return "Hello, world!";}// 外部函数,合约外部可调用,内部不能用 this.sayHi()function sayHi() external pure returns (string memory) {return "Hi from external!";}// 内部函数,内部或继承可用function _internalLogic() internal pure returns (string memory) {return "Internal use only";}// 私有函数,仅本合约内使用function _secret() private pure returns (string memory) {return "Private secret";}
}

实践建议

  • 对外暴露的函数,建议使用 external,更节省 gas。

  • 仅内部复用逻辑用 internal

  • private 用于敏感数据校验、合约内部安全操作。

三、函数类型(Function Type)

1. view —— 读取状态但不修改

用于读取状态变量。不会消耗 gas(如果在 view 环境下调用)

uint public count;function getCount() public view returns (uint) {return count;
}

2. pure —— 纯函数,不读写状态

只进行纯计算逻辑,无状态依赖。适合数学运算、工具函数。

function add(uint a, uint b) public pure returns (uint) {return a + b;
}

 场景:计算利息、数学函数、转换等。

3. payable —— 可接收 ETH 转账的函数

接收者函数必须标记为 payable,否则即使用户转账也会失败。

function receiveEther() public payable {}

场景:捐赠合约、充值函数、众筹系统。

四、继承相关:virtual 与 override

Solidity 支持合约继承,允许子合约重写父合约函数。

contract Parent {function greet() public virtual pure returns (string memory) {return "Hi from Parent";}
}contract Child is Parent {function greet() public override pure returns (string memory) {return "Hi from Child";}
}

场景:常用于模板设计、治理逻辑、标准合约改写(如 ERC20、Ownable 等)

五、完整案例:多种函数类型与可见性组合演示

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;contract FunctionExample {uint private storedData;// 设置值(写操作)function set(uint x) public {storedData = x;}// 读取值(view)function get() public view returns (uint) {return storedData;}// 纯函数(不访问状态)function multiply(uint a, uint b) public pure returns (uint) {return a * b;}// 可支付函数function deposit() public payable {}// 获取合约余额function balance() public view returns (uint) {return address(this).balance;}// 内部逻辑函数function _double(uint x) internal pure returns (uint) {return x * 2;}// 外部函数function callMe() external pure returns (string memory) {return "You called me!";}// 私有辅助函数function _secret() private pure returns (string memory) {return "Shhh...";}
}

六、小结:函数使用对照表

http://www.lqws.cn/news/487873.html

相关文章:

  • npm ci对比npm install
  • 榕壹云无人售货机管理系统:开源架构赋能私有化部署,打造智能零售技术解决方案
  • Angular进阶之十二:Chrome DevTools+Angular实战诊断指南
  • mfc与vs成功在xp系统所需做的修改
  • leetcode83.删除排序链表中的重复元素
  • mongoDB服务本地化部署
  • 利用栈,实现括号匹配功能
  • OVS Faucet练习(下)
  • 百胜软件胜券AI:打造智慧零售运营新范式
  • 预训练语言模型基础知识概述
  • 使用Vue重新构建应用程序
  • PDF-XSS
  • xss利用meta强制跳转 CPS report-uri 报错泄露利用 -- GPN CTF 2025 Free Parking Network 1 2
  • 设计模式 - 抽象工厂
  • Perl 正则表达式
  • Chromium 136 编译指南 macOS篇:编译优化技巧(六)
  • 苹果芯片macOS安装版Homebrew(亲测)
  • “自动化失败归因”测试集-WhoWhen
  • RealSense 相机 | 读取IMU | 解决权限问题 | 提供示例程序
  • 【无刷电机FOC进阶基础准备】【04 clark变换、park变换、等幅值变换】
  • Python Django全功能框架开发秘籍
  • 五分钟了解@ExcelIgnoreUnannotated注解
  • Bug闭环解决之道:主流Bug追踪工具优劣对比
  • 月球上基于分段的全局定位
  • 【BFS】P9126 [USACO23FEB] Moo Route II S|普及+
  • MCU双分区方案,如何优雅地获知当前运行分区?
  • 纯血HarmonyOS5 打造小游戏实践:绘画板(附源文件)
  • 【基础篇-消息队列】——详解 RocketMQ 和 Kafka 的消息模型
  • 7.4.2B+树
  • 红帽全球副总裁曹衡康:开源AI开启企业级应用新纪元