Solidity 中的函数可见性

2025年6月2日 | 阅读6分钟

函数是可执行的代码组,其中包含合约中必要的业务逻辑。 函数用于任何编程语言,以提高代码的可重用性。 在 Solidity 中,函数有四种类型:internal、external、public 和 private。 Solidity 函数由修饰符组成,这些修饰符确定合约的访问或修改级别。 函数的语法如下

函数可见性用于指定函数的访问级别。 在本教程中,我们将介绍函数可见性的所有详细信息。 将涵盖以下主题

  1. 什么是函数可见性修饰符?
  2. 函数修饰符和继承如何协同工作?
  3. Solidity 中的默认函数可见性范围
  4. 函数和状态变量可见性修饰符之间的区别?
  5. 结论

让我们开始吧!

什么是函数可见性修饰符?

Solidity 智能合约中的函数可见性功能代表函数对合约内部或其它合约中调用的其它函数的可见性(使用可访问性)。 这是一个重要的特性,因为它帮助用户识别合约中或其它合约中可以使用函数的位置。 编码人员在智能合约开发时指定函数的可见性。 如果用户未指定任何可见性范围,则默认采用 internal。 Solidity 中的默认函数可见性是 public。

在本教程中,我们将简要讨论函数可见性、其类型以及如何在 solidity 中使用它们。

函数可见性修饰符和继承如何协同工作?

与任何其它编程语言不同,继承的概念被定义为子智能合约使用父合约属性的属性。 在 Solidity 中,继承有它自己的语法,关键字 'is' 用于提供继承。 在 Solidity 中,函数有四种类型:internal、external、public 和 private。

函数可见性修饰符具有不同的可访问性,如下表所示

函数可见性说明符函数可访问性(通过子合约)
公共声明为 public 的函数可以被子合约访问。
私有声明为 private 的函数不能被子合约访问。
内存在父合约中用 Internal 可见性说明符声明的函数可以被子合约访问。
外部在父合约中用 External 可见性说明符声明的函数不能被子合约访问。

让我们详细讨论每个说明符

1. 函数可见性:Internal

Internal 函数只能在父合约或继承它的子合约中访问。 这是状态变量的默认可见性级别。 它们不创建实际的 EVM 调用。 用 internal 修饰符声明的函数只能由继承的子合约调用。 其它合约不能使用 internal 函数。

语法

程序:在下面的程序中,我们声明了两个智能合约,一个 Parent 合约和一个 child 合约,以演示 Solidity 中的 internal 函数可见性概念。

输出

Function Visibility in Solidity

2. 函数可见性修饰符:External

External 函数可以通过交易从其它合约调用。 在父合约中用 External 可见性说明符声明的函数不能被子合约访问。

语法

程序:在下面的程序中,我们对 internal 使用了相同的程序,并且用 external 修饰符标记了函数。 让我们看看输出。

输出

Function Visibility in Solidity

结果,它将返回一个错误,因为在父合约中用 External 可见性说明符声明的函数不能被子合约访问。

3. 函数可见性:Public

Public 函数是合约接口的一部分。 它们可以在内部或通过消息调用。 顾名思义,由于函数是 public 的,因此可以在以太坊区块链的外部调用它们。 它是 Solidity 中默认且灵活的可见性说明符。 当合约调用函数时,它使用跳转代码来访问该函数。

语法

程序:在下面的程序中,我们声明了一个智能合约 publicFunctionVisiblityExample1,以演示 solidity 中的 public 函数可见性概念。

输出

Function Visibility in Solidity

4. 函数可见性:Private

Private 函数只能在定义它们的智能合约中使用。 它们不能被子合约派生。 private 函数可以在智能合约中被更高说明符函数调用。

语法

程序:在下面的程序中,我们声明了两个智能合约,Parent 合约和 child 合约,以演示 solidity 中的 private 函数可见性概念。 它表明 private 函数只能在父合约中使用。

输出

Function Visibility in Solidity

Solidity 中的默认函数可见性范围

如果用户忘记显式声明函数的可见性范围,则 solidity 默认会自动将您的函数设置为 public 可见性。 但是,不建议跳过函数可见性并依赖 Solidity 编译器,因为这会降低代码的可读性并使其他用户更难阅读。 因此,要掌握 solidity 编程,请始终设置函数可见性,以使您的智能合约更易于理解,并在代码审查期间更容易。

函数和状态变量可见性修饰符之间的区别?

许多专业人士经常将函数可见性说明符和状态变量可见性修饰符混淆。 许多人认为两者是相同的。 但事实并非如此。 两者之间的主要区别在于函数可见性修饰符具有 external 可见性选项。 相比之下,状态变量没有 external 可见性修饰符选项。

状态变量的值永久存储在 Solidity 智能合约中。 因此,它保存了不同函数调用之间确定的变量数据。 与函数可见性修饰符不同,solidity 中的状态变量也提供从最容易访问到最不易访问的范围,即 public、external、internal 和 private。

结论

在本教程中,我们介绍了 Solidity 智能合约中有关函数可见性说明符的所有详细信息。 在 Solidity 中,函数可见性用于指定函数的访问级别。 开发人员可以根据他们的意图声明具有 public、external、internal 和 private 可见性范围的函数,以决定哪些其它智能合约可以调用父类函数以及哪些不能。

如果开发人员默认情况下未提及任何函数可见性范围,则 public 可见性范围将应用于您的 solidity 智能合约。 因此,建议在智能合约开发时指定函数的可见性。