Solidity 中的内部/外部和公共/私人功能有啥区别?

Posted

技术标签:

【中文标题】Solidity 中的内部/外部和公共/私人功能有啥区别?【英文标题】:What is the difference between an internal/external and public/private function in solidity?Solidity 中的内部/外部和公共/私人功能有什么区别? 【发布时间】:2018-05-17 06:19:19 【问题描述】:

目前正在阅读 Solidity 文档: https://solidity.readthedocs.io/en/develop/types.html#function-types

默认情况下,函数类型是内部的,所以 internal 关键字可以 被省略。相反,合约函数本身是公开的 默认,仅当用作类型的名称时,默认为 内部。

这对我来说没有意义。一个函数如何同时是内部的和公共的?

我知道internal 表示函数只能在合约内调用,external 可以在合约外调用。所以对我来说,内部是私有的,外部是公开的,但文档听起来像是它可以同时是公开的和内部的?

那么internal/externalpublic/private 在功能方面有什么区别(如果有的话)?

【问题讨论】:

您的问题可能更适合另一个 StackExchange 站点。有关区块链、比特币和其他加密货币的问题,请转至Bitcoin StackExchange。对于以太坊特定的问题,请转至Ethereum StackExchange。 :) 【参考方案1】:

• 外部:这些功能可从其他合约和交易中访问。除非使用 this 关键字,否则它们不能在内部调用。在外部呼叫期间您需要小心,因为它们可以 涉及遇到安全风险、损失gas和抛出错误。

• 公共:默认情况下,函数是公共的。它们可以在内部调用,也可以通过消息调用。

• 内部:可以在智能合约和派生的智能合约中访问。对于状态变量,只有两种可见性类型:publicinternal。默认为internal

• 私有:私有函数仅对声明它们的同一合约可见。它更严格。除非需要,否则请使用最低限度的可见性来保护您的代码免受外部攻击。私有可见性只会阻止其他 从访问或修改驻留在驻留在信息的合同 合同,但它仍然在现场公众中为全世界可见 区块链。

【讨论】:

【参考方案2】:

以下是四个关键字的区别:

private 表示只能从合约内的其他函数调用

internal 类似于私有,但也可以被从当前继承的合约调用

external只能在合约外调用

public 可以在任何地方调用,无论是内部还是外部。

【讨论】:

【参考方案3】:

在 Solidity 的术语中,internal/external 也用作描述“两种函数调用”,而不仅仅是作为访问修饰符。

Take a look at the documentation section about 'Visibility and Getters' inside the contracts.

由于 Solidity 知道两种函数调用(不创建实际 EVM 调用(也称为“消息调用”)的内部函数调用和创建实际 EVM 调用的外部函数调用),因此函数和状态变量有四种类型的可见性。

【讨论】:

以上是关于Solidity 中的内部/外部和公共/私人功能有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Solidity - 为啥公共 Struct 变量的默认 getter 不会返回 Struct 中的每个变量

如何使用外部IP NAT启动JBoss AS

请问公共仓库和私人仓库有啥不同?

github设置仓库可见性 私人仓库设置他人协作/可见

jwt上的私人和公共索赔有啥区别

无法访问 DLL 外部的内部类和某些公共变量不可访问