引入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相关推荐

  1. 用Remix部署Solidity合约

        Remix是一个用于开发和部署Solidity合约的线上IDE,该IDE含有各个版本的Solidity,当一个工程有多个Solidity版本时,就需要使用Remix来进行分开编译和部署. 1. ...

  2. QT信号与槽——观察者模式——回调函数

    QT信号与槽--观察者模式--回调函数 1.QT信号与槽机制 1.1信号本质 信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时候 Qt 对应的窗口类会发出某个信号.比如 ...

  3. QT信号和槽函数学习笔记

    //connect 函数有4个参数 分别是 发送者 信号.接受者 ,槽 //connect(sender,signal,receiver,slot) /* * 信号和槽 * 信号 就是一个普通的函数 ...

  4. vue变量传值_Vue各类组件之间传值的实现方式

    1.父组件向子组件传值 首先在父组件定义好数据,接着将子组件导入到父组件中.父组件只要在调用子组件的地方使用v-bind指令定义一个属性,并传值在该属性中即可,此时父组件的使命完成,请看下面关键代码: ...

  5. Qt 给控件QLineEdit添加clicked事件方法

    做Qt开发的会知道QLineEdit是默认没有clicked事件的,但是Qt有很好的一套信号/槽机制,而且Qt是基于C++面向对象的思想来设计的,那么我们就很容易通过自己定义一些类,重写QLineEd ...

  6. theoretical-零基础学Qt4编程之Qt核心机制与原理之信号与槽-

    信号与槽 信号和槽机制是Qt的核心机制之一,要掌握Qt编程就需要对信号和槽有所了解.信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是Qt的核心特性,也是Qt不同于其它同类工具包的重要地方之一 ...

  7. qt checkbox 选中事件_Qt基础知识学习

    Qt基础知识学习 Qt C++ SQLite ★★★★★   Qt · 简介 Qt是由Qt Company开发的面向对象的跨平台C++图形用户界面应用程序开发框架. 前期 · 准备 01 辨析Qt(开 ...

  8. 【刘文彬】 Controller:EOS区块链核心控制器

    原文链接:醒者呆的博客园,www.cnblogs.com/Evsward/p/c- Controller是EOS区块链的核心控制器,其功能丰富.责任重大. 关键字:EOS,区块链,controller ...

  9. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

最新文章

  1. 求求你别再用 System.out.println 了!!
  2. 为什么很多 SpringBoot 开发者放弃了 Tomcat,选择了 Undertow?
  3. 用 Python 使用 Google Colab?岂止是炫酷
  4. Mac解决中文matplotlib乱码问题
  5. 剑指offer: 变态跳台阶 python实现
  6. 谷歌AI错杀Chrome插件,全职奶爸程序员“睡后收入”被迫终结
  7. 用forif循环测量minst0-6的特征迭代次数曲线
  8. 组策略管理——软件限制策略(4)
  9. SAP CRM Fiori 应用和 SAP Commerce Cloud (电商云) UI 如何通过调整 CSS 来改变UI显示风格
  10. Android 默认Tab标签大小及间距修改
  11. 浙大计算机硕士比本科985,二本出身的985研究生与985本科生,哪个更厉害?网友:差的太多!...
  12. java包含关系图_Java——Spring框架完整依赖关系图!再复习了解加工一下吧?
  13. elasticsearch基本查询三(英文分词)match查询
  14. 手机测评系列之vivox23
  15. CCF201609-2 火车购票(100分)
  16. 为什么短信会在未来几年消亡
  17. Nfine框架的使用
  18. referenced before assignment
  19. 《激荡三十年》——来了解我们的时代
  20. leetcode 剑指offer-46.把数字翻译成字符串

热门文章

  1. Python画ROC图与AUC值
  2. 苹果起诉以色列安全公司NSO,间谍软件是侵犯隐私还是打击犯罪?
  3. 培训行业折射出的现状
  4. ROS-gazebo 简介
  5. pyqt5,Qchart画折线图,设定多个不同刻度的Y轴,修改自定义折线图的坐标轴,改变折线图的底色
  6. 华为资深工程师带你了解华为七大根技术
  7. 图解项目管理全流程图及详细管理过程
  8. 大型网站架构模式(三)
  9. EffecientDet论文学习2
  10. 拒绝字面意思的忽悠:scheduleWithFixedDelay与scheduleAtFixedRate的真正区别