美文网首页
solidity-8.函数

solidity-8.函数

作者: jection | 来源:发表于2018-11-19 16:44 被阅读0次

函数(Functions)

函数的声明方式如下:
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

函数调用

两种方式

  • 内部调用,调用同一个合约的内部函数,不会发起EVM信息调用
  • 外部调用,调用其它合约的外部函数,会发起EVM信息调用

View函数

view函数是指不修改合约状态的函数。
修改合约状态的行为有:

  • Writing to state variables.修改状态变量
  • Emitting events.触发事件
  • Creating other contracts.创建其它合约
  • Using selfdestruct.使用销毁函数
  • Sending Ether via calls.发送eth币
  • Calling any function not marked view or pure.调用其它非view和pure的函数
  • Using low-level calls.使用底层api
  • Using inline assembly that contains certain opcodes.使用内联汇编

constant常量函数view函数其实是一样的
Getter访问函数也是view函数

Pure函数

Pure函数是指不修改、且不读取合约状态的函数。
读合约状态的行为有:

  1. Reading from state variables.读取状态变量
  2. Accessing this.balance or <address>.balance.访问账户余额
  3. Accessing any of the members of block, tx, msg (with the exception of msg.sig and msg.data).访问block,tx,msg对象
  4. Calling any function not marked pure.调用其它非view和pure函数
  5. Using inline assembly that contains certain opcodes.使用内联汇编

Fallback函数

每一个合约有且仅有一个没有名字的、没有参数、没有返回值的函数——Fallback函数

contract SimpleFallback{
  function(){
    //fallback function
  }
}

Fallback函数被调用的方式有:

  • 没有匹配上任何一个函数
  • 没有传哪怕一点数据

address.call()调用合约函数时,如果没有匹配上任何一个函数,就会调用默认的回退函数。
address.send(ether to send)向某个合约直接转帐时,由于这个行为没有发送任何数据,所以接收合约总是会调用fallback函数。

注意:
如果我们要在合约中通过send()函数接收,就必须定义fallback函数,否则会抛异常。
fallback函数必须增加payable关键字,否则send()执行结果将会始终为false。

Fallback函数的限制

send()函数总是会调用fallback,这个行为非常危险,著名的DAO被黑也与这有关。如果我们在分红时,对一系列帐户进行send()操作,其中某个做恶意帐户中的fallback函数实现了一个无限循环,将因为gas耗尽,导致所有send()失败。为解决这个问题,send()函数当前即便gas充足,也只会附带限定的2300gas,故而fallback函数内除了可以进行日志操作外,你几乎不能做任何操作。如果你还想做一些复杂的操作,解决方案看这里:http://me.tryblockchain.org/blockchain-solidity-fallback-bestpractice.html

下述行为消耗的gas都将超过fallback函数限定的gas值:

  • 向区块链中写数据
  • 创建一个合约
  • 调用一个external的函数
  • 发送ether
    所以一般,我们只能在fallback函数中进行一些日志操作:

相关文章

  • solidity-8.函数

    函数(Functions) 函数的声明方式如下:function ( ) {internal|external} ...

  • Excel(三)

    AND函数 OR函数 NOT函数 IF函数 频率分析函数FREQUENCY

  • if、else if、for、while、repeat函数

    ①if函数 ②else if函数 ③for函数 ④while函数 ⑤repeat函数

  • strsplit、mapply、paste、match函数

    strsplit函数 mapply函数 strsplit函数 mapply函数 paste函数 match函数 第...

  • Oracle中常用函数(SQL)

    Oracle函授有以下几个分类:数字函数、字符函数、日期函数、转换函数、集合函数、分析函数 数字函数: 字符函数:...

  • MySQL函数

    字符函数 数字运算函数 比较运算符和函数 日期时间函数 信息函数 聚合函数 加密函数 流程函数

  • BI-SQL丨AND & OR & IN

    AND函数 & OR函数 & IN函数 AND函数、OR函数和IN函数都可以理解是WHERE函数的补充,当然也可以...

  • Python之函数

    课程大纲 函数定义 函数的参数 函数的返回值 高阶函数 函数作用域 递归函数 匿名函数 内置函数 函数式编程 将函...

  • 函数基本知识

    函数 函数的定义: def 函数名() 函数的调用:函数名() #不能将函数调用放在函数定义上方 函数的文档注...

  • 积分表——不定期更新

    基本初等函数包括: 常函数: 幂函数 指数函数 对数函数 三角函数 反三角函数 I、反函数Ⅱ、复合函数:初等函数(...

网友评论

      本文标题:solidity-8.函数

      本文链接:https://www.haomeiwen.com/subject/evyxqqtx.html