智能合约的访问权限共有 4 种类型:internal、public、private 和 external
状态变量默认类型为internal
合约函数默认类型为public
internal
internal声明的函数和状态变量只能通过内部访问。如在当前合约中调用,或继承的合约里调用。需要注意的是不能加前缀this,前缀this是表示通过外部方式访问。
-
internal
类型的状态变量可供外部和子合约调用。 -
internal
类型的函数和private类型的函数一样,智能合约自己内部调用,它和其他语言中的protected
不完全一样。 - 子合约只能继承父合约中的所有的
public
类型的函数,可以对其进行重写,不能继承internal
/private
的函数. - 内部(
internal
)函数只能在当前合约内被调用(在当前的代码块内,包括内部库函数,和继承的函数中),访问函数直接用函数名func
。 - 外部(
external
)函数由地址和函数方法签名两部分组成,可作为外部函数调用的参数,或返回值,访问函数用this.func
。
public
public 函数是合约接口的一部分,可以通过内部或者消息来进行调用。对于 public 类型的状态变量,会自动创建一个访问器。
- 当一个状态变量的权限为
public
类型时,它就会自动生成一个可供外部调用的get函数
。 - 只有
public
类型的函数才可以供外部访问。 - 状态变量声明时,默认为
internal
类型,只有显示声明为public
类型的状态变量才会自动生成一个和状态变量同名的get函数
以供外部获取当前状态变量的值。 - 函数声明时默认为
public
类型,和显式声明为public类型的函数一样,都可供外部访问
contract HelloWorld{
uint public _hello;
}
实际上编译的时候会生成一个默认函数
contract HelloWorld{
uint public _hello;
function _hello() public view returns(uint){
return _hello();
}
}
private
private 函数和状态变量仅在当前合约中可以访问,在继承的合约内不可访问。
external
仅外部访问(在内部也只能用外部访问方式访问);
外部(external)函数是合约接口的一部分,这意味着它们可以从其他合约调用, 也可以通过事务调用。
外部(external)函数func不能被内部调用(即func()不执行,但this.func()执行)。
外部(external)函数,当他们接收大数组时,更有效。