原创 标题:  Solidity编译警告的解决之道

网络上很多教程(图文或视频)在讲解Solidity语法实例的时候往往都将编译过程中的警告信息忽略。本篇文章用两个实例带大家清除这些警告信息。

前言

无论在学习Truffle框架的使用和Remix IDE的过程中网上的教程都会用到HelloWorld这个实例来带领大家入门。但如果对代码稍微有一些洁癖的程序员会发现,当自己跟着教程练习时在编译的过程中会出现一些警告信息。而这些警告信息,有的教程简单提示暂时忽略,有些教程直接无视。本篇文章带大家解决两个常见的警告信息。

实例

我们采用Remix来编写一个简单的HelloWarning智能合约。具体代码如下:

pragma solidity ^0.4.0;

contract HelloWarning{

    function hello() returns (string){
        return "Hello Warning!";
    }
}

就是这么简单的一段代码,如果在Remix中进行编译时会出现两个警告信息:

browser/HelloWarning.sol:5:5: Warning: No visibility specified. Defaulting to "public". 
    function hello() returns (string){
    ^ (Relevant source part starts here and spans across multiple lines).
browser/HelloWarning.sol:5:5: Warning: Function state mutability can be restricted to pure
    function hello() returns (string){
    ^ (Relevant source part starts here and spans across multiple lines).

下面就分析一下这两个警告信息的原因及解决方法。

public声明

第一个警告“No visibility specified. Defaulting to “public”。”,字面直译为:未指定可见性,采用默认public可见范围。

这个警告是提醒开发者,你未指定当前function的可见范围,合约会默认采用public,有一定的风险存在。特别针对一些不可对外公开访问的智能合约,需要注意此提示。

消除此警告的方法很简单,只需在方法中添加public声明即可。修改之后的代码如下:

pragma solidity ^0.4.0;

contract HelloWarning{

    function hello() public returns (string){
        return "Hello Warning!";
    }
}

此时,再执行编译操作,刚才针对public的警告信息已经不存在了。借此,再延伸一下智能合约方法的4类可见性指定:

  • public:智能合约外部和内部都可使用的方法;
  • internal:智能合约(包括派生合约)内部可用调用的方法;
  • external:可通过其他合约和交易进行调用的方法;
  • private:只有在定义的合约中才可以调用,即使派生的合约也无法调用;

pure

首先将第二个警告内容直译之后为:功能状态可变性可以限制为pure。这里就引出了pure限制词。在之前的版本中我们经常使用constant来限制一个方法的制度性,当用constant修饰之后,此方法在被调用时不会进行存储的变更,同样不会产生交易和gas花费。而pure正是constant的替代品,逐渐的在替代constant的功能。关注微信公众号“程序新视界”,后面会针对此块进行详细讲解。

当知道了原因之后,解决方法就变得简单,经过再次改进之后的代码为:

pragma solidity ^0.4.0;

contract HelloWarning{

    function hello() public pure returns (string){
        return "Hello Warning!";
    }
}

再次编译一下试试看,对应的警告信息是不是已经不存在了?

小结

对于真正有编程洁癖的人不仅仅是代码格式上是否该空行的地方没空行那么简单,而是需要更深入层次的研究每一个异常,每一个警告,甚至每一行代码的底层实现。只有这样,编程的洁癖才会让自己的造诣更上一个层次。

END
朱智胜的个人博客-微信公众号