当构建大规模DApp时,监视以太坊的事件会变得很痛苦。在这篇文章中,我们将介绍如何使用Eventeum将后端微服务与以太坊智能合约事件之间桥接起来。
以太坊教程链接:Dapp入门 | 电商Dapp实战 | Token实战 | Php对接 | Java对接 | Python对接 | C#对接 | Dart对接
Eventeum是一个以太坊事件监听服务,它提供了智能合约与中间件层之间的桥接功能。Eventeum支持动态订阅以太坊事件,当以太坊智能合约事件触发时,包含事件详情的消息将广播到消息总线上(例如Kafka或RabbitMQ),进而被后端服务利用。
Eventeum的主要特性包括:
应用可以利用Eventeum提供的REST api动态订阅或取消订阅以太坊智能合约事件。
Eventeum实例彼此通信以确保所有实例订阅相同的以太坊智能合约事件集。
可以自动检测节点失效,当节点恢复工作后订阅可以从失效时的区块继续。
Eventeum可以配置事件”确认“所需的区块数。如果在此期间发生了区块链的分叉,Eventeum会广播一个消息到网络中,以便让你的后端服务对分叉事件进行及时响应。
Eventeum目前支持3种广播机制:
在这个教程中,我们将使用Kafka。
部署Kafka的前提要求如下:
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
为了测试Eventeum,我们需要先在本地Parity节点(Eventeum自动安装的以太坊节点)上部署一个示例智能合约,然后订阅一个智能合约事件来通过Kafka广播。
让我们先部署CrudApp.sol合约,我们使用Remix IDE
和Metamask。
现在,合约已经部署到本地的Parity以太坊开发节点了。
现在我们需要注册以太坊事件了,这样Eventeum可以监听这些事件然后进行广播。Eventeum提供了REST api,下面介绍如何使用这个API来注册智能合约事件。
注册合约事件
{
"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终端中看到交易。
现在让我们使用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
要在以太坊测试链或主链上使用Eventeum,需要修改docker-compose.yml中的以太坊节点URL。这里不再详述。
原文链接:Eventeum - 在微服务中监听以太坊合约事件 — 汇智网