當建構大規模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
- 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。這裡不再詳述。
原文連結:
Eventeum - 在微服務中監聽以太坊合約事件 — 彙智網