从零开始的Web3学习 10| Solidity 视图和纯函数 (View and Pure Functions)

作者:庭前云落日期:2026/3/3

在 Solidity 中,viewpure 是用于修饰函数的关键字,它们描述了函数对区块链状态的读写行为。正确使用这两个修饰符可以提高代码的可读性,并帮助编译器进行静态检查。

1. view 函数

  • 承诺:不修改状态,但可以读取状态变量。
  • 允许的操作
    • 读取状态变量(如 uint public data)。
    • 调用其他 viewpure 函数。
    • 访问 address(this).balanceblock.number 等区块链数据(这些不属于“状态修改”)。
  • 禁止的操作:任何会改变状态的行为,例如:
    • 修改状态变量。
    • 触发事件。
    • 创建其他合约。
    • 使用 selfdestruct
    • 调用可能修改状态的函数(非 view/pure 函数)。
    • 发送以太币等。
  • 用途:通常用于查询合约数据的函数。

示例:

1contract Example {
2    uint public data = 42;
3
4    function getData() public view returns (uint) {
5        return data;  // 读取状态变量
6    }
7
8    function multiply(uint a) public view returns (uint) {
9        return a * data;  // 可以读取状态变量
10    }
11}
12

2. pure 函数

  • 承诺:既不读取也不修改状态,函数的输出完全由输入参数决定(纯计算)。
  • 允许的操作
    • 使用函数参数或局部变量。
    • 调用其他 pure 函数。
    • 读取编译时常量(constant)或不可变变量(immutable)——因为这些值在编译或部署时已确定,不视为“状态”。
    • 进行数学运算、字符串拼接等纯计算。
  • 禁止的操作
    • 读取状态变量。
    • 访问 address(this).balanceblock.timestamp 等与区块链相关的特殊变量。
    • 任何 view 禁止的操作(修改状态)。
  • 用途:工具函数、数学计算、不依赖合约状态的辅助逻辑。

示例:

1contract Example {
2    uint public data = 42;
3    uint public constant FIXED = 100;
4
5    function add(uint a, uint b) public pure returns (uint) {
6        return a + b;  // 仅使用输入参数
7    }
8
9    function multiplyWithFixed(uint a) public pure returns (uint) {
10        return a * FIXED;  // 可以读取常量 constant
11    }
12}
13
特性viewpure
读取状态变量✅ 允许❌ 不允许(除 constant/immutable)
修改状态❌ 不允许❌ 不允许
读取区块链数据✅ 允许(如 block.timestamp)❌ 不允许
调用限制可调用 view/pure 函数只能调用 pure 函数
典型用途查询合约数据纯计算逻辑

