1. 程式人生 > >初步接觸智能合約solidity編譯的坑

初步接觸智能合約solidity編譯的坑

pri cross 可見性 出錯 extern spa source eva public

在Linux環境下入門寫一段solidity編譯遇到error和warning,經過一番研究後才得其緣由,下面以一段demo總結一下。

pragma solidity ^0.5.2;        // 指定所需的編譯器版本

contract clac{                 
        function multiply(uint a, uint b) returns (uint){
                return a + b;
        }
}

看似很正常的一段兩數相加代碼,可惜編譯出錯:

出現了一段error和一段warning

$ solc --bin testContract.sol

testContract.sol:
3:2: Error: No visibility specified. Did you intend to add "public"? function multiply(uint a, uint b) returns (uint) ^ (Relevant source part starts here and spans across multiple lines). testContract.sol:5:9: Warning: Function state mutability can be restricted to pure function multiply(uint
a, uint b) public returns (uint) { ^ (Relevant source part starts here and spans across multiple lines).

原因是public聲明和puer沒有處理好。

public聲明

No visibility specified. Defaulting to “public”。 -> 未指定可見性,采用默認public可見範圍。

  • public:智能合約外部和內部都可使用的方法;
  • internal:智能合約(包括派生合約)內部可用調用的方法;
  • external:可通過其他合約和交易進行調用的方法;
  • private:只有在定義的合約中才可以調用,即使派生的合約也無法調用;

錯誤在於提醒開發者,你未指定當前function的可見範圍,合約會默認采用public,有一定的風險存在。特別針對一些不可對外公開訪問的智能合約,需要註意此提示。消除此警告的方法只需在方法中添加public聲明即可。修改之後的代碼如下:

pragma solidity ^0.5.2;        // 指定所需的編譯器版本

contract clac{                 
        function multiply(uint a, uint b) public returns (uint){
                return a + b;
        }
}

pure限制詞

Function state mutability can be restricted to pure。 -> 功能狀態可變性可以限制為pure

在之前的版本中我們經常使用constant來限制一個方法的制度性,當用constant修飾之後,此方法在被調用時不會進行存儲的變更,同樣不會產生交易和gas花費。而pure正是constant的替代品,逐漸的在替代constant的功能。

修改後代碼如下:

pragma solidity ^0.5.2;        // 指定所需的編譯器版本

contract clac{                 
        function multiply(uint a, uint b) public pure returns (uint){
                return a + b;
        }
}

初步接觸智能合約solidity編譯的坑