1. 程式人生 > >web3j開發以太坊過濾器(filter)和智慧合約事件(event)

web3j開發以太坊過濾器(filter)和智慧合約事件(event)

web3j過濾器提供以太坊網路發生的某些事件的通知,對java和安卓程式設計師來說很有用。在Ethereum以太坊中支援三類過濾器:

  • 塊濾波器(Block filters)
  • 未決交易過濾器(Pending transaction filters)
  • 主題過濾器(Topic filters)

塊過濾器和未決交易過濾器提供了在網路上建立新交易或塊的通知。

主題過濾器更靈活。允許根據提供的特定標準建立過濾器。

不幸的是,除非你使用WebSocket連線到Geth,否則通過JSON-RPC API來處理過濾器是一個繁瑣的過程,這裡需要輪詢以太坊客戶端,以便了解HTTP和IPC所請求的實時同步特徵,是否有任何新的更新到你的過濾器。此外,塊和交易過濾器只提供交易或區塊鏈hash值,因此需要進一步的請求來獲得hash對應的實際交易或塊。

web3j的過濾器解決了這些問題,因此你有一個完全非同步的基於事件的API來處理過濾器。它使用RXJava的可觀測性Observables,它提供了與事件協同工作的一致API,這有助於通過功能組合將JSON-RPC呼叫連結在一起。

注:Infura不支援過濾器。

塊和交易過濾器

接收所有新塊把它們新增到區塊鏈(false引數指定我們只需要塊就ok,而不需要嵌入交易):

Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
    ...
});

接收所有新交易,把它們新增到塊鏈:

Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
    ...
});

接收所有待提交交易並提交到網路(即在它們被分組在一起之前):

Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
    ...
});

不再需要的時候取消訂閱unsubscribe

subscription.unsubscribe();

另外還提供了其他回撥,它們簡單地提供了塊或交易hash,這些細節涉及

Web3JRX介面。

再現過濾器

webjs還提供用於再現塊和交易歷史的過濾器。

從區塊鏈再現一系列塊:

Subscription subscription = web3j.replayBlocksObservable(
        <startBlockNumber>, <endBlockNumber>, <fullTxObjects>)
        .subscribe(block -> {
            ...
});

再現包含在一個塊範圍內的單個交易:

Subscription subscription = web3j.replayTransactionsObservable(
        <startBlockNumber>, <endBlockNumber>)
        .subscribe(tx -> {
            ...
});

也可以獲得Web3J再現最新的塊,並在你看過後提供通知(通過提交Observable):

Subscription subscription = web3j.catchUpToLatestBlockObservable(
        <startBlockNumber>, <fullTxObjects>, <onCompleteObservable>)
        .subscribe(block -> {
            ...
});

或者,也可以在你再現最新的塊後,通知新建立的後續塊:

Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewBlocksObservable(
        <startBlockNumber>, <fullTxObjects>)
        .subscribe(block -> {
            ...
});

如上所述,幷包含在塊內的交易:

Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewTransactionsObservable(
        <startBlockNumber>)
        .subscribe(tx -> {
            ...
});

所有上述過濾器都是通過Web3JRX介面匯出的。

主題過濾器和EVM事件

主題過濾器捕獲在網路中發生的以太坊虛擬機器(EVM)事件的細節。這些事件是由智慧合約建立的,並存儲在與智慧合約相關聯的交易日誌中。

使用EthFilter型別指定希望應用於過濾器的主題。這可以包括希望應用過濾器的智慧合約的地址。你還可以提供特定的主題進行篩選。其中單個主題表示智慧合約上的索引引數:

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
        DefaultBlockParameterName.LATEST, <contract-address>)
             [.addSingleTopic(...) | .addOptionalTopics(..., ...) | ...];

然後可以使用類似於上面的塊和交易過濾器的語法建立該過濾器:

web3j.ethLogObservable(filter).subscribe(log -> {
    ...
});

過濾器主題只能引用索引的Solidity事件引數。不可能對非索引事件引數進行篩選。此外,對於可變長度陣列型別(如字串和位元組)的任何索引事件引數,它們的值的Keccak-256 hash 儲存在EVM日誌上。不可能使用它們的全部值來儲存或篩選。

如果建立一個沒有與之相關聯的主題的過濾器例項,則在網路中發生的所有EVM事件都將由過濾器捕獲。

