2022-02-05|閱讀時間 ‧ 約 4 分鐘

智能合約開發實戰(五) - Function visibility

這篇我們來談談有關Solidity Function visibility(能見度)
Solidity的function visibility有四個關鍵字(privateinternalexternalpublic)。
可以這樣理解:
  1. private私有的:只有在同一個contract內才能引用,繼承的也無法使用。
  2. internal內部的:同一個contract內可以使用,包含繼承的。
  3. external外部的:同一個contract內都不可使用,繼承的也不行,只能由第三方的contract才能調用。
  4. public公開的:開放的,上面的都可以調用。
上面這樣說好像還是很難懂,那我們就用實際的例子來做說明吧,不然怎麼叫實戰。
1.private和internal
正確應該是要把test1改成private -internal ,這樣就會正確了,由於private只能同一個contract內才能調用,所以會報錯,改為internal就能給繼承的合約所調用了。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract TestContract {
  uint private _int1;
  //初始化
  constructor() {
  }
  
  function test1() internal view returns(uint) {
    return _int1;
  }
}

contract TestContract2 is TestContract {
  //初始化
  constructor() {
  }

  function test2() private view returns(uint) {
    return test1();
  }
}
2.external,只能外部調用
當function設為external時,function就只能第三方的contract才能調用,內部或是繼承的都不能夠調用,這是比較特別的。
3.public,public的部份我就不用再多說了,就是內調或是外調都能夠使用,算是一個全公開的function了。
最多人感到困惑的是,有public又有external,那什麼時候該用哪一個呢?為什麼有public可以用還需要external呢?我就直接都用public就好了呀,那是因為public是可以使用內調的,但external不行,在區塊鏈上,當有使用到內存,相對的gas fee就會比較高,使用external會省一半的gas fee,所以如果所使用的function不需要內調的話,用external是個比較好的選擇,畢竟乙太坊的gas fee可是很貴的,一個好的程式設計師,這點也是要考慮到的。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享,謝謝。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
分享至
成為作者繼續創作的動力吧!
有著十年以上的軟體開發經驗,喜歡投資理財,目前喜歡研究區塊鏈相關,了解虛擬貨幣投資或者是區塊鏈開發,喜歡把複雜的東西簡單化,樂於分享我的理財投資生活。
© 2024 vocus All rights reserved.