溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Eventeum將后端微服務(wù)與以太坊智能合約橋接起來

發(fā)布時(shí)間:2021-12-29 14:29:29 來源:億速云 閱讀:144 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“如何使用Eventeum將后端微服務(wù)與以太坊智能合約橋接起來”,在日常操作中,相信很多人在如何使用Eventeum將后端微服務(wù)與以太坊智能合約橋接起來問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”如何使用Eventeum將后端微服務(wù)與以太坊智能合約橋接起來”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

1、什么是Eventeum

Eventeum是一個(gè)以太坊事件監(jiān)聽服務(wù),它提供了智能合約與中間件層之間的橋接功能。Eventeum支持動(dòng)態(tài)訂閱以太坊事件,當(dāng)以太坊智能合約事件觸發(fā)時(shí),包含事件詳情的消息將廣播到消息總線上(例如Kafka或RabbitMQ),進(jìn)而被后端服務(wù)利用。

如何使用Eventeum將后端微服務(wù)與以太坊智能合約橋接起來

Eventeum的主要特性包括:

  • 可動(dòng)態(tài)配置

應(yīng)用可以利用Eventeum提供的REST api動(dòng)態(tài)訂閱或取消訂閱以太坊智能合約事件。

  • 高可用性

Eventeum實(shí)例彼此通信以確保所有實(shí)例訂閱相同的以太坊智能合約事件集。

  • 彈性

可以自動(dòng)檢測(cè)節(jié)點(diǎn)失效,當(dāng)節(jié)點(diǎn)恢復(fù)工作后訂閱可以從失效時(shí)的區(qū)塊繼續(xù)。

  • 分叉容錯(cuò)

Eventeum可以配置事件”確認(rèn)“所需的區(qū)塊數(shù)。如果在此期間發(fā)生了區(qū)塊鏈的分叉,Eventeum會(huì)廣播一個(gè)消息到網(wǎng)絡(luò)中,以便讓你的后端服務(wù)對(duì)分叉事件進(jìn)行及時(shí)響應(yīng)。

2、部署Eventeum

Eventeum目前支持3種廣播機(jī)制:

  • Kafka

  • HTTP Post

  • RabbitMQ

在這個(gè)教程中,我們將使用Kafka。

部署Kafka的前提要求如下:

  • Java8

  • Maven

  • Mongo

  • Kafka

  • Zookeeper

  • Ethereum Node

  • Docker (可選)

docker是可選的,不過我建議使用docker套件,其中包含了上述大部分 依賴,只是需要先安裝Java8和Maven。

首先參考docker官網(wǎng)文檔,安裝Docker和Docker-compose。

然后克隆以太坊Eventeum軟件庫:

$ git clone https://github.com/ConsenSys/eventeum.git

檢出Eventeum代碼后,進(jìn)入項(xiàng)目目錄:

$ cd /path/to/eventeum/

編譯、測(cè)試、打包Eventeum項(xiàng)目:

$ mvn clean package

一體化安裝Eventeum的docker套件:

$ cd server
$ docker-compose -f docker-compose.yml build
$ docker-compose -f docker-compose.yml up

3、測(cè)試Eventeum

為了測(cè)試Eventeum,我們需要先在本地Parity節(jié)點(diǎn)(Eventeum自動(dòng)安裝的以太坊節(jié)點(diǎn))上部署一個(gè)示例智能合約,然后訂閱一個(gè)智能合約事件來通過Kafka廣播。

讓我們先部署CrudApp.sol合約,我們使用Remix IDE 和Metamask。

  • 打開Remix IDE,添加CrudApp.sol合約

  • 選擇合約所需的solc編譯器版本(我們使用0.4.23),然后編譯合約

  • 在Metamask上選擇節(jié)點(diǎn)Localhost:8545

  • 在Remix IDE中,切換到Run選項(xiàng)頁,然后選擇 當(dāng)前環(huán)境中的web3提供器 并進(jìn)行部署

現(xiàn)在,合約已經(jīng)部署到本地的Parity以太坊開發(fā)節(jié)點(diǎn)了。

4、注冊(cè)智能合約事件

現(xiàn)在我們需要注冊(cè)以太坊事件了,這樣Eventeum可以監(jiān)聽這些事件然后進(jìn)行廣播。Eventeum提供了REST api,下面介紹如何使用這個(gè)API來注冊(cè)智能合約事件。

注冊(cè)合約事件

  • 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調(diào)用上述API注冊(cè)指定的以太坊智能合約事件:

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"}] }
}'

注冊(cè)成功后,可以得到響應(yīng)中的ID?,F(xiàn)在讓我們調(diào)用合約方法以便觸發(fā)CountryEvent事件。為此我們繼續(xù)使用Remix IDE:

如何使用Eventeum將后端微服務(wù)與以太坊智能合約橋接起來

現(xiàn)在讓我們?yōu)閕nsert方法傳入?yún)?shù)(“USA”, “Elizabeth Warren ”, 327946410),一切正常的話,你就可以在Docker終端中看到交易。

5、在NodeJS服務(wù)中訂閱Eventeum服務(wù)

現(xiàn)在讓我們使用NodeJS服務(wù)來訂閱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);
});

可以如下運(yùn)行:

nodejs index.js

正如你看到的,我們使用的主題是Eventeum內(nèi)置的 contract-events 。 使用下面的命令查看Eventeum的全部內(nèi)建Kafka主題:

bin/kafka-topics.sh --list --zookeeper localhost:2181

結(jié)果如下:

__consumer_offsets
block-events
contract-events
filter-events
filter-events-dlteventeum
filter-events-erreventeum
filter-eventsnull

到此,關(guān)于“如何使用Eventeum將后端微服務(wù)與以太坊智能合約橋接起來”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI