聊聊Solidity中的constant修饰符

简介: 聊聊Solidity中的constant修饰符

前言

在《Solidity编译警告的解决之道》一文中聊到通过添加pure修饰来解决警告提示,这篇文章对此技术点进行进一步的拓展。


为什么使用constant

首先,我们要明白为什么用constant?


Functions can be declared constant in which case they promise not to modify the state.


也就是说,当执行函数时不会去修改区块中的数据状态时,那么这个函数就可以被声明成constant的,比如说getter类的方法。


同时,当函数被constant修饰时也是提示web3js(或其他json-rpc客户端)调用此方法时要使用eth_call函数而不是eth_sendTransaction。


constant需要编程时明确指定,即使状态不会改变,编译器也不会自动添加。一般情况下调用constant声明的方法不需要花费gas,如果未使用constant修饰的函数在调用的过程中可能会生成一笔交易并且产生交易费用。


constant与view的区别

在Solidity 0.4.16中介绍view和constant时,文档是这样描述的:


constant for functions: Same as view.


也就是说,view和constant效果是一样的。


在最新版本的Solidity中是这样描述的:


constant on functions is an alias to view, but this is deprecated and will be dropped in version 0.5.0.


Getter methods are marked view.


constant是view的别名,不过constant在0.5.0版本中将会被去掉。这也是我们在写智能合约时需要注意的事项。目前网络上的示例基本上还都采用constant来进行修饰。


那么,文档中已经描述这两者是相同的,那么为什么要用view来替代constant呢?基本上原因是这样的,使用constant有一定的误导性,比如用constant修饰的方法返回的结果并不是常量,而是根据一定的情况有所变化。而且,用constant来修饰并不是那么细致入微。因此,引入了更有意义和更有用的view和pure来代替constant。


替换前后的变化

替换当前:

- constant修饰的函数不应该修改状态(尚未完全强制执行);

- constant修饰的变量(类中的变量而不是方法)每次调用时都会被重新计算;


替换之后:

- 关键词view用来修饰函数,替换掉constant。调用view修饰的函数不能改变未来与任何合约交互的行为。这意味着被修饰的函数不能使用SSTORE,不能发送或接收以太币,只能调用其他view或pure修饰的函数。

- 关键字pure用来修饰函数,是在view修饰函数上附加了一些限制,函数的结果仅取决于函数的参数。这意味着它不能使用SSTORE,SLOAD,不能发送或接收以太币,不能使用msg或block而只能调用其他pure函数。

- 关键字constant针对函数无效。

- 任何用constant修饰的变量将不能被修改(可以由优化器放入内存或字节码中)


小结

本篇文章主要介绍了constant的作用以及将要被替代的view和pure的简介。如果使用新版本的Solidity进行智能合约开发必然会遇到此类问题。


原文链接:https://www.choupangxia.com/topic/detail/27


目录
相关文章
|
存储 SQL 缓存
Hadoop入门(一篇就够了)
Hadoop入门(一篇就够了)
28060 4
Hadoop入门(一篇就够了)
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
163284 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
机器学习/深度学习 人工智能 算法
AI辅助医疗影像:提高诊断准确性
【10月更文挑战第2天】医学影像技术是现代医学诊断的关键手段,但传统方法依赖医生经验,存在误诊风险。AI辅助医疗影像通过自动化图像识别、疾病预测和辅助诊断决策,显著提升了诊断准确性与效率。利用深度学习、数据增强及迁移学习等技术,AI不仅能快速分析影像,还能提供个性化诊疗建议,并实时监测疾病变化。尽管面临数据质量、算法可解释性和伦理法律等挑战,但多模态影像分析、跨学科合作及VR融合等趋势将推动AI在医疗影像领域的广泛应用,助力实现更精准、高效的医疗服务。
|
9月前
|
程序员 API 开发者
实战阿里qwen2.5-coder 32B,如何配置Cline的Ollama API接口。
阿里Qwen2.5大模型开源免费,适合编程应用。在Ollama平台下载时,推荐选择带有“cline”字样的Qwen2.5-Coder版本,仅需额外下载适配文件,无需重复下载模型文件。Ollama环境永久免费,配置简单,效果出色,适合开发者使用。
5141 77
|
存储 Linux 数据处理
【阿里云】对象存储 OSS 产品评测
对象存储服务的全流程使用体验,带你由浅入深玩转 OSS 的日常操作
4754 4
【阿里云】对象存储 OSS 产品评测
|
达摩院 数据中心
阿里云集齐五大超级数据中心
位于南通、杭州和乌兰察布的三座超级数据中心正式落成,将新增超百万台服务器,辐射京津冀、长三角、粤港澳三大经济带。
2015 1
阿里云集齐五大超级数据中心
|
存储 Kubernetes API
探索使用Kubernetes扩展专用游戏服务器:第3部分 - 扩展节点
探索使用Kubernetes扩展专用游戏服务器:第3部分 - 扩展节点
419 0
探索使用Kubernetes扩展专用游戏服务器:第3部分 - 扩展节点
|
15天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