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”
solidity数据类型storage memory calldata modifier前置条件 继承 接口合约 导入库 using...for solc编译