传送门: 柏链项目学院


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

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

1. 修改geth启动参数

  • 全部参数如下
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

  • 主要增加了下列参数
--ws --wsaddr "localhost" --wsport "8546" --wsorigins "*"

2. 在geth上部署map3合约

  • 合约代码如下
pragma solidity ^0.4.24;

contract Map3 {

    mapping(string => string) map;

    event orderlog(string indexed action, string indexed key, string value);

    function getvalue(string key) public constant returns (string) {
return map[key];
} function setvalue(string key, string value) public {
emit orderlog("setvalue haha", key, value);
map[key] = value;
}
}

3. 编写用于监听合约event的js代码

  • map_event.js代码如下
var Web3 = require("web3")

var web3;

if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
web3 = new Web3(new Web3.providers.WebsocketProvider("ws://127.0.0.1:8546"));
} var contractAbi = [
{
"constant": false,
"inputs": [
{
"name": "key",
"type": "string"
},
{
"name": "value",
"type": "string"
}
],
"name": "setvalue",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "key",
"type": "string"
}
],
"name": "getvalue",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "action",
"type": "string"
},
{
"indexed": true,
"name": "key",
"type": "string"
},
{
"indexed": false,
"name": "value",
"type": "string"
}
],
"name": "orderlog",
"type": "event"
}
]; var contractaAddress = "0x31bd7af45b90811f23fa748fbf1940dc8b3d9dcb"; MyContract = new web3.eth.Contract(contractAbi, contractaAddress);
//console.log(MyContract.events.orderlog); var myEvent = MyContract.events.orderlog({
filter:{},
fromBlock: 0
}, function(error, event){})
.on('data', function(event){
console.log(event); // same results as the optional callback above
})
.on('changed', function(event){
// remove event from local database
})
.on('error', console.error); /*
MyContract.getPastEvents('allEvents', {
filter: {},
fromBlock: 0,
toBlock: 'latest'
}, function(error, events){ console.log(events); })
.then(function(events){
console.log(events) // same results as the optional callback above
});
*/

4. 运行map_event.js监听event

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

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

  • 在remix中调用setvalue时的监听效果

当合约被调用时,前端页面需要立即更新数据,监听event就可以实现这样的效果。


使用web3.js监听以太坊智能合约event的更多相关文章

  1. 使用web3+solc编译发布以太坊智能合约

    一.环境安装: 1.安装web3工程:npm install web3 2.安装solc工程:npm install solc二.在node环境中使用 先引用所需环境: var fs = requir ...

  2. 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明

    以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...

  3. 深入以太坊智能合约 ABI

    开发 DApp 时要调用在区块链上的以太坊智能合约,就需要智能合约的 ABI.本文希望更多了解 ABI,如为什么需要 ABI?如何解读 Ethereum 的智能合约 ABI?以及如何取得合约的 ABI ...

  4. rpc接口调用以太坊智能合约

    rpc接口调用以太坊智能合约 传送门: 柏链项目学院   在以太坊摸爬滚打有些日子了,也遇到了各种各样的问题.这几天主要研究了一下如何通过rpc接口编译.部署和调用合约.也遇到了一些困难和问题,下面将 ...

  5. 以太坊智能合约介绍,Solidity介绍

    以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...

  6. 以太坊智能合约Hello World示例程序

    简介 以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开 ...

  7. 如何通过以太坊智能合约来进行众筹(ICO)

    前面我们有两遍文章写了如何发行代币,今天我们讲一下如何使用代币来公开募资,即编写一个募资合约. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还 ...

  8. Go语言打造以太坊智能合约测试框架(level3)

    传送门: 柏链项目学院 第三课 智能合约自动化测试 之前课程回顾 我们之前介绍了go语言调用exec处理命令行,介绍了toml配置文件的处理,以及awk处理文本文件获得ABI信息.我们的代码算是完成了 ...

  9. Go语言打造以太坊智能合约测试框架(level1)

    传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...

随机推荐

  1. [Swift]LeetCode1016. 子串能表示从 1 到 N 数字的二进制串 | Binary String With Substrings Representing 1 To N

    Given a binary string S (a string consisting only of '0' and '1's) and a positive integer N, return ...

  2. fiddler抓取https失败解决方案

    众所周知,Fiddler默认只能抓取到http请求,要抓取到https请求我们还需要FiddlerCertMaker插件的支持, 至于怎么使用fiddler抓https及插件的使用方式,大家可以去百度 ...

  3. Xapian索引-文档检索过程分析

    本文是Xapian检索过程的分析,本文内容中源码比较多.检索过程,总的来说就是拉取倒排链,取得合法doc,然后做打分排序的过程. 1 理论分析 1.1  检索语法 面对不同的检索业务,我们会有多种检索 ...

  4. 【Spark篇】---SparkStreaming算子操作transform和updateStateByKey

    一.前述 今天分享一篇SparkStreaming常用的算子transform和updateStateByKey. 可以通过transform算子,对Dstream做RDD到RDD的任意操作.其实就是 ...

  5. web Components 学习之路

    就目前而言,纯粹的Web Components在兼容性方面还有着较为长远的路,这里做个记录总结,以纪念自己最近关于Web Components的学习道路. 参考教材 JavaScript 标准参考教程 ...

  6. 将Maple输出的LaTex导出到txt文件

    将Maple输出的LaTex导出到txt文件 1. 生成LATEX Maple可以把它的表达式转换成LATEX, 使用latex命令即可: > latex(x^2+y^2=z^2); {x}^{ ...

  7. 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...

  8. Python读写文件你真的了解吗?

    内容概述 Python文件操作 针对大文件如何操作 为什么不能修改文件? 你需要知道的基本知识 1. Python文件操作 这一部分内容不是重点,因为很简单网上很多,主要看看文件操作的步骤就可以了. ...

  9. 初学Java Web(3)——第一个Servlet

    这学期 Java Web 课程的第一节课就简短复习了一下 Java 的一些基础知识,所以觉得 Java 的基础知识还是很重要的,但当我想要去写一篇 Java 回顾的文章的时候发现很难,因为坑实在太多了 ...

  10. 五一之起一台服务器玩玩-u盘安装centos

    之前淘宝买的300块钱笔记本,就是拿来练手的,但是命令基本都知道了,不来练手,学习下去就没有动力了啊. 对于新的笔记本,我们怎么安装系统呢?能去官网就去官网,你绝对没有体验过睡一晚早上起来服务器就被黑 ...