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/external
和public/private
在功能方面有什么区别(如果有的话)?
【问题讨论】:
您的问题可能更适合另一个 StackExchange 站点。有关区块链、比特币和其他加密货币的问题,请转至Bitcoin StackExchange。对于以太坊特定的问题,请转至Ethereum StackExchange。 :) 【参考方案1】:• 外部:这些功能可从其他合约和交易中访问。除非使用 this
关键字,否则它们不能在内部调用。在外部呼叫期间您需要小心,因为它们可以
涉及遇到安全风险、损失gas和抛出错误。
• 公共:默认情况下,函数是公共的。它们可以在内部调用,也可以通过消息调用。
• 内部:可以在智能合约和派生的智能合约中访问。对于状态变量,只有两种可见性类型:public
和 internal
。默认为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 中的内部/外部和公共/私人功能有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章