solidity(solc)智能合约升级到0.5*遇到的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solidity(solc)智能合约升级到0.5*遇到的问题相关的知识,希望对你有一定的参考价值。

参考技术A Functions are not allowed to have the same name as the contract. If you intend this to be a constructor, use "constructor(...) ... " to define it

函数名与合约名称不能重复,如果构造函数的话用以下方式:

function Token(uint256 initialSupply) ==> constructor(uint256 initialSupply)

No visibility specified. Defaulting to "public"

定义函数必须加上public关键字,例如:

function newFunder(address to) returns (uint)

==>

function newFunder(address to) public returns (uint)

Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning

定义指针需要加关键字storage,例如:

Funder f = funders[_u]; ==> Funder storage f = funders[_u];

Data location must be "memory" for parameter in function, but none was given

函数中的数据位置必须是"memory",例如:

function receiveApproval(address _from, bytes _extraData) public;

==>

function receiveApproval(address _from, bytes memory _extraData) public;

Data location can only be specified for array, struct or mapping types, but "memory" was given

array, struct or mapping类型的参数不需要加memory

Invalid type for argument in function call. Invalid implicit conversion from contract TokenERC20 to address requested

使用address(this)替代this,例如:

receiveApproval(msg.sender, _value, this, _extraData);

===>

receiveApproval(msg.sender, _value, address(this), _extraData);

"msg.gas" has been deprecated in favor of "gasleft()" uint public _gas = msg.gas;

msg.gas已经被gasleft()替换了,例如:

uint public _gas ==> gasleft()

"throw" is deprecated in favour of "revert()", "require()" and "assert()". throw

thorw已经不支持了,需要使用require,例如:

if(_to != 0x0) throw ; ==> require(_to != address(0x0))

Event invocations have to be prefixed by "emit"

调用事件需要在前面加上emit关键字,例如:

Burn(msg.sender, _value)==>emit Burn(msg.sender, _value)

Operator != not compatible with types address and int_const 0

地址变量不能和0x0进行比较,需要改为address(0x0),例如:

require(_to != 0x0) ==> require(_to != address(0x0))

Member "transfer" not found or not visible after argument-dependent lookup in address

solidity 0.5,address地址类型细分为 address和 address payable,只有 address payable可以使用 transfer(), send()函数,例如:

address public owner ==> address payable public owner

Functions in interfaces must be declared external

接口必须定义为外部函数(回退函数(fallback function)同理),例如:

interface tokenRecipient function receiveApproval(address _from, bytes _extraData) public;

==>

interface tokenRecipient function receiveApproval(address _from, bytes _extraData) external;

Data location must be "calldata" for parameter in external function, but none was given

外部函数中的数据位置必须是"calldata",例如:

interface tokenRecipient function receiveApproval(address _from, bytes _extraData) external;

==>

interface tokenRecipient function receiveApproval(address _from, bytes calldata _extraData) external;

智能合约从入门到精通:用Solidity开发一个“Hello World”

简介:上一章中我们聊到了智能合约的应用场景,在了解区块链技术目前的发展情况、智能合约的概念以及其应用场景之后,我们将在后续的文章中共同学习智能合约的编成语言。今天,我们就来简单地谈一谈用于编写智能合约的语言——Solidity语言。

 

那么,什么是Solidity语言呢?在前面的文章中我们反复提到过以太坊,以太坊区块链2.0典型代表,Solidity以太坊中撰写智能合约最受欢迎的语言,因此今天我们大家介绍一下这个作为智能合约开发中最主流的语言

 

Solidity是运行Ethereum虚拟机(EVM)上的一种智能合约高级语言。的语法Javascript相似,是一种面向对象的语言。但作为一种真正意义网络上运行中的去中心合约,它又有各种各样的特别之处,以下我们列举了其中的一部分,以便大家能够更直观地去理解Solidity语言的特点。

 

1. Solidity语言中,以太坊底层构造是基于帐户而非UTXO的,所以有一个特殊的Address的类型用于用户、合约以及合约代码的定位合约本身也是一个帐户)。

 

2. Solidity语言具备语言内嵌框架支持支付的特点提供了一系列诸如payable的关键字,可以在语言层面直接进行支付,在运用上快捷简便

 

3. 存储。Solidity语言的存储使用的是网络上现有的区块链,数据的每一个阶段、状态都可以得到永久存储,所以需要明确变量使用内存还是区块链。

 

4. 关于Solidity的运行环境,其运行环境建立在去中心化的网络上,强调的是合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络节点的代码执行,有着分布式的特点

 

5.最后Solidity语言有着一个十分特殊的异常处理机制。在过程中一旦出现任何异常,所有的执行都将会被强制回撤,这一机制有效避免中间状态突然出现数据不一致的情况,从而保证合约执行的原子性

 

Hello World作为在《The C Programme Language》中使用的第一个演示程序,在编程的世界里听起来也许非常高端但实际上想要上手玩转其实非常地简单:

 

pragma solidity ^0.4.0;

contract HelloWorld{

    uint balance;

    function update(uint amount) returns (address, uint){

        balance += amount;

        return (msg.sender, balance);

    }

}

 

如上所示,通过读取参数输入的新值,并将累加至合约的变量中,返回发送人的地址,和最终的累计值。

 

最后,在这里给大家介绍一款浏览器编译器——Remix

 

浏览器编译器Remix可谓称得上是Solidity语言的开发神器,是一个无需安装即可使用的在线编译器。只需打开其网址,即可在线使用并看到具体效果。打开后,如下图所示:

 

输入上述代码,点击Create按钮,就能在浏览器中创建能调用函数的按钮。在用Solidity在Truffle上构建一个HelloWorld智能合约

错误:Truffle 当前使用的是 solc 0.5.16,但您的一个或多个合约指定“pragma solidity ^0.8.0”

如何利用Truffle React框架构建完整的智能合约

solidity数据类型storage memory calldata modifier前置条件 继承 接口合约 导入库 using...for solc编译

62solidity环境搭建编译及编写合约-3——2020年07月12日12:55:51

区块链Solidity智能合约与Solidity介绍