Solidity极简入门#3. 函数类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solidity极简入门#3. 函数类型相关的知识,希望对你有一定的参考价值。

Solidity中的函数

solidity官方文档里把函数归到数值类型,但我觉得差别很大,所以单独分一类。我们先看一下solidity中函数的形式:

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

看着些复杂,咱们从前往后一个一个看(方括号中的是可写可不写的关键字):

  1. function:声明函数时的固定用法,想写函数,就要以function关键字开头。
  2. <function name>:函数名。
  3. (<parameter types>):圆括号里写函数的参数,也就是要输入到函数的变量类型和名字。
  4. internal|external|public|private:函数可见性说明符,一共4种。没标明函数类型的,默认public。合约之外的函数,即"自由函数",始终具有隐含internal可见性。Note 1: 没有标明可见性类型的函数,默认为public。Note 2: public|private|internal 也可用于修饰状态变量。 public变量会自动生成同名的getter函数,用于查询数值。Note 3: 没有标明可见性类型的状态变量,默认为internal。
  • public: 内部外部均可见。
  • private: 只能从本合约内部访问,继承的合约也不能用。
  • external: 只能从合约外部访问(但是可以用this.f()来调用,f是函数名)。
  • internal: 只能从合约内部访问,继承的合约可以用。
  1. [pure|view|payable]:决定函数权限/功能的关键字。payable(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入ETH。pure和view的介绍见下一节。
  2. [returns ()]:函数返回的变量类型和名称。

到底什么是Pure和View?

我刚开始学solidity的时候,一直不理解pure跟view关键字,因为别的语言没有类似的关键字。solidity加入这两个关键字,我认为是因为gas fee。合约的状态变量存储在链上,gas fee很贵,如果不改变链上状态,就不用付gas。包含pure跟view关键字的函数是不改写链上状态的,因此用户直接调用他们是不需要付gas的(合约中非pure/view函数调用它们则会改写链上状态,需要付gas)。

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

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

我画了一个马里奥插画,帮助大家理解。在插画里,我把合约中的状态变量(存储在链上)比作碧池公主,三种不同的角色代表不同的关键字。

Solidity极简入门#3.