在 Solidity 中,我们有四种访问类型。其中两个是
private
和internal
。
如果两者都可以在智能合约中使用并且部署后都不可见,有什么区别?
访问类型:
public
- 可以在部署合约时使用,可以在继承合约中使用
external
可以在部署合约时使用,不能在继承合约中使用
internal
- 部署合约时不能使用,可以在继承合约中使用
private
- 部署合约时不能使用,不能在继承合约中使用
internal
可以从子合约访问属性(但不能从外部合约访问)。
private
即使从子合约也无法访问属性。
pragma solidity ^0.8;
contract Parent {
bool internal internalProperty;
bool private privateProperty;
}
contract Child is Parent {
function foo() external {
// ok
internalProperty = true;
// error, not visible
privateProperty = true;
}
}
您可以在文档部分可见性和 Getters 中找到更多信息。
public
:任何人都可以访问该功能private
:只有这个智能合约才能调用这个函数internal
:只有本智能合约以及继承它的智能合约才能调用该函数external
:任何人都可以访问此功能,除非这个智能合约请注意,
external
使用的 Gas 量比 public
少,因此,如果您的合约未使用该功能,则优先选择 external
而不是 public
。
虽然这里有彻底的答案,但我认为我们可以对这些关键字采取的另一种方法是:
internal
或 external
提到了区块链看待功能的方式,例如合同本身内部,合同外部(外部且仅外部)。private
或 public
提到 OOP 中的继承概念如何可靠地工作。祝大家好运。