区块链100讲:Solidity语法constant/view/pure关键字定义

Solidity 教程 Solidity pragma solidity ^0.4.0; contract demo { string name = "chj"; function getName() view public returns(string) { return name; } function setName(string _name) public { name = _name; } // 相当于仅是一个普通函数,不会改变值,单 阅读详情

image

通过本文学习,熟悉了解以太坊智能合约语言Solidity语法中constant,view,pure的区别。

1

区别总结

在Solidity中constant,view,pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证。

在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。

  • view的作用和constant一模一样,可以读取状态变量但是不能改;

  • pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。

大家可以运行以下测试代码来加深这3个关键字的理解。

contract constantViewPure{

    string name;

    uint public age;

        function constantViewPure() public{

        name = "liushiming";

        age = 29;

    }

        function getAgeByConstant() public constant returns(uint){

        age += 1;  //声明为constant,在函数体中又试图去改变状态变量的值,编译会报warning, 但是可以通过

        return age;  // return 30, 但是!状态变量age的值不会改变,仍然为29!

    }

         function getAgeByView() public view returns(uint){

        age += 1; //view和constant效果一致,编译会报warning,但是可以通过

        return age; // return 30,但是!状态变量age的值不会改变,仍然为29!

    }

        function getAgeByPure() public pure returns(uint){ 

       return age; //编译报错!pure比constant和view都要严格,pure完全禁止读写状态变量!

        return 1;

    }

}

2

详细描述

2.1 Constant 状态变量

状态变量可以被声明为 constant。在这种情况下,只能使用那些在编译时有确定值的表达式来给它们赋值。 任何通过访问 storage,区块链数据(例如 now, this.balance 或者 block.number)或执行数据( msg.gas ) 或对外部合约的调用来给它们赋值都是不允许的。 在内存分配上有边界效应(side-effect)的表达式是允许的,但对其他内存对象产生边界效应的表达式则不行。 内建(built-in)函数 keccak256,sha256,ripemd160,ecrecover,addmod 和 mulmod 是允许的(即使他们确实会调用外部合约)。

允许带有边界效应的内存分配器的原因是这将允许构建复杂的对象,比如查找表(lookup-table)。 此功能尚未完全可用。

编译器不会为这些变量预留存储,它们的每次出现都会被替换为相应的常量表达式(这将可能被优化器计算为实际的某个值)。

不是所有类型的状态变量都支持用 constant 来修饰,当前支持的仅有值类型和字符串。

pragma solidity ^0.4.0;

contract C {

    uint constant x = 32**22 + 8;

    string constant text = "abc";

    bytes32 constant myHash = keccak256("abc");

}

2.2 View 函数

可以将函数声明为 view 类型,这种情况下要保证不修改状态。

下面的语句被认为是修改状态:

pragma solidity ^0.4.16;

contract C {

    function f(uint a, uint b) public view returns (uint) {

        return a * (b + 42) + now;

    }

}

注解:

  • onstant 是 view 的别名。

  • Getter 方法被标记为 view。

  • 编译器没有强制 view 方法不能修改状态。

2.3 Pure 函数

函数可以声明为 pure ,在这种情况下,承诺不读取或修改状态。

除了上面解释的状态修改语句列表之外,以下被认为是从状态中读取:

  • 读取状态变量。

  • 访问 this.balance 或者

    .balance。

  • 访问 block,tx, msg 中任意成员 (除 msg.sig 和 msg.data 之外)。

  • 调用任何未标记为 pure 的函数。

  • 使用包含某些操作码的内联汇编。

pragma solidity ^0.4.16;

contract C {

    function f(uint a, uint b) public pure returns (uint) {

        return a * (b + 42);
   }
}

警告

编译器没有强制 pure 方法不能读取状态。

本文作者:HiBlock区块链社区技术布道者辉哥

原文发布于简书

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

image

【solidity入门】8. 常数 constant & immutable (本文为学习WTF学院学习后记录的笔记) 常量constant & 不变量immutable 阅读详情

相关推荐

Unity游戏开发客户端面经——设计模式(初级)

Unity游戏开发客户端面经 之 设计模式 篇

Sea3752的博客 9427

c++字节数组的长度_[译]在 Solidity中使用值数组以降低 gas 消耗

译文出自:登链翻译计划译者:Tiny熊本文永久链接:learnblockchain.cn/article…背景我们Datona Labs在开发和测试Solidity数据访问合约(S-DAC:Smart-Data-Access-Contract)模板过程中,经常需要使用只有很小数值的小数组(数组元素个数少)。在本示例中,研究了使用值数组(Value Array)是否比引用数组(Reference A...

weixin_42135753的博客 249

科研智能体平台搭建与实战:大模型如何驱动科研自动化

大模型技术的快速发展,正推动AI智能体从单纯对话工具向主动执行任务的科研伙伴演进。智能体的核心原理在于整合模型调用、工具使用、知识库检索与工作流编排,使其能够自主拆解目标、执行操作并迭代优化。在科研场景中,这一技术价值尤为突出:文献初筛、实验数据清洗、代码调试、结果汇总等高频重复劳动均可实现自动化,大幅释放研究者精力。从基础组件配置到多智能体协同,从平台选型到提示词调优,实际落地需要关注模型匹配、工具稳定性、记忆管理与人机校验机制。本文基于真实工程经验,系统梳理科研智能体平台的搭建路径、应用案例与高频问题排

weixin_32597009的博客 282

constant变量存储位置_Solidity 中 immutable (不可变量)与constant(常量)

[Solidity 0.6.5](Solidity 0.6.8 中文文档) 更新引入了一个新的关键字 `immutable ` , 它与之前的`constant`常量有何不同呢? constant 常量constant 修饰的变量需要在**编译期确定值**, 链上不会为这个变量分配存储空间, 它会在编译时用具体的值替代, 因此, constant常量是不支持使用运行时状态赋值的(例如: `bloc...

weixin_33104731的博客 266

树莓派教程(基于python编程)--入门篇

一:格式化SD卡 SD卡插入读卡器连接电脑,使用SDFormatter对SD卡进行格式化 (重装烧录也要进行着SD卡格式化操作) 二:下载官方镜像 http://downloads.raspberrypi.org/raspbian_latest 三:烧录SD卡 使用Win32DiskImager将镜像烧录到格式化后的SD卡 SD卡盘根目录(/boot)下新建一个命名为ssh的...

qq_42109746的博客 6万+

VPI与Matlab协同仿真:相干光通信接收端DSP算法全解析

本文详细解析了如何利用VPI与Matlab协同仿真,构建完整的相干光通信接收端DSP算法处理闭环。重点介绍了从VPI导出数据后,在Matlab中实现时钟恢复、偏振解复用和载波相位估计等核心算法的步骤与原理,并阐述了如何通过误码率计算完成仿真验证,为相干光通信系统算法研究与验证提供了高效实用的方法。

ll5678的博客 609

solidity: view和pure关键字

用于声明函数是视图函数,即函数不修改合约的状态变量,但可以读取合约的状态。视图函数用于查询合约状态或计算结果,而不会改变合约的状态。:用于声明函数是纯函数,即函数不读取或修改合约的状态变量,并且不与外部合约进行交互。纯函数只根据输入参数计算结果,并返回一个值。关键字用于在 Solidity 中声明函数的属性,以提供更好的代码可读性、约束和优化。这些修饰符有助于更清晰地定义和理解函数的行为和用途。是函数修饰符关键字,用于声明函数的属性和行为。Solidity 中的。

suannai11的博客 744

别再让PyCharm吃光你的C盘!保姆级教程:安全迁移config、plugins和remote sources到D盘

本文提供了一份详细的PyCharm配置与缓存文件迁移指南,帮助开发者将config、plugins和remote sources等占用大量C盘空间的文件安全转移到D盘。通过修改data.properties文件和正确迁移顺序,确保PyCharm功能不受影响,同时释放宝贵的系统盘空间。

weixin_28836989的博客 423

TDD和TDMA是亲兄弟吗?一文拆解双工、多址与OFDM系列技术

无线通信技术术语众多,TDD、FDD、FDMA、TDMA、CDMA、SDMA、OFDM、COFDM等缩写常令人困惑。要理清它们,需从最基本的资源调度逻辑出发:通信系统利用频率、时间、码字、空间四个维度来组织信号传输,分别对应解决双工、多址与复用三类不同问题。TDD与FDD属于双工技术,管理设备收发方向的协调;FDMA、TDMA、CDMA和SDMA属于多址技术,解决多用户同时接入的共享冲突;而OFDM与COFDM则聚焦于单条链路上高速数据的并行搬运与抗干扰能力。理解这套分类框架,不仅有助于掌握4G/5G核心波

weixin_33946020的博客 422

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5702

RT_Thread Studio使用——USB虚拟串口(VCP)

RT_Thread Studio使用——USB虚拟串口(VCP)

weixin_44735205的博客 3373

关键字view和pure

view函数是只读函数,可以读取合约的状态,但不能修改它。pure函数是纯函数,不读取合约的状态,也不修改它。view函数可以调用其他的view函数,但不能调用pure函数。pure函数既不能调用其他的view函数,也不能调用普通的非view或pure函数。

wzx_come_on的博客 269

Android Telephony主要模块及功能

Telephony的代码主要由五个模块组成 1.Telephony Frameworks 代码区域: frameworks/opt/telephony/ 其中主要的文件在如下目录 /frameworks/opt/telephony/src/java/com/android/internal/telephony/ 其中比较常见的有以下几类文件 1.BaseCommands、RIL构成R

泊客 7720

solditiy学习笔记

说明: 本笔记写于2018.12, 示例代码中使用的solidity版本较低, 仅供学习交流. 如需编写生产环境的智能合约, 建议使用solidity v0.8.0以上的版本 Solitidy学习笔记 Solitidy开发环境搭建 Solitidy在线编程 http://remix.ethereum.org/ 本地npm install remix-ide -g 以太坊插件 MetaMask 可以通过 https://www.rinkeby.io/#faucet 获取测试环境的以太币.

yqq1997的博客 496

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

聊聊Solidity中的constant修饰符

前言 在《Solidity编译警告的解决之道》一文中聊到通过添加pure修饰来解决警告提示,这篇文章对此技术点进行进一步的拓展。 为什么使用constant 首先,我们要明白为什么用constant? Functions can be declared constant in which case they promise not to modify the state. 也...

程序新视界 6359

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

区块链——solidity语法

/ 通过npm从github中获取喂价服务合约// 该方法获取ETH/USD汇率// 对返回的元组进行解构int price,// 1e18是ETH的最小单位,1e17是1e18的1/10");// 传入eth数量,获取对应的USDT数量// 获取1eth兑换为usdt的价格。

weixin_42789698的博客 456

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

玩以太坊链上项目的必备技能(Constant 和 Immutable 状态变量-Solidity之旅十六)

编译器生成的合约创建代码将在返回合约之前修改合约的运行时代码,方法是将对不可变量的所有引用替换为分配给它们的值。如果要将编译器生成的运行时代码与实际存储在区块链中的代码进行比较,则这一点很重要。不可变量可以在声明时赋值,不过只有在合约的构造函数执行时才被视为视为初始化。允许内存分配器的副作用的原因是它可以构造复杂的对象,例如: 查找表(lookup-table)。允许可能对内存分配产生副作用(side-effect)的表达式,但那些可能对其他内存对象产生副作用的表达式则不允许。有确定的表达式来给它赋值。

仗剑行于江湖,执笔记江湖事。 2310

Solidity极简入门: 9. 常数 constant和immutable

​这一讲,我们介绍solidity中两个关键字,constant(常量)和immutable(不变量),让不应该变的变量保持不变。这样的做法能在节省gas的同时提升合约的安全性。

hina90的专栏 552

基于以太坊的智能合约开发Solidity(函数&继承篇)

本文介绍了Solidity智能合约开发中的核心概念,主要包括: 函数重载:允许同名函数通过参数类型和数量区分,但不考虑返回值类型。需要注意参数歧义问题。 命名参数:支持通过形参名传参,提高多参数时的代码可读性。 返回值特性:支持命名返回值、多返回值,以及通过返回值交换数据等灵活用法。 变量作用域与生命周期:遵循块级作用域规则,生命周期从定义到作用域结束。 构造函数:0.5+版本使用constructor关键字定义,在合约部署时执行。 函数修改器(modifier):用于函数前置条件检查,支持参数化和多重修饰

Zevalin的博客 1657

Solidity语言详解——view和pure函数的使用区别

Solidity 语言有两类和状态读写有关的函数类型,一类是 view 函数(也称为视图函数),另一类是 pure 函数(也称为纯函数)。他们的区别是 view 函数不修改状态,pure 函数即不修改状态也不读取状态。

StevenX5 5444

区块链基础入门——关于数组的一些语法

1.固定长度数组 pragma solidity ^0.4.0; contract FixArray{ uint[5] arr=[1,2,3,4,5]; function Init(){ arr[0]=100; arr[1]=200; } function getGrade()view returns(uint){ uint grade=0;

Judemots的博客 351

Solidity constant view pure关键字的区别与联系

在Solidity中constant、view、pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证。所以用好这几个关键词很重要,不言而喻,省gas就是省钱! 这三个关键词有什么区别和联系,简单来说,在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量...

weixin_33852020的博客 562

Solidity函数vie和pure关键字

view 修饰的函数 ,只能读取storage变量的值,不能写入。pure 修饰的函数 , 不能对storage变量进行读写。

github_34224676的博客 2467

【Solidity】6. 合约 - 深入理解Solidity

索引 【Solidity】1.一个Solidity源文件的布局 【Solidity】2.合约的结构体 【Solidity】3.类型 【Solidity】4.单位和全局可变量 【Solidity】5.表达式和控制结构 【Solidity】6. 合约 【Solidity】7. 部件 【Solidity】8. 杂项 ...

weixin_34289744的博客 708

solidity笔记(8)——pure用法——2021.5.13

solidity笔记(8)——pure用法一丶功能:二丶注意三丶上一篇:solidity笔记(7)——存储区域memory storage stack 一丶功能: 函数声明关键字 ,pure,承诺不读取或修改状态。 二丶注意 编译器没有强制 pure 方法不能读取状态。 读取状态变量。 访问this.balance 或者 .balance 访问block.tx msg中任意成员(除了msg.sig和msg.data之外) 调用任何未标记为 pure 的函数。 使用包含某些操作码的内联汇编。 三丶上一

weixin_43402353的博客 1029
上一篇: 深入理解Plasma(1):Plasma 框架
下一篇: Blockathon上海|年纪最小且是唯一一支女子团队率先获得投资人青睐与加持
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值