BlockZero区块链技术社区
本帖最后由 zhenyu 于 2018-11-26 00:45 编辑
      当我们在前端页面调用合约时发现有些数据不会立即返回,这时还需要再调用更新数据的函数。那么这样的方法使用起来非常不便,监听event就可以很好的解决这样的问题,下面我们来看看如何监听event。

实现步骤:
1.修改geth启动参数
  • 全部参数如下
  1. geth --datadir ./data --networkid 15 --port 30303 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcvhosts "*" --rpcapi 'db,net,eth,web3,personal' --rpccorsdomain "*" --ws --wsaddr "localhost" --wsport "8546" --wsorigins "*" --nat "any" --nodiscover --dev --dev.period 1 console 2> 1.log
复制代码
  • 主要增加了下列参数
  1. --ws --wsaddr "localhost" --wsport "8546" --wsorigins "*"
复制代码
2.在geth上部署map3合约
  • 合约代码如下
  1. pragma solidity ^0.4.24;

  2. contract Map3 {
  3.    
  4.     mapping(string => string) map;
  5.    
  6.     event orderlog(string indexed action, string indexed key, string value);
  7.    
  8.     function getvalue(string key) public constant returns (string) {
  9.         return map[key];
  10.     }
  11.    
  12.     function setvalue(string key, string value) public {
  13.         emit orderlog("setvalue haha", key, value);
  14.         map[key] = value;
  15.     }
  16. }
复制代码
3.编写用于监听合约event的js文件
  • map_event.js代码如下
  1. var Web3 = require("web3")

  2. var web3;

  3. if (typeof web3 !== 'undefined') {
  4.     web3 = new Web3(web3.currentProvider);
  5. } else {
  6.     web3 = new Web3(new Web3.providers.WebsocketProvider("ws://127.0.0.1:8546"));
  7. }
  8.         
  9. var contractAbi = [
  10.         {
  11.                 "constant": false,
  12.                 "inputs": [
  13.                         {
  14.                                 "name": "key",
  15.                                 "type": "string"
  16.                         },
  17.                         {
  18.                                 "name": "value",
  19.                                 "type": "string"
  20.                         }
  21.                 ],
  22.                 "name": "setvalue",
  23.                 "outputs": [],
  24.                 "payable": false,
  25.                 "stateMutability": "nonpayable",
  26.                 "type": "function"
  27.         },
  28.         {
  29.                 "constant": true,
  30.                 "inputs": [
  31.                         {
  32.                                 "name": "key",
  33.                                 "type": "string"
  34.                         }
  35.                 ],
  36.                 "name": "getvalue",
  37.                 "outputs": [
  38.                         {
  39.                                 "name": "",
  40.                                 "type": "string"
  41.                         }
  42.                 ],
  43.                 "payable": false,
  44.                 "stateMutability": "view",
  45.                 "type": "function"
  46.         },
  47.         {
  48.                 "anonymous": false,
  49.                 "inputs": [
  50.                         {
  51.                                 "indexed": true,
  52.                                 "name": "action",
  53.                                 "type": "string"
  54.                         },
  55.                         {
  56.                                 "indexed": true,
  57.                                 "name": "key",
  58.                                 "type": "string"
  59.                         },
  60.                         {
  61.                                 "indexed": false,
  62.                                 "name": "value",
  63.                                 "type": "string"
  64.                         }
  65.                 ],
  66.                 "name": "orderlog",
  67.                 "type": "event"
  68.         }
  69. ];

  70. var contractaAddress = "0x31bd7af45b90811f23fa748fbf1940dc8b3d9dcb";
  71.         
  72. MyContract = new web3.eth.Contract(contractAbi, contractaAddress);
  73.                 //console.log(MyContract.events.orderlog);
  74.         
  75. var myEvent = MyContract.events.orderlog({
  76.         filter:{},
  77.         fromBlock: 0
  78. }, function(error, event){})
  79.         .on('data', function(event){
  80.         console.log(event); // same results as the optional callback above
  81. })
  82.         .on('changed', function(event){
  83.                     // remove event from local database
  84.         })        
  85.     .on('error', console.error);
  86.    

  87. /*
  88.     MyContract.getPastEvents('allEvents', {
  89.         filter: {},
  90.         fromBlock: 0,
  91.         toBlock: 'latest'
  92.     }, function(error, events){ console.log(events); })
  93.     .then(function(events){
  94.         console.log(events) // same results as the optional callback above
  95.     });
  96. */
复制代码
4.运行map_event.js监听event
  • 方法如下
  1. npm init -y
  2. npm install web3 --save
  3. node map_event.js
复制代码
5.调用map3合约中的setvalue函数触发event
  • 在remix中调用setvalue时的监听效果

注:以上内容基于web3.js1.0版本,版本不同可能会代码差异






P叔二维码.png

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

© 2018 BlockZero

返回顶部