Solidity提供了四種可見性 . 分別是external,public,internal,private . 其中函數(shù)默認(rèn)是public . 狀態(tài)變量默認(rèn)的可見性是internal .
function () { public| private | internal | external } [ pure | constant | view | payable ] [ returns () ]
一 . 可見性
1 . public
使函數(shù)和狀態(tài)變量 , 在當(dāng)前合約內(nèi)和被繼承的合約內(nèi)都可以訪問 . 并且使函數(shù)和狀態(tài)變量成為合約對(duì)外接口.
2 . private
使函數(shù)和狀態(tài)變量 , 僅在當(dāng)前合約內(nèi)可以訪問 . 在繼承的合約內(nèi)不可訪問 .
3 . external
外部函數(shù)是合約接口的一部分 , 所以我們可以從其它合約或通過交易來發(fā)起調(diào)用 . 一個(gè)外部函數(shù)f , 不能通過內(nèi)部的方式來發(fā)起調(diào)用 , (如f()不可以膝昆,但可以通過this.f()) . 外部函數(shù)在接收大的數(shù)組數(shù)據(jù)時(shí)更加有效。
4 . internal
這樣聲明的函數(shù)和狀態(tài)變量只能通過內(nèi)部(internal)訪問 . 如在當(dāng)前合約中調(diào)用 , 或繼承的合約里調(diào)用 . 需要注意的是不能加前綴this , 前綴this是表示通過外部(external)方式訪問 .
二 . 修飾符
1 . pure
函數(shù)指定view,代表函數(shù)不能讀取或修改區(qū)塊鏈狀態(tài) .
下列操作被認(rèn)為是讀取區(qū)塊鏈狀態(tài) :
獲取狀態(tài)變量 .
訪問this.balance或.balance .
訪問任何block , tx , msg的成員 . (除了msg.sig和msg.data以外)?
調(diào)用任何未標(biāo)記為pure的函數(shù) .
使用包含特定操作碼的內(nèi)聯(lián)程序集 .
2 . view
函數(shù)指定view,代表函數(shù)可以讀取區(qū)塊鏈狀態(tài) , 但不能修改區(qū)塊鏈的狀態(tài).
下列操作被認(rèn)為是修改區(qū)塊鏈狀態(tài) :
狀態(tài)變量賦值 .
觸發(fā)事件 .
創(chuàng)建其他合同 .
使用selfdestruct .
通過調(diào)用發(fā)送Ether .
調(diào)用任何未標(biāo)記的view或pure的函數(shù) .
使用低級(jí)調(diào)用 .
使用包含特定操作碼的內(nèi)聯(lián)程序集 .
3 . constant
函數(shù)指定constant , 與指定view是一個(gè)意思 . constant 被稱為view的別名.
狀態(tài)變量被指定constant ,代表它必須在編譯時(shí)被賦值 .
4 . payable
函數(shù)指定了payable才能拿獲取msg.value , 接收以太幣 .
三 . 自定義修飾符
modifier可以用來輕易的改變一個(gè)函數(shù)的行為.可被繼承千劈,同時(shí)還可被派生的合約重寫(override)
腦洞自制實(shí)例, 僅供娛樂:?
pragma solidity ^0.4.21;
contract OneNightInSupermarket{
? ? address admin; // 管理員
? ? uint minimumCharge; // 最低消費(fèi)標(biāo)準(zhǔn)
? ? function OneNightInSupermarket(uint _initialMinimum)public{
? ? ? ? admin= msg.sender;
? ? ? ? minimumCharge= _initialMinimum;
? ? }
? ? // 發(fā)送交易的是管理員嗎?
? ? modifier AdminIsSender {
? ? ? ? require(admin==msg.sender);
? ? ? ? _;
? ? }
? ? // 消費(fèi)是否高于最低消費(fèi)
? ? modifier MinimumCharge(uint _price){
? ? ? ? require(msg.value >= _price);
? ? ? ? _;
? ? }
? ? // 誰是管理員
? ? function IamAdmin() public view AdminIsSender returns(address) {
? ? ? ? return msg.sender;
? ? }
? ? // 普通用戶消費(fèi),有最低消費(fèi)標(biāo)準(zhǔn)
? ? function AverageConsumption() public payable AdminIsSender MinimumCharge(minimumCharge) returns(uint,uint) {
? ? ? ? return (msg.value, minimumCharge);
? ? }
? ? // 管理員隨便花,沒有最低消費(fèi)標(biāo)準(zhǔn)
? ? function AdminConsumption() public payable AdminIsSender returns(uint) {
? ? ? ? return msg.value;
? ? }
}