Solidity函数类型

Solidity中的函数

    function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]

函数中的关键字解释如下:

  1. function:生命函数的固定用法,想写函数,必须一function开头。

  2. <function name>:函数名称。

  3. (<paramter types>):圆括号里写函数的参数,也就是要输入到函数的变量类型和名字。

  4. {internal|external|public|private}:函数可见性说明符,一共4种。没标明函数类型的,默认public。合约之外的函数,即"自由函数",始终具有隐含internal可见性。

    • public: 内部外部均可见。
    • private: 只能从本合约内部访问,继承的合约也不能用。
    • external: 只能从合约外部访问(但是可以用this.f()来调用,f是函数名)。
    • internal: 只能从合约内部访问,继承的合约可以用。

    Note 1: 没有标明可见性类型的函数,默认为public。

    Note 2: public|private|internal 也可用于修饰状态变量。 public变量会自动生成同名的getter函数,用于查询数值。

    Note 3: 没有标明可见性类型的状态变量,默认为internal。

  5. [pure|view|payable]:决定函数权限/功能的关键字。payable(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入ETH。

  6. [returns ()]:函数返回的变量类型和名称。

什么是Pure和View?

包含pure跟view关键字的函数是不改写链上状态的,因此用户直接调用他们是不需要付gas的(合约中非pure/view函数调用它们则会改写链上状态,需要付gas)。

在以太坊中,以下语句被视为修改链上状态:

  1. 写入状态变量。
  2. 释放事件。
  3. 创建其他合约。
  4. 使用selfdestruct。
  5. 通过调用发送以太币。
  6. 调用任何未标记view或pure的函数。
  7. 使用低级调用(low-level calls)。
  8. 使用包含某些操作码的内联汇编。

pure,中文意思是“纯”。包含pure关键字的函数,不能读取也不能写入存储在链上的状态变量。那pure函数能做些什么?举个例子,你可以给函数传递一个参数 _number,然后让他返回 _number+1。

    // pure
    function addPure(uint256 _number) external pure returns(uint256 new_number){
        new_number = _number + 1;
    }

view,“看”,在solidity里理解为“看客”。包含view关键字的函数,能读取但也不能写入状态变量。

    // view
    function addView() external view returns(uint256 new_number) {
        new_number = number + 1;
    }

不写pure也不写view,函数既可以读取也可以写入状态变量。