初步接觸智能合約solidity編譯的坑
阿新 • • 發佈:2019-04-01
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(uinta, 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編譯的坑