> 技术文档 > 【solidity基础】一文说清楚合约函数的大小事

【solidity基础】一文说清楚合约函数的大小事

在 Solidity 里,函数合约的关键构成部分,用于执行特定任务或操作的代码块,可以包含逻辑、访问状态变量、进行计算,并且可以接受参数和返回值。

但是solidity 的函数与其他语言不太一样,经常会有同学搞混,这里开一篇文章完整介绍一下 solidity 函数的用法。

1. 函数定义与声明

function functionName(parameterType1 parameterName1, parameterType2 parameterName2, ...) visibility modifiers returns (returnType1, returnType2, ...) { // 函数体}
  • function 关键字声明函数
  • functionName:函数的名称。
  • parameterType 和 parameterName:函数的参数,可包含多个参数,参数之间用逗号分隔。
  • visibility:函数的可见性,如 public、private、internal、external。
  • modifiers:可选的修饰符,如 pure、view、payable 等。
  • returns:指定函数的返回值类型,可返回多个值。

2. 函数的修饰符

2.1 函数的可见性

函数可见性修饰符可以用来修饰状态变量和函数,决定了函数的访问权限,具体如下:

  • public: 函数可以被合约内外的任何代码调用。默认为 public。
  • private:函数只能在定义它的合约内部被调用,在派生合约里也是无法访问的。
  • internal:函数只能在定义它的合约及其派生合约中被调用。
  • external:函数只能从合约外部调用,不能在合约内部直接调用,但可以使用 this.functionName() 的方式调用。

2.2 函数状态的可见性

函数状态可变性修饰符用于描述函数是否会修改合约的状态变量,主要用于定义函数的行为和特性。具体有以下几种:

  • pure:函数既不读取也不修改合约的状态变量(即完全不访问状态变量),通常用于执行纯数学计算等操作。

    • 不允许访问thismsg对象。
    • 可以在编译时被内联优化。
    • 不能发送以太币。
    function add(uint a, uint b) public pure returns (uint) { return a + b;}
  • view:函数只读取合约的状态变量,但不修改它们。

    • 可以调用其他 viewpure函数
    • 不允许修改状态变量
    • 不允许发送以太币
    contract MyContract { uint public myVariable = 10; function getMyVariable() public view returns (uint) { return myVariable; }}
  • payable:函数可以接收 Ether,当调用该函数时,可以附带一定数量的 Ether。

    • 允许接收以太币
    • 可以调用其他payable函数
    function calculate(uint a, uint b) public pure returns (uint sum, uint product) { sum = a + b; product = a * b; return (sum, product);}
  • virtaul:函数可以被派生合约重写覆盖

    • 在父合约中声明函数为 virtual,表示该函数可以在派生合约中被重写。
    • 派生合约中可以使用 override 关键字