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!";
    }
}

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

小结

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

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

更多资讯

**获取更多资讯,请关注微信公众号:程序新视界。或加入QQ技术交流群:659809063。个人博客:www.choupangxia.com,区块链相关gitchat课程:http://gitbook.cn/gitchat/column/5ad98d9479e8c577efc7557d

QQ技术交流群:
这里写图片描述

获得一对一技术咨询请扫码加入知识星球(小密圈)
这里写图片描述

### 回答1: solidity的bytecode是经过编译生成的字节码,其包含了合约的二进制代码和一些元数据。如果你已经拥有了bytecode,那么你可以使用solidity的官方工具solc将bytecode转换成abi。在命令行运行以下命令即可: ``` solc --abi <your_contract_bytecode> ``` 在这里,`<your_contract_bytecode>`是你的合约字节码。执行上述命令后,会生成一个JSON格式的abi文件,其包含了你的合约的函数名、参数类型、返回类型等信息。 ### 回答2: 在Solidity,字节码(bytecode)是由智能合约代码编译生成的机器码指令序列,而ABI(Application Binary Interface)是用于与合约进行交互的接口描述。反编译字节码以获取ABI的过程如下所示: 1. 使用Solidity编译器(solc)将Solidity代码编译为字节码。这可以通过命令行工具(solc)或使用Solidity插件进行。 2. 获取编译后的字节码(bytecode)。一般来说,编译器会生成合约的部署字节码和运行时字节码。部署字节码用于在区块链上创建新的合约实例,而运行时字节码用于执行合约的方法。 3. 使用反编译工具将字节码反编译为汇编代码。有几种工具可以实现这一步骤,如Etherscan的工具,它可以将部署字节码和运行时字节码转换为可读的汇编代码。 4. 根据反编译的汇编代码推导出ABI。反编译的汇编代码将显示每个函数的入口点和参数类型等信息。根据这些信息,可以手动创建ABI,或使用相关工具从汇编代码提取并自动生成ABI。 需要注意的是,由于编译器的优化等因素,反编译得到的汇编代码可能不完全准确,某些信息(如内部函数、变量名)可能会丢失。因此,在实际应用,最好使用在编译阶段生成的ABI,而不是依赖于反编译出来的版本。 ### 回答3: 要反编译 Solidity 的字节码(bytecode)以获取 ABI(应用程序二进制接口),我们可以使用一些工具和步骤: 1. 使用 Solidity 编译器将智能合约代码编译为字节码。例如,使用 solc 命令行工具:`solc --bin <contract_filename.sol>`。这将生成合约的字节码文件。 2. 将字节码转换为可读格式。字节码通常是以十六进制表示的。我们可以使用 Solidity 的库函数来将其转换为可读的格式。在 Solidity 使用以下函数:`bytes memory bytecode = hex"字节码"`。 3. 使用反编译工具将字节码转换为 ABI。目前,有一些可用的工具可以帮助我们将 Solidity 字节码转换为 ABI。 - Solidity Assembly 是一种受到 EVM 指令集影响的低级语言。您可以使用 Solidity Assembly 编写代码并将其转换为 ABI。示例代码如下: ``` pragma solidity ^0.8.0; contract BytecodeParser { function getABI(bytes memory _bytecode) public pure returns (string[] memory) { assembly { let ptr := add(_bytecode, 0x20) let length := mload(_bytecode) let result := mload(0x40) // allocate memory for the ABI mstore(result, 0x20) // set length of the array to 1 mstore(add(result, 0x20), length) // store the length of the bytecode as the first element mstore(add(result, 0x40), ptr) // store the bytecode as the second element return(result, 0x60) } } } ``` - Mythril 是一个开源的智能合约扫描工具,也可以用于反编译 Solidity 字节码。安装 Mythril 并使用以下命令:`myth -x <Bytecode_File_Path>`。 - Remix IDE 是一个具有反编译功能的 Solidity 开发环境。在 Remix IDE ,您可以上传字节码文件并选择反编译功能以获取 ABI。 请注意,由于 Solidity 字节码是通过编译过程的优化生成的,所以在某些情况下,反编译出的 ABI 可能不完全准确。因此,在实际使用过程,最好通过查看合约的源代码来获取准确的 ABI。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序新视界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值