最近在学习Solidity,简单记录一下。

推荐0xAA师傅的Solidity极简入门教程

# 函数

solidity官方文档里把函数归到数值类型中,但他们之间的差别还是比较大的。

# 函数类型

在solidity中,函数的定义为:

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

学过C语言的都知道怎么定义一个函数,但solidity中的函数与C的稍微有些不同,它需要额外设置3个关键字。

  • internal|external|public|private(必须设置)

    • public:最宽松的限制,合约内外都可以访问(如果用来修饰映射变量,会生成相应函数用来查询数值)。
    • private:只能从合约内部访问,继承的子合约不能访问。
    • external:只能从合约外部访问。
    • internal:只能从合约内部访问,继承的子合约可以访问。
    pragma solidity ^0.8.4;
    //SPDX-License-Identifier: SimPL-2.0
    contract _function {
       uint _uint = 1;
       function _public () public {
          _uint = _uint - 1;
       }
       function _private () private {
          
       }
       function _external () external {
    
       }
       function _internal () internal {
    
       }
    }
  • pure|view|payable(按需设置)

    • payable:只有包含payable关键字的函数,才能在运行的时候给合约转入ETH。

    在变量一章有提到过,以太坊的运行依赖矿工,而矿工在挖掘区块时也是要收钱的,也就是我们常说的gas fee。因此我们希望在执行合约时,花费的gas fee越少越好,pureview两个关键字就是用来节省gas fee的,包含它俩关键字的函数不会改变链上的状态,也就不需要花费gas fee

    • pure:包含pure关键字的函数,既不能读取变量也不能写入变量。
    • view:包含view关键字的函数,只能读取变量,不能写入变量。

    不包含pure或view关键字的函数,既能读取变量,也能写入变量。

  • returns (<return types>)(按需设置)