前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Solidity编译警告的解决之道

Solidity编译警告的解决之道

作者头像
程序新视界
发布2022-05-09 18:27:03
3980
发布2022-05-09 18:27:03
举报
文章被收录于专栏:丑胖侠

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

前言

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

实例

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

代码语言:javascript
复制
pragma solidity ^0.4.0;

contract HelloWarning{

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

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

代码语言:javascript
复制
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).
代码语言:javascript
复制
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声明即可。修改之后的代码如下:

代码语言:javascript
复制
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的功能。关注微信公众号“程序新视界”,后面会针对此块进行详细讲解。

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

代码语言:javascript
复制
pragma solidity ^0.4.0;

contract HelloWarning{

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

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

小结

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

原文链接:https://www.choupangxia.com/topic/detail/25

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 实例
  • public声明
  • pure
  • 小结
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档