为什么要特别介绍可视范围呢试想,假如我们的合约里有些非常重要的内容只能局限于合约内使用,此时就可以运用可视范围的技巧,将某些重要的功能、状态锁定在合约内使用,不随意开放给外部调用,避免污染内部,但有些又是共用的内容及功能时,我们就可以利用公开的可视范围让相同的功能能够重复使用。

合约中又可以依照不同的分责区分可视范围,在Solidity的世界中主要会分为两大类型的可视范围,分别是状态变数(State Variable)跟功能(Function)。

状态变数(State Variable)的可视范围

public

这种可视范围最为宽松,除了内部合约以外,继承与外部合约也都能够进行调用。

internal

除了自身的合约以外,继承的合约也能够调用,但外部合约是不可视的。

private

这种可视范围仅局限于自身的合约之中,不可被外部合约调用,包括继承的合约也是不可视的。

功能(Function)的可视范围

Function的部分比较特殊,扩增了external,这也是我们在传统的程式语言中比较少见的一种应用,以下就让我们来好好介绍这个部分。

external

仅外部的合约可以进行调用,内部以及继承的合约皆不可视,主要用意是当我们不确定这个功能是否内部也会调用时,可以宣告为external,一旦宣告为external之后,内部要调用就得使用this.xxx()才能调用,另外参数的部分是使用Calldata作为来源,会减少许多不必要的Copy。

public

可视范围就如同状态变数的public一样,除了内部合约以外,继承与外部合约也都能够进行调用。

internal

可视范围一样同状态变数的internal,除了自身的合约以外,继承的合约也能够调用,但外部合约是不可视的。

private

这种可视范围仅局限于自身的合约之中,不可被外部合约调用,包括继承的合约也是不可视的。

结语

以上是这次篇章介绍的可视范围用法,撰写一份安全的合约时,我们务必注意什么能开放,开放到什么程度,这些都与可视范围息息相关,后续维护时也较能明确的界定范围,不至于全部开放导致混乱,或者全部封闭导致一堆重复的内容。