在微服務架構中監聽以太坊合約事件【Eventeum】

當構建大規模DApp時,監視以太坊的事件會變得很痛苦。在這篇文章中,咱們將介紹如何使用Eventeum將後端微服務與以太坊智能合約事件之間橋接起來。node

以太坊教程連接:Dapp入門 | 電商Dapp實戰 | Token實戰 | Php對接 | Java對接 | Python對接 | C#對接 | Dart對接git

一、什麼是Eventeum

Eventeum是一個以太坊事件監聽服務,它提供了智能合約與中間件層之間的橋接功能。Eventeum支持動態訂閱以太坊事件,當以太坊智能合約事件觸發時,包含事件詳情的消息將廣播到消息總線上(例如Kafka或RabbitMQ),進而被後端服務利用。github

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MAiL1BU4-1582336000704)(eventeum-tutorial/arch.jpg)]

Eventeum的主要特性包括:web

  • 可動態配置

應用能夠利用Eventeum提供的REST api動態訂閱或取消訂閱以太坊智能合約事件。docker

  • 高可用性

Eventeum實例彼此通訊以確保全部實例訂閱相同的以太坊智能合約事件集。npm

  • 彈性

能夠自動檢測節點失效,當節點恢復工做後訂閱能夠從失效時的區塊繼續。json

  • 分叉容錯

Eventeum能夠配置事件」確認「所需的區塊數。若是在此期間發生了區塊鏈的分叉,Eventeum會廣播一個消息到網絡中,以便讓你的後端服務對分叉事件進行及時響應。後端

二、部署Eventeum

Eventeum目前支持3種廣播機制:api

  • 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

三、測試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以太坊開發節點了。

四、註冊智能合約事件

如今咱們須要註冊以太坊事件了,這樣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終端中看到交易。

五、在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

六、如何在以太坊測試鏈或主鏈上使用Eventeum?

要在以太坊測試鏈或主鏈上使用Eventeum,須要修改docker-compose.yml中的以太坊節點URL。這裏再也不詳述。


原文連接:Eventeum - 在微服務中監聽以太坊合約事件 — 匯智網

相關文章
相關標籤/搜索