操作組合標註

除了send()sendAsync之外,所有JSON-RPC方法在web3j中都實現了支援observable()方法來建立可觀察的非同步執行請求。這使得將JSON-RPC呼叫組合成新的函式是非常容易和直接的。

例如, blockObservable本身由許多單獨的JSON-RPC呼叫組成:

public Observable<EthBlock> blockObservable(
        boolean fullTransactionObjects, long pollingInterval) {
    return this.ethBlockHashObservable(pollingInterval)
            .flatMap(blockHash ->
                    web3j.ethGetBlockByHash(blockHash, fullTransactionObjects).observable());
}

在這裡,我們首先建立一個可觀察的,它提供每個新建立的塊的塊雜湊的通知。然後,我們使用flatMap呼叫ethGetBlockByHash,以獲得完整的塊細節,這是傳遞給可觀察者的訂閱伺服器的細節。

進一步的例子

對於使用手動篩選器API的演示,可以檢視EventFilterIT

  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。

相關推薦

web3j開發過濾器(filter)智慧合約事件(event)

web3j過濾器提供以太坊網路發生的某些事件的通知,對java和安卓程式設計師來說很有用。在Ethereum以太坊中支援三類過濾器: 塊濾波器(Block filters) 未決交易過濾器(Pending transaction filters) 主題過濾器(Topic

java開發過濾器(filter)智能合約事件(event)

java web3j filter event 以太坊 ethereum 區塊鏈 智能合約 過濾器 事件 web3j過濾器提供以太坊網絡發生的某些事件的通知,對java和安卓程序員來說很有用。在Ethereum以太坊中支持三類過濾器:

web3j教程:過濾器(filter)篩選智慧合約事件(event)監聽

web3j過濾器提供以太坊網路發生的某些事件的通知,對java和安卓程式設計師來說很有用。在Ethereum以太坊中支援三類過濾器: 塊濾波器(Block filters) 未決交易過濾器(Pending transaction filters) 主題過濾器

由Trust Wallet理解錢包管理智慧合約

在前一篇文章中, 已經介紹過Trust的專案架構、業務流程等了。這篇文章將會解讀一些核心的功能, 包括前一篇文章提到的EtherKeystore這個業務類, 還有網路層的如何呼叫智慧合約、其它呼叫合約的方式, 以及以太坊交易的結構和流程等。 錢包管理 錢包管

web3j開發智能合約快速入門(特別適合javaandroid開發者)

latest struct name admin 套接字 信息 mes add decimal web3j簡介 web3j是一個輕量級、高度模塊化、響應式、類型安全的Java和Android類庫提供豐富API,用於處理以太坊智能合約及與以太坊網絡上的客戶端(節點)進行集成。

web3j教程:java使用web3j開發智慧合約交易

從廣義上講,有web3j支援三種類型的以太坊交易: 1.以太幣從一方交易到另一方 2.建立一個智慧合約 3.與智慧合約交易 為了進行這些交易,必須有以太幣(以太坊區塊鏈的代幣)存在於交易發生的以太坊賬戶中。這是為了支付gas成本,這是為支付參與交易的以太坊客戶端的交

如何在Spring Boot中開始web3j開發

通過Spring的依賴注入將web3j整合到Spring Boot應用程式中。此處提供了示例應用程式: package org.web3j.examples; import java.io.IOException; import org.apache.http.conn.HttpHostCo

java類庫web3j開發智慧合約快速入門

web3j簡介 web3j是一個輕量級、高度模組化、響應式、型別安全的Java和Android類庫提供豐富API,用於處理以太坊智慧合約及與以太坊網路上的客戶端(節點)進行整合。 可以通過它進行以太坊區塊鏈的開發,而無需為你的java應用平臺編寫整合程式碼。

Eclipse中使用Web3j開發應用

在我們的web3j以太坊開發課程中,預置程式碼是在終端命令列使用gradle進行構建的。如果希望在熟悉的Eclipse中開發web3j以太坊應用,這個快速教程將告訴你如何進行配置。 我們將分為6個步驟來介紹如何在Eclipse中使用Gradle專案開發web3

solidity開發代幣智能合約

以太坊 智能合約 solidity 代幣 開發 智能合約開發是以太坊編程的核心之一,而代幣是區塊鏈應用的關鍵環節,下面我們來用solidity語言開發一個代幣合約的實例,希望對大家有幫助。 以太坊的應用被稱為去中心化應用(DApp),DApp的開發主要包括兩大部分: 智能合約的開發 用戶

預言機與智慧合約開發

什麼是以太坊預言機?智慧合約就其性質而言,能夠執行各種演算法並存儲查詢資料。預言機可以監控以太坊區塊鏈事件並能將監控結果發回智慧合約。因為每個節點每次都需要大量計算,所以從Ethereum智慧合約開發中進行頻繁的網路請求是切不實際的。這樣,智慧合約就可以與鏈外的世界進行互動了

第九課 如何除錯官網的智慧合約眾籌案例

#2.眾籌和代幣(TOKEN)的投資邏輯 **ICO(Initial Crypto-Token Offering,首次代幣眾籌)**被認為是區塊鏈生態內生的一種新型投融資方式,概念起源於IPO,只不過募集的貨幣變為比特幣、以太坊等通用數字貨幣,從而支援專案的

如何通過構建智慧合約來銷售商品?

如何通過構建以太坊智慧合約來銷售商品?這是個問題。 毫無疑問,比特幣已經改變了我們看待和理解什麼是金錢,價值以及最近由智慧合約產生的所有權的方式。這很有趣,因為幾乎每個人都聽說過它或加密貨幣。來自許多業務領域的人,不僅僅是我們,IT工作者。 在本文中,我將展示我關於以太坊的第一份智慧

如何在私有區塊鏈上編寫、部署以及與進行互動的智慧合約

摘要:本文作者以極長的篇幅給出了在私有區塊鏈上編寫、部署以及與以太坊進行互動的智慧合約的較為完整的程式碼、相關細節步驟、使用者介面等。作者是希望藉助他這篇文章,大家可以自行在私有以太坊區塊鏈上編寫並部署一個智慧合約,以下是譯文。 這裡的規則是:如果通讀本文

從零構建(Ethereum)智慧合約到專案實戰——學習筆記

P1 、1-初識Bitcoin錢包 https://bitcoin.org/zh_CN/choose-your-wallet P 、2-比特幣錢包BitPay使用教程P 、3-玩轉以太坊各種錢包P 、4-手把手教你申請ENS (Ethereum Name Service)P 、1-會說話的PPT,從開發者

『區塊鏈』從零構建(Ethereum)智慧合約到專案實戰-黎躍春-專題視訊課程...

『區塊鏈』從零構建以太坊(Ethereum)智慧合約到專案實戰—3317人已學習 課程介紹        區塊鏈技術被認為是繼蒸汽機、電力、網際網路之後,下一代性的核心技術。 如果說蒸汽機釋放了人們的生產力,電力解決了人們基本的生活需求,網際網路徹底改變了資訊傳遞的方式,那麼

】深入理解智慧合約(合約調合約)

一、前言       關於智慧合約的描述,大家在網上百度能查到一大堆。看來看去也能看個似懂非懂,但是稍微具體點呢,智慧合約到底都能幹什麼,可以轉賬提現嗎?可以合約呼叫合約嗎?可以釋出多個合約嗎? 關於智慧合約的疑問真的很多,只能一邊開發一邊總結了。以下是我最

用Visual Studioc#開發dapp

分享 chain dap 本地 當前 疑問 運行 course 啟動 最近區塊鏈技術引起了我的註意。我剛開始了解它,就看到了區塊鏈去中心化架構的巨大潛力,並且它能夠簡化各種現有繁瑣的流程,通過各種形式的合約。 作為一名.NET開發人員,我主要使用的是一些提供中心數據源的架構

java程式設計師使用web3j進行開發詳解

如何使用web3j為Java應用或Android App增加以太坊區塊鏈支援,教程內容即涉及以太坊中的核心概念,例如賬戶管理包括賬戶的建立、錢包建立、交易轉賬,交易與狀態、智慧合約開發與互動、過濾器和事件等,同時也詳細說明如何使用web3j提供的API開發介面與以太坊進行互動,是java工程師學習以

java如何在Spring Boot中用web3j開始開發智慧合約

通過Spring的依賴注入將web3j整合到Spring Boot應用程式中。此處提供了示例應用程式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25