Eeveteum - 在微服务架构中监听以太坊合约事件
当构建大规模DApp时,监视以太坊的事件会变得很痛苦。在这篇文章中,我们将介绍如何使用Eventeum将后端微服务与以太坊智能合约事件之间桥接起来。
以太坊教程链接:Dapp入门 | 电商Dapp实战 | ERC721实战 | Php对接 | Java对接 | Python对接 | C#对接 | Dart对接
1、什么是Eventeum
Eventeum是一个以太坊事件监听服务,它提供了智能合约与中间件层之间的桥接功能。Eventeum支持动态订阅以太坊事件,当以太坊智能合约事件触发时,包含事件详情的消息将广播到消息总线上(例如Kafka或RabbitMQ),进而被后端服务利用。
Eventeum的主要特性包括:
- 可动态配置
应用可以利用Eventeum提供的REST api动态订阅或取消订阅以太坊智能合约事件。
- 高可用性
Eventeum实例彼此通信以确保所有实例订阅相同的以太坊智能合约事件集。
- 弹性
可以自动检测节点失效,当节点恢复工作后订阅可以从失效时的区块继续。
- 分叉容错
Eventeum可以配置事件”确认“所需的区块数。如果在此期间发生了区块链的分叉,Eventeum会广播一个消息到网络中,以便让你的后端服务对分叉事件进行及时响应。
2、部署Eventeum
Eventeum目前支持3种广播机制:
- Kafka
- HTTP Post
- RabbitMQ
在这个教程中,我们将使用Kafka。
部署Kafka的前提要求如下:
- Java8
- Maven
- Mongo
- Kafka
- Zookeeper
- Ethereum Node
- Docker (可选)
docker是可选的,不过我建议使用docker套件,其中包含了上述大部分
依赖,只是需要先安装Java8和Maven。
首先参考docker官网文档,安装Docker和Docker-compose。
然后克隆以太坊Eventeum软件库:
$ git clone https://github.com/ConsenSys/eventeum.git
检出Eventeum代码后,进入项目目录:
$ cd /path/to/eventeum/
编译、测试、打包Eventeum项目:
$ mvn clean package
一体化安装Eventeum的docker套件:
$ cd server $ docker-compose -f docker-compose.yml build $ docker-compose -f docker-compose.yml up
3、测试Eventeum
为了测试Eventeum,我们需要先在本地Parity节点(Eventeum自动安装的以太坊节点)上部署一个示例智能合约,然后订阅一个智能合约事件来通过Kafka广播。
让我们先部署CrudApp.sol合约,我们使用Remix IDE
和Metamask。
- 打开Remix IDE,添加CrudApp.sol合约
- 选择合约所需的solc编译器版本(我们使用0.4.23),然后编译合约
- 在Metamask上选择节点Localhost:8545
- 在Remix IDE中,切换到Run选项页,然后选择 当前环境中的web3提供器 并进行部署
现在,合约已经部署到本地的Parity以太坊开发节点了。
4、注册智能合约事件
现在我们需要注册以太坊事件了,这样Eventeum可以监听这些事件然后进行广播。Eventeum提供了REST api,下面介绍如何使用这个API来注册智能合约事件。
注册合约事件
- URL: /api/rest/v1/event-filter
- Method: POST
{ "id": "event-identifier", "contractAddress": "0x1fbBeeE6eC2B7B095fE3c5A572551b1e260Af4d2", "eventSpecification": { "eventName": "TestEvent", "indexedParameterDefinitions": [ {"position": 0, "type": "UINT256"}, {"position": 1, "type": "ADDRESS"}], "nonIndexedParameterDefinitions": [ {"position": 2, "type": "BYTES32"}, {"position": 3, "type": "STRING"}] }, "correlationIdStrategy": { "type": "NON_INDEXED_PARAMETER", "parameterIndex": 0 } }
为了简化,我们使用curl调用上述API注册指定的以太坊智能合约事件:
curl -X POST \ http://localhost:8060/api/rest/v1/event-filter \ -H 'Cache-Control: no-cache' \ -H 'Content-Type: application/json' \ -H 'Postman-Token: 616712a3-bf11-bbf5-b4ac-b82835779d51' \ -d '{ "id": "Country", "contractAddress": "ENTER_YOUR_CONTRACT_ADDRESS_CHECK_IN_REMIX", "eventSpecification": { "eventName": "CountryEvent", "nonIndexedParameterDefinitions": [ {"position": 0, "type": "STRING"}, {"position": 1, "type": "STRING"}, {"position": 2, "type": "UINT256"}] } }'
注册成功后,可以得到响应中的ID。现在让我们调用合约方法以便触发CountryEvent事件。为此我们继续使用Remix IDE:
现在让我们为insert方法传入参数(“USA”, “Elizabeth Warren ”, 327946410)
,一切正常的话,你就可以在Docker终端中看到交易。
5、在NodeJS服务中订阅Eventeum服务
现在让我们使用NodeJS服务来订阅Eventuem推送的Kafka事件。步骤如下:
mkdir watcher cd watcher npm init npm install npm i kafka-node (Kafka-nodejs client) touch index.js
在index.js中添加如下代码:
var kafka = require('kafka-node') const client = new kafka.KafkaClient({kafkaHost: 'localhost:9092'}); var kafka = require('kafka-node'); Consumer = kafka.Consumer, consumer = new Consumer( client, [ { topic: 'contract-events', partition: 0 } ], { autoCommit: false } ); consumer.on('message', function (message) { console.log(message); });
可以如下运行:
nodejs index.js
正如你看到的,我们使用的主题是Eventeum内置的 contract-events 。
使用下面的命令查看Eventeum的全部内建Kafka主题:
bin/kafka-topics.sh --list --zookeeper localhost:2181
结果如下:
__consumer_offsets block-events contract-events filter-events filter-events-dlteventeum filter-events-erreventeum filter-eventsnull
6、如何在以太坊测试链或主链上使用Eventeum?
要在以太坊测试链或主链上使用Eventeum,需要修改docker-compose.yml中的以太坊节点URL。这里不再详述。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Charles 从入门到精通
内容清单 Charles 的简介 安装 Charles Charles 初始化设置 过滤网络请求 截取HTTP/HTTPS数据 模拟弱网环境 修改网络请求 修改服务器返回内容 服务器压力测试 反向代理 解决与翻墙软件的冲突 Charles 的简介 Charles 是目前最主流的网络调试工具(Charles、Fiddler、Wireshark...)之一,对于一个开发者来说与网络打交道是日常需求,因此很多时候我们需要调试参数、返回的数据结构、查看网络请求的各种头信息、协议、响应时间等等。所以了解 Charles 并使用它 Charles 通过将自己设置为系统的网络访问代理服务器,这样所有的网络请求都会通过它,从而实现了网路请求的截获和分析。 Chareles 不仅可以分析电脑本机的网络请求(HTTP 和 HTTPS),还可以分析移动端设备的网络请求。 Charles 是收费软件,作者开发出这样一个方便开发者使用的伟大工具,我们鼓励使用正版软件,但是对于一些囊中羞涩或者学生来说,有破解版的更好,别担心,这些我都准备好了,下一个 section 会讲解如何下载安装。 安装 Charles 方...
- 下一篇
CSI 存储插件升级指南
新创建的ACK集群都是默认安装最新的存储插件。在升级时,有些模板变化较大的版本需要参考下面升级步骤: CSI-Plugin升级: 1. CSI-Plugin镜像版本信息: v1.14.8.36-93f2b131-aliyun v1.14.8.32-c77e277b-aliyun v1.14.5.60-5318afe-aliyun 版本信息详见:https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/releases 2. 升级 “v1.14.8.32-c77e277b-aliyun(含)” 之前的版本到最新: 1)下载升级脚本:http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/csi/upgrade_csi-plugin.sh $ wget http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/csi/upgrade_csi-plugin.sh 2)登陆集群Master或者配置好kubeconf的环境(可以执行kubectl),执行脚本: ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果