solidity-8.函数

2018-11-19  本文已影响0人  jection

函数(Functions)

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

函数调用

两种方式

View函数

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

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值:

上一篇 下一篇

猜你喜欢

热点阅读