SOLIDITY关键字EMIT
引入emit背景:
ERC20 token标准介绍了一种Transfer事件以及一个transfer()方法。
它们的调用语法不完全相同:
transfer(address to, uint value);
Transfer(address from, address to, uint256 _value);
但是这种相似足够引起混淆。
对未来的Solidity程序员来说这是一个很严重的问题,必须避免意外地将外部调用函数映射到一个
名字相似的事件上,而这导致了去年的DAO攻击。有人建议在事件名前面加上Log前缀来标识以避免将函数和事件混淆,但是最后还是决定引进一个新的关键字emit。
所以:
event Transfer(address from, address to, uint256 _value);
// …
Transfer(from, to, value);
就变为了:
event Transfer(address from, address to, uint256 _value);
// …
emit Transfer(from, to, value);
这就能够让函数调用和事件日志之间具备了语义上的不同。
Transfer事件:
当token被转移的时候必须触发该事件,包括零值转移。
一个创建新token的合约在给_from地址赋0x0值时必须触发一个Transfer事件event Transfer(address indexed _from, address indexed _to, uint256 _value)
transfer方法:
转移_value个token到地址_to,必须激活Transfer事件,若_from账户余额token不足,则该函数应该抛出异常。注意零值转移必须和普通转移一样必须激活Transfer事件
function transfer(address _to, uint256 _value) returns (bool success)
最近3月8日的版本v0.4.21,引进emit关键字来触发事件,这有助于分清功能和事件,这也是之前遭遇DAO攻击导致以太坊硬分叉并催生经典以太坊ETC的原因之一。
根据solidity版本的注释可知:
一般:支持并推荐使用emit EventName()来明确地调用事件。为了让事件较常规函数调用更突出,应该是用emit EventName()而不是EventName()
来调用事件。
下面这个实例用于触发一个事件:
pragma solidity ^0.4.21;
contract ClientReceipt {
event Deposit(
address indexed _from,
bytes32 indexed _id,
uint _value
); //声明一个事件
function deposit(bytes32 _id) public payable {
// Events are emitted using `emit`, followed by
// the name of the event and the arguments
// (if any) in parentheses. Any such invocation
// (even deeply nested) can be detected from
// the JavaScript API by filtering for `Deposit`.
//事件被emit触发,括号内有事件名参数和其他参数,通过JS API过滤Deposit可检测到任何类似的调用
//(即使是深度嵌套也能够检测到)
emit Deposit(msg.sender, _id, msg.value);
}
}
这里必须确保编译器版本为0.4.12及以上,若较低的版本编译器会抛出错误。
SOLIDITY关键字EMIT相关推荐
- 用Remix部署Solidity合约
Remix是一个用于开发和部署Solidity合约的线上IDE,该IDE含有各个版本的Solidity,当一个工程有多个Solidity版本时,就需要使用Remix来进行分开编译和部署. 1. ...
- QT信号与槽——观察者模式——回调函数
QT信号与槽--观察者模式--回调函数 1.QT信号与槽机制 1.1信号本质 信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时候 Qt 对应的窗口类会发出某个信号.比如 ...
- QT信号和槽函数学习笔记
//connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...
- vue变量传值_Vue各类组件之间传值的实现方式
1.父组件向子组件传值 首先在父组件定义好数据,接着将子组件导入到父组件中.父组件只要在调用子组件的地方使用v-bind指令定义一个属性,并传值在该属性中即可,此时父组件的使命完成,请看下面关键代码: ...
- Qt 给控件QLineEdit添加clicked事件方法
做Qt开发的会知道QLineEdit是默认没有clicked事件的,但是Qt有很好的一套信号/槽机制,而且Qt是基于C++面向对象的思想来设计的,那么我们就很容易通过自己定义一些类,重写QLineEd ...
- theoretical-零基础学Qt4编程之Qt核心机制与原理之信号与槽-
信号与槽 信号和槽机制是Qt的核心机制之一,要掌握Qt编程就需要对信号和槽有所了解.信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是Qt的核心特性,也是Qt不同于其它同类工具包的重要地方之一 ...
- qt checkbox 选中事件_Qt基础知识学习
Qt基础知识学习 Qt C++ SQLite ★★★★★ Qt · 简介 Qt是由Qt Company开发的面向对象的跨平台C++图形用户界面应用程序开发框架. 前期 · 准备 01 辨析Qt(开 ...
- 【刘文彬】 Controller:EOS区块链核心控制器
原文链接:醒者呆的博客园,www.cnblogs.com/Evsward/p/c- Controller是EOS区块链的核心控制器,其功能丰富.责任重大. 关键字:EOS,区块链,controller ...
- QT学习笔记(摘抄)
QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...
最新文章
- 求求你别再用 System.out.println 了!!
- 为什么很多 SpringBoot 开发者放弃了 Tomcat,选择了 Undertow?
- 用 Python 使用 Google Colab?岂止是炫酷
- Mac解决中文matplotlib乱码问题
- 剑指offer: 变态跳台阶 python实现
- 谷歌AI错杀Chrome插件,全职奶爸程序员“睡后收入”被迫终结
- 用forif循环测量minst0-6的特征迭代次数曲线
- 组策略管理——软件限制策略(4)
- SAP CRM Fiori 应用和 SAP Commerce Cloud (电商云) UI 如何通过调整 CSS 来改变UI显示风格
- Android 默认Tab标签大小及间距修改
- 浙大计算机硕士比本科985,二本出身的985研究生与985本科生,哪个更厉害?网友:差的太多!...
- java包含关系图_Java——Spring框架完整依赖关系图!再复习了解加工一下吧?
- elasticsearch基本查询三(英文分词)match查询
- 手机测评系列之vivox23
- CCF201609-2 火车购票(100分)
- 为什么短信会在未来几年消亡
- Nfine框架的使用
- referenced before assignment
- 《激荡三十年》——来了解我们的时代
- leetcode 剑指offer-46.把数字翻译成字符串