市值: $2.1591T 2.61%
成交额(24h): $74.6886B -50.71%
恐惧与贪婪指数:

13 - 极度恐惧

  • 市值: $2.1591T 2.61%
  • 成交额(24h): $74.6886B -50.71%
  • 恐惧与贪婪指数:
  • 市值: $2.1591T 2.61%
加密货币
话题
百科
资讯
加密话题
视频
热门加密百科

选择语种

选择语种

选择货币

加密货币
话题
百科
资讯
加密话题
视频

Solidity 中的公共函数、私有函数、内部函数和外部函数有什么区别?

Solidity's function visibility specifiers—public, private, internal, and external—control access to functions, impacting security, inheritance, and gas costs in smart contracts.

2025/11/20 22:39

了解 Solidity 中的函数可见性

Solidity 是以太坊智能合约的主要编程语言,通过函数可见性说明符强制执行严格的访问控制。这些说明符决定谁可以调用函数——无论是来自合约内部、派生合约还是外部。四种类型——公共、私有、内部和外部——定义了可访问性的范围,并在保护合约逻辑方面发挥着至关重要的作用。

公共职能

1. 公共函数可以从任何地方访问——合约内部、派生合约以及通过交易或调用外部。

2. 当一个函数被标记为public时,如果它是一个状态变量或者允许通过合约接口直接调用,Solidity会自动生成一个getter函数。

3. 这些函数成为合约 ABI(应用程序二进制接口)的一部分,使其可由钱包、dApp 和其他智能合约调用。

4. 由于外部调用开销和数据编码要求,公共功能的 Gas 成本可能会更高。

5. 常见用例包括面向用户的功能,例如 ERC-20 合约中的代币转移或余额检查。

私人职能

1. 私有函数只能在同一个合约内调用,派生合约或外部实体完全无法访问。

2. 它们非常适合封装不应公开或覆盖的敏感逻辑。

3. 由于私有函数不是外部接口的一部分,因此不会出现在 ABI 中。

4. 开发人员经常将它们用于支持公共或内部操作的内部验证、散列或清理例程。

5. 尽管是私有的,但他们的代码在链上仍然可见;隐私仅指执行访问,而不是源隐藏。

内部功能

1. 内部函数可以在定义合约和继承它的任何合约中访问。

2. 它们不能被外部账户或不相关的合约直接调用,即使通过基于地址的交互也是如此。

3. 继承层次结构严重依赖内部函数来共享可重用逻辑,而无需将其公开。

4. 与私有函数一样,它们不会对合约的外部 ABI 做出贡献。

5. 示例包括 OpenZeppelin 的 SafeMath 库中的实用程序函数或跨多个方法强制执行前提条件的修饰符。

外部函数

1. 外部函数只能从合约外部调用——要么通过另一个合约,要么通过 EOA(外部拥有账户)。

2. 即使合约本身也必须使用this.functionName()语法来调用自己的外部函数,这会产生消息调用开销。

3. 当您想要确保函数永远不会在内部执行时,这种可见性非常有用,从而促进模块化并减少gas滥用。

4. 外部函数包含在 ABI 中,可以通过交易或合约到合约调用来调用。

5. 它们通常用于大数据输入,因为 calldata(由外部函数使用)避免了与内部调用相关的内存复制成本。

常见问题解答

可以在派生合约中重写私有函数吗?不可以,私有函数不能被派生合约访问或覆盖。使用 virtual 和 override 关键字只能覆盖内部和公共函数。

如果我不指定可见性修饰符会发生什么?如果未指定可见性,Solidity 默认为函数的公开。对于状态变量,默认为内部变量。出于安全性和清晰度的原因,不鼓励依赖默认值。

内部函数调用和外部函数调用之间是否存在性能差异?是的。内部调用在相同的合约上下文中执行并使用最少的gas。外部调用,即使是自引用,也需要消息调用,由于堆栈隔离和 ABI 编码而增加了 Gas 消耗。

外部函数可以修改状态变量吗?是的,外部函数可以修改状态变量,除非受到 view 或 pure 等其他修饰符的限制。他们改变存储的能力取决于逻辑,而不是可见性。

免责声明:info@kdj.com

所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!

如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。

相关百科

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

2026-06-06 02:54:55

合同结算机制1. Bybit的线性永续合约以USDT结算,这意味着所有盈亏计算、保证金要求和清算门槛均以稳定币单位计价。 2.反向永续合约以BTC本身结算,因此每笔交易都会直接影响交易者的BTC余额——收益会增加BTC持有量,而损失会减少BTC持有量。 3. 反向合约的定价引擎使用 BTC/USDT...

如何识别和避免止损、欺骗等期货市场操纵行为?

如何识别和避免止损、欺骗等期货市场操纵行为?

2026-06-07 14:20:10

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

2026-06-04 16:40:15

账户级损失限额配置1. 使用双因素身份验证通过网络或移动应用程序登录您的 Bybit 帐户。 2. 导航至“资产”部分,然后从左侧菜单中选择“风险管理”。 3. 选择“每日损失限制”并将该功能切换为“开”以激活控制。 4. 输入代表当前交易日 USDT 最大允许净亏损的数值。 5. 使用您的电子邮件...

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

2026-06-05 04:59:43

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少每个区块新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将使其达到 3.1...

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

2026-06-04 03:59:47

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何处理美国加密货币期货交易利润的税务影响?

如何处理美国加密货币期货交易利润的税务影响?

2026-05-29 18:19:59

Bitcoin 减半机制1. Bitcoin 的协议强制规定 2100 万枚代币的固定供应上限,并通过区块奖励引入新单位。 2. 每 210,000 个区块(大约每四年)区块奖励就会减少一半,这个过程称为减半。 3. 最近一次减半发生在 2024 年 4 月,每个区块的奖励从 6.25 BTC 减少...

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

2026-06-06 02:54:55

合同结算机制1. Bybit的线性永续合约以USDT结算,这意味着所有盈亏计算、保证金要求和清算门槛均以稳定币单位计价。 2.反向永续合约以BTC本身结算,因此每笔交易都会直接影响交易者的BTC余额——收益会增加BTC持有量,而损失会减少BTC持有量。 3. 反向合约的定价引擎使用 BTC/USDT...

如何识别和避免止损、欺骗等期货市场操纵行为?

如何识别和避免止损、欺骗等期货市场操纵行为?

2026-06-07 14:20:10

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

2026-06-04 16:40:15

账户级损失限额配置1. 使用双因素身份验证通过网络或移动应用程序登录您的 Bybit 帐户。 2. 导航至“资产”部分,然后从左侧菜单中选择“风险管理”。 3. 选择“每日损失限制”并将该功能切换为“开”以激活控制。 4. 输入代表当前交易日 USDT 最大允许净亏损的数值。 5. 使用您的电子邮件...

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

2026-06-05 04:59:43

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少每个区块新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将使其达到 3.1...

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

2026-06-04 03:59:47

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何处理美国加密货币期货交易利润的税务影响?

如何处理美国加密货币期货交易利润的税务影响?

2026-05-29 18:19:59

Bitcoin 减半机制1. Bitcoin 的协议强制规定 2100 万枚代币的固定供应上限,并通过区块奖励引入新单位。 2. 每 210,000 个区块(大约每四年)区块奖励就会减少一半,这个过程称为减半。 3. 最近一次减半发生在 2024 年 4 月,每个区块的奖励从 6.25 BTC 减少...

查看所有文章

User not found or password invalid

Your input is correct