Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 67.3MB ·虚拟内存 1300.5MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
Solidity 0.6 是 Solidity 一个较大版本的升级,带来了一些对老版本不兼容的一些变化。
在 0.6 之前的版本,我们可以定义下面的 fallback 函数,用来通过合约接收 eth 转账或未指定明确合约函数的调用。
function() external payable { currentBalance = address(this).balance + msg.value; }
从 0.6 开始,这种写法就要报编译错误了。
新的写法是下面这样的:
fallback() external { } receive() payable external { currentBalance = currentBalance + msg.value; }
对于这种新的写法,有几点是要注意的:
这个版本之前合约继承可以这么写的,看起来比较简单,语义上并不是很清晰。
contract Employee { function getSalary() public; } contract Manager is Employee { function increaseSalary() public { } function getSalary() public { } }
从 0.6 开始,solidity 引入了 abstract, virtual, override 几个关键字,继承关系需要用下面的写法。
abstract contract Employee { function getSalary() public virtual; } contract Manager is Employee { function increaseSalary() public { } function getSalary() public override { } }
在之前的 solidity 版本,我们在当前合约发起对外部合约调用的话,如果外部合约调用执行失败被 revert,外部合约状态会被回滚,当前合约状态也会被回滚。但有时候我们并不想这样,要是能够捕获外部合约调用异常,然后根据情况做自己的处理不是更好么?
// 这是我们需要调用的外部合约接口 interface DataFeed { function getData(address token) external returns (uint value); } contract FeedConsumer { DataFeed feed; uint errorCount; function rate(address token) public returns (uint value, bool success) { // 如果外部合约调用错误次数超过 10 次,就不再进行更多调用了 require(errorCount < 10); try feed.getData(token) returns (uint v) { return (v, true); } catch Error(string memory /* 出错原因 */) { // 这块儿代码只有在对 DataFeed 调用失败时才会执行,通常是不满足外部合约 require 语句条件或触发 revert 语句时所引起的调用失败 errorCount++; return (0, false); } catch (bytes memory) { // 当外部调用触发 assert 语句或除 0 等比较严重错误时会执行这个 catch 块 errorCount++; return (0, false); } } }
上面只是列了几个比较大的变化,还有一些其它变化也是值得注意的:
使用 Solidity 智能合约转账可以使用 transfer 函数。智能合约里面需要有一定的以太,不然合约将无法给调用者发送以太,可以在创建合约时给合约发送一定的以太来测试。具有转账功能的智能 ...