函数基础
1.Solidity本身也是一门函数编程语言,也就是说函数可以做参数、变量、返回值。函数属于值类型,支持多返回值。
2.调用方式
- 内部调用
- 内部调用采用EVM跳转调用,所以能够直接使用上下文中的数据,因为不用拷贝数据,所以在数据传递的时候非常高效
- 对合约内的函数,引入的库函数和从父合约中继承的函数都可以进行内部调用
- 外部调用
- 采用外部交易调用,使用external。对于一个外部调用,所有的函数参数必须要拷贝到内存中。
函数定义类型
1.View:只读,不改变合约内部状态
- 会改变合约状态的操作
- 写入状态变量
- 底层的调用
- 调用任何一个没有被标记为view或者pure的函数
- 发送以太币
- 使用自毁函数
- 创建合约
- 触发事件
在箭头位置添加view,可以解除方框内的warning。
2.Pure:也不会修改合约状态,而且pure标记的函数不能读取合约状态(可以读取与合约状态无关的数据)。
- 与view相比,pure的限制还包括更多的内容
- 不能读取状态变量
- 用任何一个没有被标记为pure的函数
- 不能访问block,tx,msg的大多数成员(可以访问msg.sig,msg.data)
- 不能访问this.balance或者address.balance
特殊函数类型
回退函数
- 定义:在每个合约中都有一个没名字的函数,该函数没有名字、没参数、没有返回值,这就是回退函数
- 作用:
- 在调用合约时,没有匹配上任何一个函数
- 如果回调函数要接收ether,必须要有payable修改饰符
- 给合约发送ether时也会调用,需要注意的是,如果合约没有定义回调函数的话,接收ether会触发异常。
调用一个存在的函数,若没有调到,则调用回退函数。
自毁函数
- 自毁函数可以摧毁当前合约,如果合约中有以太币,则会将以太币转移到给定的地址
- 如果合约在被自毁之后还有人发送以太币到这个合约地址,那么这些以太币就会消失,无法赎回
常函数
- 关键字 : constant
- 常函数不会修改区块链上的任何状态,没有强制的规定,但是会给警告。
访问器(getter)
- 编译器为自动为所有的public状态变量创建访问器
- 访问函数具有外部可见性。如果通过内部方式访问,可以直接当成一个变量。但如果通过外部方式进行访问,比如通过this,那么必须通过函数的方式调用。
其它内置函数
加密函数
- Solidity中的加密实际上调用的是以太中的加密函数
- keccak256(x)
- sha256(x)
- sha3(x)
- ripemd160(x)
- ecrecover(hash, v, r, s) 公钥恢复的函数
数据函数
- addmod(x, y, k):x+y对k取余
- mulmod(x, y, k):x * y 对k 取余
函数修改器(modifier)
- 修改器的作用是在函数执行前检查某种前置条件是否满足
- 修改器是一种合约的属性,可以被继承也可以被派生的合约重写。
- 一个函数可以有多个修改器,其间采用空格分开,而修改器的生效顺序与定义顺序一样。
- 必须要加 _;
函数可见性与权限
内部函数:internal
外部函数:external
私有函数:private
公有函数:public
- Internal:不能够在当前合约的上下文环境之外执行,只能在当前合约内进行调用。比如当前的代码块,内部的库函数,继承的合约中。
- external:
- external可以用途外部函数调用的参数,或者由外部函数调用返回
- 还可以通过其它合约进行调用
- 如果是this调用,那么都是在通过external的方式进行调用
- 不能在内部去调用一个外部函数
-
private:私有函数只能在当前合约中进行访问,不能通过继承进行访问
-
public:公有函数,可以通过内部,外部,或者消息进行进行调用。对于public类型的状态变量,会自动创建一个访问器。
在内部调用:
在外部调用:
通过继承调用: