第二集:Solidity函数讲解

函数基础

1.Solidity本身也是一门函数编程语言,也就是说函数可以做参数、变量、返回值。函数属于值类型,支持多返回值。

2.调用方式

  • 内部调用
  1. 内部调用采用EVM跳转调用,所以能够直接使用上下文中的数据,因为不用拷贝数据,所以在数据传递的时候非常高效
  2. 对合约内的函数,引入的库函数和从父合约中继承的函数都可以进行内部调用
  • 外部调用
  1. 采用外部交易调用,使用external。对于一个外部调用,所有的函数参数必须要拷贝到内存中。

函数定义类型

1.View:只读,不改变合约内部状态

  • 会改变合约状态的操作
  1. 写入状态变量
  2. 底层的调用
  3. 调用任何一个没有被标记为view或者pure的函数
  4. 发送以太币
  5. 使用自毁函数
  6. 创建合约
  7. 触发事件

在箭头位置添加view,可以解除方框内的warning。

2.Pure:也不会修改合约状态,而且pure标记的函数不能读取合约状态(可以读取与合约状态无关的数据)。

  • 与view相比,pure的限制还包括更多的内容
  1. 不能读取状态变量
  2. 用任何一个没有被标记为pure的函数
  3. 不能访问block,tx,msg的大多数成员(可以访问msg.sig,msg.data)
  4. 不能访问this.balance或者address.balance

特殊函数类型

回退函数

  • 定义:在每个合约中都有一个没名字的函数,该函数没有名字、没参数、没有返回值,这就是回退函数
  • 作用:
  1. 在调用合约时,没有匹配上任何一个函数
  2. 如果回调函数要接收ether,必须要有payable修改饰符
  3. 给合约发送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:
  1. external可以用途外部函数调用的参数,或者由外部函数调用返回
  2. 还可以通过其它合约进行调用
  3. 如果是this调用,那么都是在通过external的方式进行调用
  4. 不能在内部去调用一个外部函数
  • private:私有函数只能在当前合约中进行访问,不能通过继承进行访问

  • public:公有函数,可以通过内部,外部,或者消息进行进行调用。对于public类型的状态变量,会自动创建一个访问器。

在内部调用:

在外部调用:

通过继承调用:

猜你喜欢

转载自blog.csdn.net/super_lixiang/article/details/83107700
今日推荐