Gas 消耗

  • 外部调用(通过 eth_call 模拟执行):viewpure 函数不消耗 Gas,因为它们不产生交易,只查询数据。
  • 内部调用(作为交易的一部分):如果在一个交易中调用 view/pure 函数(例如被非

总结viewpure 是 Solidity 中重要的函数修饰符,用于明确函数对状态的访问意图。view 表示只读状态,pure 表示既不读也不写状态,后者更为严格。在开发智能合约时,根据函数实际行为正确使用它们,可以避免意外状态修改,并优化外部查询的效率。

编程作业

  • 任务:创建一个Solidity智能合约,包含以下功能:
    。一个pure函数,计算两个输入整数的乘积。
    。一个view函数,返回智能合约中存储的一个状态变量的值。
1// SPDX-License-Identifier: MIT
2pragma solidity 0.8.7;
3
4contract MathContract{
5    uint public sotredValue;
6
7    constructor(uint initialValue){
8        sotredValue = initialValue;
9    }
10
11    // Pure function to calculate product of two numbers
12    function multiply(int a,int b) public pure returns (int){
13        return a*b;
14    }
15}
16

从零开始的Web3学习 10| Solidity 视图和纯函数 (View and Pure Functions)》 是转载文章,点击查看原文


相关推荐


再论自然数全加和 - 质数螺旋
铸人2026/2/23

下面考虑质数螺旋 曾经以1开始绘制螺旋图,但是计算质数坐标的时候就出现困难。所以我们用0开始,并把它放在螺旋的中心。 观察如下图像, 最中心的数字0,不算大小。圈数为 ,对应的数的个数,也就是面积为, 这些圈的最小值是0,最大值是, 相邻两项的差为, 这是一个二阶等差数列,对应的数值的和为, 这些数值,并不关心旋转的起点。仔细观察我们发现这些质数构成的线都几乎都是对角线,相当于旋转了45°的结果,既然如此,我们把起点旋转45°,看看能不能把斜线变成横竖的直线。


字节发力,豆包大模型2.0 震撼来袭(附 Trae 实测)
苍何2026/2/15

这是苍何的第 496 篇原创! 大家好,我是苍何。 其实在早些时候,我就深度参与了豆包大模型2.0 的内测。 今天,终于,豆包大模型 2.0 正式发布了。 说实话,这次的升级幅度,属实把我整不会了。 先说结论:「豆包 2.0 Pro 全面对标 GPT 5.2 和 Gemini 3 Pro」。 「人类最后的考试」HLE-Text 拿下 54.2 分最高分,ICPC 编程竞赛金牌,IMO 数学奥赛也是金牌。 好家伙,字节这是要掀桌子啊。 豆包 2.0,到底升级了啥 这次发布的是一整个系列,包含 P


2026 AI Agent 风口必看|四大技术变革+多Agent实战
User_芊芊君子2026/2/6

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录: 一、先破后立:2026年AI Agent的核心变革(新颖切入点)1.1 变革1:架构升级——从“四段式”到“PDA+记忆+反思”闭环1.2 变革2:协同升级——A2A协议主导,多Agent协作常态化1.3 变革3:工具升级——MCP协议统一,工具调用标准化1.4 变革4:能力升级——Skills模块化,Agent能力可复用 二、实战落地:2026年多Agent协作项目(


Settings,变量保存
cfqq19892026/1/28

作用: 变量在exe文件内。比txt操作方便。 步骤: 就这么简单: Settings.Default.Save();  // 放到窗口关闭事件中。 private void Form1_Load(object sender, EventArgs e) { fa = new FA(); //【4】订阅委托广播 fa.wt_get += wt_get; //


ooder-agent v0.6.2 升级实测:SDK 封装 + Skill 化 VFS,AI 一键生成分布式存储应用
OneCodeCN2026/1/19

作为一名深耕分布式Agent框架的开发者,我踩过最多的坑,就是分布式存储的配置复杂、断网数据丢失、自定义应用开发成本高这三大难题。 直到上手 ooder-agent v0.6.2 版本,我才发现原来分布式存储应用可以这么简单——这次升级直接把两个核心痛点连根拔起:agent-sdk 深度封装降低开发门槛,skill-vfs 变身完整Skill程序适配复杂网络场景,更关键的是,AI一句话就能生成存储应用,零代码自动部署。 今天就从技术角度,聊聊这次升级的两大核心亮点和实际使用价值。 一、核心升级1


JNI是什么?
自由生长20242026/1/11

JNI是什么? JNI(Java Native Interface,Java本地接口)是Java平台自1.1版本起提供的标准编程接口,它是一套强大的编程框架,允许运行在Java虚拟机(JVM)中的Java代码与用C、C++等其他编程语言编写的本地代码进行交互。 核心特点 功能扩展:允许Java程序调用本地代码,实现标准Java类库无法支持的功能 性能优化:对于性能敏感的计算密集型任务(如图像处理、音视频编解码、复杂数学运算),本地代码通常比Java实现更高效 代码复用:可以重用已有的C/C++


fmtlib/fmt仓库熟悉
LumiTiger2026/1/2

一、仓库(fmtlib/fmt)依赖/用到的开源库 fmt 核心设计为无外部运行时依赖(self-contained),仅在特定功能/实现中引用少量开源算法/工具(非链接依赖): Dragonbox: 内嵌该开源算法(https://github.com/jk-jeon/dragonbox),用于实现 IEEE 754 浮点数的高性能格式化(保证正确舍入、短长度、往返一致性),是 fmt 浮点格式化的核心实现基础。构建/测试类工具(非业务依赖): CMake:跨平台构建系统;oss-f


面向课堂与自习场景的智能坐姿识别系统——从行为感知到可视化部署的完整工程【YOLOv8】
我是杰尼2025/12/24

面向课堂与自习场景的智能坐姿识别系统——从行为感知到可视化部署的完整工程【YOLOv8】 一、研究背景:为什么要做“坐姿识别”? 在信息化学习与办公环境中,久坐与不良坐姿已成为青少年与上班族普遍面临的健康问题。长期驼背、前倾、低头等坐姿行为,容易引发: 脊柱侧弯、颈椎病 注意力下降、学习效率降低 视觉疲劳与肌肉劳损 传统的坐姿管理主要依赖人工监督或简单硬件传感器,不仅成本高、实时性差,而且难以规模化推广。 随着计算机视觉与深度学习技术的发展,基于摄像头的坐姿自动识别系统逐渐成为一种可行且低成


【项目踩坑实录】并发环境下,Glide缓存引起的图片加载异常
Lei_official2025/12/16

在现实主义者身上,并不是奇迹产生信仰,而是信仰产生奇迹。——《卡拉马佐夫兄弟》 背景简述 在维护智能手表主题管理功能时,我遇到过一个十分有趣的bug,从测试首次发现问题时感到十分困惑且不解,到自己我不断尝试并成功复现,直至最终找到根本原因与解决方案,历经一周左右时间。虽然是存在已久的历史问题,但仍有记录和总结的意义,同时也警醒自己在设计并发模块时,一定要心存敬意、考虑周全。 问题现象 问题的表现如上,用户编辑相册表盘后,返回到表盘列表页,预期是可以展示出新设置的相册表盘的预览图,但实际效果


C++ 波澜壮阔 40 年:从 C with Classes 到现代 C++ 的进化史诗
雾忱星2025/12/7

🔥@晨非辰Tong: 个人主页 👀专栏:《数据结构与算法入门指南》、《C++学习之旅》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。” 文章目录 引言一、波澜壮阔的C++“发家”历史1. 1 C with Classes (1979-1983)-起源1.2 早期发展:C++的"++"从何来(1983-1989)1.3 标准化与成熟(1990-1998)1.4 现代化浪潮(2011-至今) 二、推荐C++学习参考网站、好用书籍

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客