美文网首页
【ETH智能合约】--05 Solidity 事件Event详解

【ETH智能合约】--05 Solidity 事件Event详解

作者: 唠嗑008 | 来源:发表于2019-03-19 09:03 被阅读0次

什么是Evnet事件

事件是以太坊虚拟机(EVM)日志基础设施提供的一个接口,事件可以用来做操作记录,存储为日志。如果监听了某事件,当事件发生时,会进行回调。当定义的事件触发时,我们可以将事件存储到EVM的交易的日志中(日志是区块链上的一种特殊数据结构)。日志是与合约地址关联的,并存储在区块链中。

注意:

  • 区块链上的交易往往会有日志记录,日志代表着智能合约所触发的事件。

  • 不能直接访问日志和事件数据,即使是创建日志的合约。

在Solidity中,使用event 关键字来定义一个事件。

event EventName(address bidder, uint amount);

事件在合约中可以被继承。触发一个事件使用emit(之前的版本里并不需要使用emit)

emit EventName(msg.sender, msg.value);

触发事件的调用

function testEvent() public {

    // 触发一个事件
     emit EventName(msg.sender, msg.value); 
}

监听事件

在Web3.js与智能合约交互中,可以通过Event来实现一些交互功能。

接下来一起来看看在之前web3的代码中,加入Event,并触发事件

在之前的合约中添加了一个Event事件

pragma solidity ^0.4.21;

contract InfoContract {
  
 string fName;
 uint age;

  event Instructor(
      string name,
      uint age
   );
 
 function setInfo(string _fName, uint _age) public {
     fName = _fName;
     age = _age;
 }
 
 function getInfo() public constant returns (string, uint) {
     return (fName, age);
 }   
}

然后修改setInfo函数,触发Instructor事件

function setInfo(string _fName, uint _age) public {
    fName = _fName;
    age = _age;
    emit Instructor(_fName, _age);
}

当调用setInfo函数,函数时触发Instructor事件。

现在通过Web3.js监听事件,刷新UI。

<script>
    if (typeof web3 !== 'undefined') {
        web3 = new Web3(web3.currentProvider);
    } else {
        // set the provider you want from Web3.providers
        web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
    }

    web3.eth.defaultAccount = web3.eth.accounts[0];

    var infoContract = web3.eth.contract(ABI INFO);

    var info = infoContract.at('CONTRACT ADDRESS');

    info.getInfo(function(error, result){
        if(!error)
            {
                $("#info").html(result[0]+' ('+result[1]+' years old)');
                console.log(result);
            }
        else
            console.error(error);
    });

    $("#button").click(function() {
        info.setInfo($("#name").val(), $("#age").val());
    });

</script>

现在,我们改一下代码,通过监听事件获取信息,所以不需要info.getInfo()来获取信息了

var instructorEvent = info.Instructor();

instructorEvent.watch(function(error, result) {
        if (!error)
            {
                $("#info").html(result.args.name + ' (' + result.args.age + ' years old)');
            } else {
                console.log(error);
            }
    });

这样修改以后,就可以刷新UI了。

参考:
https://coursetro.com/posts/code/100/Solidity-Events-Tutorial---Using-Web3.js-to-Listen-for-Smart-Contract-Events

https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events

相关文章

网友评论

      本文标题:【ETH智能合约】--05 Solidity 事件Event详解

      本文链接:https://www.haomeiwen.com/subject/dxovyftx.html