函数
Solidity 语言的函数非常灵活,可以进行各种复杂操作。说实话当我学到 solidity 函数时,我一直没太搞懂函数签名里的对它的描述,在网上找到一个公式,可以方便理解函数签名。
代码中函数的形式:
solidity
function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]
对其中的一些关键字:
{internal|external|public|private}
:函数可见性说明符,共有 4 种
public
:内部和外部均可见。private
:只能从本合约内部访问,继承的合约也不能使用。external
:只能从合约外部访问(但内部可以通过 this.f() 来调用,f 是函数名)。internal
: 只能从合约内部访问,继承的合约可以用。
注意 1:合约中定义的函数需要明确指定可见性,它们没有默认值。
注意 2:public|private|internal 也可用于修饰状态变量。public 变量会自动生成同名的 getter 函数,用于查询数值。未标明可见性类型的状态变量,默认为 internal。
pure
与view
我第一次学习 solidity 时,pure 和 view 关键字让我费解,因为其他编程语言中没有类似的关键字。solidity 引入这两个关键字主要是因为 以太坊交易需要支付气费(gas fee)。合约的状态变量存储在链上,gas fee 很贵,如果计算不改变链上状态,就可以不用付 gas。包含 pure 和 view 关键字的函数是不改写链上状态的,因此用户直接调用它们是不需要付 gas 的(注意,合约中非 pure/view 函数调用 pure/view 函数时需要付 gas)。
需要付 gas 的动作
- 写入状态变量。
- 释放事件。
- 创建其他合约。
- 使用 selfdestruct.
- 通过调用发送以太币。
- 调用任何未标记 view 或 pure 的函数。
- 使用低级调用(low-level calls)。
- 使用包含某些操作码的内联汇编。
payable
一句话解释:能给合约支付 eth 的函数
其他的关键字都很好理解,不做多余说明了。