聊聊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客户端)调用此方法时要使用ethcall函数而不是ethsendTransaction。

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进行智能合约开发必然会遇到此类问题。

目录
相关文章
|
6月前
|
编译器 Swift
在Swift中定义常量(Constant)
在Swift中定义常量(Constant)
200 2
|
6月前
|
存储 Swift
在Swift编程语言中,变量(Variable)和常量(Constant)
在Swift编程语言中,变量(Variable)和常量(Constant)
100 1
|
6月前
|
安全 编译器 程序员
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
418 3
|
6月前
|
存储 安全 程序员
learn_C_deep_3 (最名不符实的关键字 - static、static关键字总结、基本数据类型、最冤枉的关键字 - sizeof)
learn_C_deep_3 (最名不符实的关键字 - static、static关键字总结、基本数据类型、最冤枉的关键字 - sizeof)
|
安全
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
|
JavaScript
TypeScript 类(class)与修饰符的详细使用
TypeScript 类(class)与修饰符的详细使用
131 0
|
Java
_Constant 常量 and _Variable 变量
首先,在Java中我们常用 constant 来定义一个常量,用 Variable 来定义变量。
87 0
typescript40-class类的保护修饰符
typescript40-class类的保护修饰符
94 0
typescript40-class类的保护修饰符
typescript39-class类的可见修饰符
typescript39-class类的可见修饰符
68 0
typescript39-class类的可见修饰符
typescript41-class类的私有修饰符
typescript41-class类的私有修饰符
86 0
typescript41-class类的私有修饰符