跳至内容
0%

什么是 Solidity 函数?

Alchemy team headshot

作者 Alchemy

发布于 2022年10月4日1 分钟阅读

Solidity 函数有多种类型,包括 view 函数、pure 函数、特殊函数和 fallback 函数。函数还可以通过 public、external、internal 和 private 这几种函数可见性修饰符来修饰。本文将介绍 Solidity 函数类型、语法,以及如何读懂函数和可见性。

什么是 Solidity 函数?

Solidity 函数是完成特定任务的独立代码模块。 与其他web3 编程语言一样,Solidity 允许开发者通过函数编写模块化代码,从而消除重复编写同一段代码的冗余。开发者可以在程序中需要的时候调用某个函数,而不必重写代码。

如何编写和读懂 Solidity 函数

编写 Solidity 函数时,开发者需要按照正确的语法来组织函数,并确保写出其基本组成部分,以保证函数能够正确执行。

Solidity 函数语法

按照以下语法来创建你的 Solidity 函数,如下例所示:

  1. 使用 function 关键字来定义函数
  2. 为函数创建一个名称,该名称必须唯一,且不能与任何保留关键字重合
  3. 列出参数(包含参数的名称和数据类型),或不包含额外参数
  4. 创建一个用花括号包裹的语句块

注意:Solidity 事件的声明方式与函数类似。事件和函数对于高层次的 dApp 开发都是不可或缺的。

下图展示了 Solidity 函数的三个主要组成部分:

  1. 函数名
  2. 函数类型
  3. 返回类型
Solidity 中函数的示例
Solidity 中函数的示例

Solidity 函数有哪些不同类型?

本节将介绍 Solidity 函数的各种类型,包括 view 函数、pure 函数、特殊函数和 fallback 函数。

1. View 函数

在 Solidity 中,view 函数是只读的,不能改变智能合约中定义的状态变量。view 函数的语法如下:

2. Pure 函数

pure 函数声明不会改变或读取任何状态变量。pure 函数通常用于一些通用的工具或计算。pure 函数的语法如下:

3. 特殊函数

Solidity 提供了几种在开发智能合约时可以使用的特殊函数。getter 函数和 receive 函数是 Solidity 智能合约中重要的可支付函数

Getter 函数

被声明为 public 的状态变量会由编译器自动创建一个 getter 函数。该函数与变量同名,并具有 external 可见性。

Receive ether 函数

一个合约最多只能有一个 receive 函数。receive 函数不能带参数,也不能有返回值,且必须具有 external 可见性和 payable 状态可变性。

当对合约发起一次发送 Ether 且未指定任何函数的调用时,就会执行 receive 函数。该函数声明方式如下:

4. Fallback 函数

在 Solidity 中,fallback 函数是一个没有名称、参数或返回值的 external 函数。当函数标识符与智能合约中任何可用函数都不匹配,或调用函数时没有附带任何数据时,就会执行 fallback 函数。

什么是函数重载?

当同一作用域内针对同一个函数名存在多个定义时,就发生了函数重载。这些函数的定义之间必须在参数列表的类型和/或数量上有所不同。仅返回类型不同的函数声明不能构成重载。

Vyper 处理函数重载的方式与 Solidity 有何不同?

与 Solidity 不同,Vyper(一种基于 Solidity 的 Python 风格语言)不支持函数重载。在 Vyper 中尝试进行函数重载会导致 “Duplicate function or event name” 错误。

函数可见性是什么意思?

指定函数可见性可以让我们控制哪些实体可以调用智能合约内的函数。调用者共有三种类型:

  1. 主合约本身
  2. 从主合约派生(即继承)而来的合约
  3. 第三方

函数可见性能帮助你控制上述哪些调用者可以执行该函数。函数可见性共有四种类型:

  1. Public
  2. External
  3. Internal
  4. Private

函数的可访问性从 External 到 Private 依次递减:public 函数的可访问性最高,private 函数的可访问性最低。

External 与 public 的区别

External 和 public 是可以从合约定义范围之外调用的两种函数可见性。External 表示该函数只能被其他合约或外部拥有账户(EOA)调用。Public 表示该函数既可以从外部调用,也可以从合约内部调用。

Internal 与 private 的区别

与 external 和 public 不同,internal 和 private 都不允许外部方访问该函数。对于 private 函数,只有同一合约内的函数才能调用它。对于 internal 函数,同一合约内的函数或派生合约内的函数都可以调用它。

继续学习 Solidity 函数

本文向你介绍了 Solidity 中的函数。想继续学习,可以报名 Alchemy University 的 Ethereum Developer Bootcamp,免费学习为期 7 周的异步 Solidity 速成课程。如果开发者对开发本身还比较陌生,那么在开始 Ethereum bootcamp 之前,Alchemy University 的为期 3 周的 JavaScript 速成课程是一个不错的先修课程。

Background gradient

构建区块链应用

Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。