智能合約的訪問權(quán)限共有 4 種類型:internal、public喂击、private 和 external
狀態(tài)變量默認(rèn)類型為internal
合約函數(shù)默認(rèn)類型為public
internal
internal聲明的函數(shù)和狀態(tài)變量只能通過內(nèi)部訪問庵楷。如在當(dāng)前合約中調(diào)用翎承,或繼承的合約里調(diào)用蛉鹿。需要注意的是不能加前綴this取劫,前綴this是表示通過外部方式訪問巷帝。
-
internal
類型的狀態(tài)變量可供外部和子合約調(diào)用忌卤。 -
internal
類型的函數(shù)和private類型的函數(shù)一樣,智能合約自己內(nèi)部調(diào)用楞泼,它和其他語言中的protected
不完全一樣驰徊。 - 子合約只能繼承父合約中的所有的
public
類型的函數(shù),可以對(duì)其進(jìn)行重寫堕阔,不能繼承internal
/private
的函數(shù). - 內(nèi)部(
internal
)函數(shù)只能在當(dāng)前合約內(nèi)被調(diào)用(在當(dāng)前的代碼塊內(nèi)棍厂,包括內(nèi)部庫函數(shù),和繼承的函數(shù)中)超陆,訪問函數(shù)直接用函數(shù)名func
牺弹。 - 外部(
external
)函數(shù)由地址和函數(shù)方法簽名兩部分組成,可作為外部函數(shù)調(diào)用的參數(shù)时呀,或返回值张漂,訪問函數(shù)用this.func
。
public
public 函數(shù)是合約接口的一部分谨娜,可以通過內(nèi)部或者消息來進(jìn)行調(diào)用航攒。對(duì)于 public 類型的狀態(tài)變量,會(huì)自動(dòng)創(chuàng)建一個(gè)訪問器趴梢。
- 當(dāng)一個(gè)狀態(tài)變量的權(quán)限為
public
類型時(shí)漠畜,它就會(huì)自動(dòng)生成一個(gè)可供外部調(diào)用的get函數(shù)
币他。 - 只有
public
類型的函數(shù)才可以供外部訪問。 - 狀態(tài)變量聲明時(shí)憔狞,默認(rèn)為
internal
類型蝴悉,只有顯示聲明為public
類型的狀態(tài)變量才會(huì)自動(dòng)生成一個(gè)和狀態(tài)變量同名的get函數(shù)
以供外部獲取當(dāng)前狀態(tài)變量的值。 - 函數(shù)聲明時(shí)默認(rèn)為
public
類型瘾敢,和顯式聲明為public類型的函數(shù)一樣辫封,都可供外部訪問
contract HelloWorld{
uint public _hello;
}
實(shí)際上編譯的時(shí)候會(huì)生成一個(gè)默認(rèn)函數(shù)
contract HelloWorld{
uint public _hello;
function _hello() public view returns(uint){
return _hello();
}
}
private
private 函數(shù)和狀態(tài)變量僅在當(dāng)前合約中可以訪問,在繼承的合約內(nèi)不可訪問廉丽。
external
僅外部訪問(在內(nèi)部也只能用外部訪問方式訪問);
外部(external)函數(shù)是合約接口的一部分,這意味著它們可以從其他合約調(diào)用, 也可以通過事務(wù)調(diào)用妻味。
外部(external)函數(shù)func不能被內(nèi)部調(diào)用(即func()不執(zhí)行,但this.func()執(zhí)行)正压。
外部(external)函數(shù),當(dāng)他們接收大數(shù)組時(shí)责球,更有效焦履。