文档章节

在微服务架构中监听以太坊合约事件【Eventeum】

区块链教程
 区块链教程
发布于 02/22 09:50
字数 1284
阅读 137
收藏 0

当构建大规模DApp时,监视以太坊的事件会变得很痛苦。在这篇文章中,我们将介绍如何使用Eventeum将后端微服务与以太坊智能合约事件之间桥接起来。

以太坊教程链接:Dapp入门 | 电商Dapp实战 | Token实战 | Php对接 | Java对接 | Python对接 | C#对接 | Dart对接

1、什么是Eventeum

Eventeum是一个以太坊事件监听服务,它提供了智能合约与中间件层之间的桥接功能。Eventeum支持动态订阅以太坊事件,当以太坊智能合约事件触发时,包含事件详情的消息将广播到消息总线上(例如Kafka或RabbitMQ),进而被后端服务利用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MAiL1BU4-1582336000704)(eventeum-tutorial/arch.jpg)]

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:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DBwEbP57-1582336000706)(eventeum-tutorial/call-contract.png)]

现在让我们为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。这里不再详述。


原文链接:Eventeum - 在微服务中监听以太坊合约事件 — 汇智网

© 著作权归作者所有

区块链教程

区块链教程

粉丝 2
博文 88
码字总数 158325
作品 0
深圳
私信 提问
加载中

评论(0)

详解 Solidity 事件Event - 完全搞懂事件的使用

很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解...

熊丽兵
2018/05/16
0
0
智能合约开发以太坊代币solidity语言版

智能合约开发是以太坊开发的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。 以太坊的应用被称为去中心化应用(DApp),DAp...

马拉喀什
2018/04/23
0
0
用solidity语言开发代币智能合约

智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。 以太坊的应用被称为去中心化应用(DApp),DAp...

笔阁
2018/04/23
80
0
Solidity概述及基本代码展示

Solidity是实施智能合约的契约导向的高级语言。它受到C ++,Python和JavaScript的影响,旨在针对以太坊虚拟机(EVM)。 Solidity是静态类型的,支持继承,库和复杂的用户定义类型等功能。 您将...

区块链
2018/08/09
0
0
智能合约的核心思想、语法重点、编程模式、示例、规范及架构

目录 什么是智能合约 以太坊虚拟机(EVM)使用了256比特长度的机器码,是一种基于堆栈的虚拟机,用于执行以太坊智能合约 。由于EVM是针对以太坊体系设计的,因此使用了以太坊账户模型(Accou...

马拉喀什
2018/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python什么情况下会生成pyc文件?

作为Python爱好者,需要了解.py脚本的基本运行机制及特性: 在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从...

Python圈子
24分钟前
21
0
Python正则表达式,这一篇就够了!

之前我们讲解了 正则表达式语法与引擎 的起源、发展、流派、语法、引擎、优化等相关知识,今天我们主要来学习一下 正则表达式在 Python语言 中的应用! 大多数编程语言的正则表达式设计都师从...

猪哥66
26分钟前
21
0
linux chattr命令的使用

chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性 , 用chattr命令防止系统中某个关键文件被修改 添加属性i:不得任意更动文件或目录。 chattr +i /home/ww...

imzchloe
26分钟前
19
0
基于三维GIS技术的符号化表达系统的设计及实现

随着三维GIS技术的发展,人们在其可视化能力方面要求不断提高,在部分应用中,人们不仅要求将场景中物体位置准确描述表达出来,同时还需要保证其逼真性和美观性在智慧城市阶段,三维GIS的构建...

ZTMAP
30分钟前
15
0
技术分享 | 排序(filesort)详细解析(8000 字长文)

作者:高鹏(网名八怪) 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 本文来源:转载自公众号-老叶茶馆 *爱可生开源社区出品,原创...

爱可生
32分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部