一、目录
▪ 函数的定义
▪ 函数的调用方式
▪ 函数的可见性
▪ 函数修改器
▪ pure函数
▪ constant、view函数
▪ payable函数
▪ 回退函数
▪ 构造函数
▪ 函数参数
▪ 抽象函数
▪ 数学和加密函数
二、函数的定义
function关键字声明的,合约中的可执行单元,一个函数的完整定义如下:
function (funcName) (<parameter types>) {public|external|internal|private} [constant|view|payable] [returns (<return types>)]
三、函数的调用方式
Solidity封装了两种函数的调用方式internal(内部调用)和external(外部调用)。
3.1 internal(内部调用方式)
internal调用,实现时转为简单的EVM跳转,所以它能直接使用上下文环境中的数据,对于引用传递时将会变得非常高效(不用拷贝数据)。
在当前的代码单元内,如对合约内函数,引入的库函数,以及父类合约中的函数直接使用即是以internal方式的调用。我们来看个简单的例子:
pragma solidity ^0.4.24; contract Test {
functionf
(){}
//以internal的方式调用 functioncallInternally
(){ f(); } }
在上述代码中,callInternally()以internal的方式对f()函数进行了调用。
简而言之,internal(内部调用方式)就是直接使用函数名去调用函数。
3.2 external(外部调用方式)
external调用,实现为合约的外部消息调用。所以在合约初始化时不能external的方式调用自身函数,因为合约还未初始化完成。下面来看一个以external方式调用的例子:
pragma solidity ^0.4.24; contract A{
functionf
(){} } contract B{
//以external的方式调用另一合约中的函数 functioncallExternal
(A a){ a.f(); } }
虽然当前合约A和B的代码放在一起,但部署到网络上后,它们是两个完全独立的合约,它们之间的方法调用是通过消息调用。上述代码中,在合约B中的callExternal()以external的方式调用了合约A的f()。
简而言之,external(外部调用方式)就是使用合约实例名.函数名的方式去调用函数。
3.3 this
我们可以在合约的调用函数前加this.来强制以external方式的调用。
pragma solidity ^0.4.24; contract A{ function
f
()
external
{} function
callExternally
(){ this.f(); } }
3.4 调用方式说明
上面所提到的internal和external指的函数调用方式,请不要与后面的函数可见性声明的external,public,internal,private弄混。声明只是意味着这个函数需要使用相对应的调用方式去调用。
四、函数的可见性
Solidity为函数提供了四种可见性,external,public,internal,private。
4.1 external(外部函数)
▪ 声明为external的函数可以从其它合约来进行调用,所以声明为external的函数是合约对外接口的一部分。
▪ 不能以internal的方式进行调用。
▪ 有时在接收大的数据数组时性能更好。
pragma solidity ^0.4.24; contract FuntionTest{ function
externalFunc
()
external
{} function
callFunc
(){ //以`internal`的