经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 区块链 » 查看文章
使用web3.js监听以太坊智能合约event
来源:cnblogs  作者:通证派大本营  时间:2019/1/30 9:25:09  对本文有异议


传送门: 柏链项目学院


使用web3.js监听以太坊智能合约event



??当我们在前端页面调用合约时发现有些数据不会立即返回,这时还需要再调用更新数据的函数。那么这样的方法使用起来非常不便,监听event就可以很好的解决这样的问题,下面我们来看看如何监听event。以下内容基于web3.js1.0版本,版本不同可能会代码差异。

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. mapping(string => string) map;
  4. event orderlog(string indexed action, string indexed key, string value);
  5. function getvalue(string key) public constant returns (string) {
  6. return map[key];
  7. }
  8. function setvalue(string key, string value) public {
  9. emit orderlog("setvalue haha", key, value);
  10. map[key] = value;
  11. }
  12. }

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. var contractAbi = [
  9. {
  10. "constant": false,
  11. "inputs": [
  12. {
  13. "name": "key",
  14. "type": "string"
  15. },
  16. {
  17. "name": "value",
  18. "type": "string"
  19. }
  20. ],
  21. "name": "setvalue",
  22. "outputs": [],
  23. "payable": false,
  24. "stateMutability": "nonpayable",
  25. "type": "function"
  26. },
  27. {
  28. "constant": true,
  29. "inputs": [
  30. {
  31. "name": "key",
  32. "type": "string"
  33. }
  34. ],
  35. "name": "getvalue",
  36. "outputs": [
  37. {
  38. "name": "",
  39. "type": "string"
  40. }
  41. ],
  42. "payable": false,
  43. "stateMutability": "view",
  44. "type": "function"
  45. },
  46. {
  47. "anonymous": false,
  48. "inputs": [
  49. {
  50. "indexed": true,
  51. "name": "action",
  52. "type": "string"
  53. },
  54. {
  55. "indexed": true,
  56. "name": "key",
  57. "type": "string"
  58. },
  59. {
  60. "indexed": false,
  61. "name": "value",
  62. "type": "string"
  63. }
  64. ],
  65. "name": "orderlog",
  66. "type": "event"
  67. }
  68. ];
  69. var contractaAddress = "0x31bd7af45b90811f23fa748fbf1940dc8b3d9dcb";
  70. MyContract = new web3.eth.Contract(contractAbi, contractaAddress);
  71. //console.log(MyContract.events.orderlog);
  72. var myEvent = MyContract.events.orderlog({
  73. filter:{},
  74. fromBlock: 0
  75. }, function(error, event){})
  76. .on('data', function(event){
  77. console.log(event); // same results as the optional callback above
  78. })
  79. .on('changed', function(event){
  80. // remove event from local database
  81. })
  82. .on('error', console.error);
  83. /*
  84. MyContract.getPastEvents('allEvents', {
  85. filter: {},
  86. fromBlock: 0,
  87. toBlock: 'latest'
  88. }, function(error, events){ console.log(events); })
  89. .then(function(events){
  90. console.log(events) // same results as the optional callback above
  91. });
  92. */

4. 运行map_event.js监听event

  • 方法如下
  1. npm init -y
  2. npm install web3 --save
  3. node map_event.js

5. 调用map3合约中的setvalue函数触发event




原文链接:http://www.cnblogs.com/tokenpai/p/10334952.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号