IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> Java监听链上智能合约事件 -> 正文阅读

[区块链]Java监听链上智能合约事件

1、事件的监听

在智能合约中定义的任何事件都将用Event方法在智能合约封装包中进行表示,该事件采用交易收据,并从中提取索引和非索引事件参数。
监听机制是建立在日志基础之上,如果智能合约触发了一个事件,那么该事件将写入以太坊日志;如果外部应用订阅了这个事件,那么应用就可以在日志中出现该事件后及时监测到,进而获取日志信息。

2、观察者模式和发布订阅模式区别

观察者模式:

所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。
在观察者模式中,观察者需要直接订阅目标事件;在目标发出内容改变的事件后,直接接收事件并作出响应。

演示示例:

解释一下几个名词的含义:
Observable (可观察者,即被观察者)
Observer (观察者)
subscribe (订阅)事件。
Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

导入依赖
<dependency>
    <groupId>io.reactivex.rxjava2</groupId>
    <artifactId>rxjava</artifactId>
    <version>2.2.21</version>
</dependency>
//被观察者
    Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> emitter) throws Exception {
            emitter.onNext("1");
            emitter.onNext("2");
            emitter.onNext("3");
            emitter.onComplete();
        }
    });
    //观察者
    Observer<String> observer = new Observer<String>() {
    
        //对监听到的内容做出逻辑解释
        @Override
        public void onNext(String value) {
            Log.info("onNext : " + value);
        }
        //逻辑异常,会调用此方法(和onComplete()二者互斥)
        @Override
        public void onError(Throwable e) {
            Log.info("onError");
        }
        //逻辑正常执行结束,会调用此方法
        @Override
        public void onComplete() {
            Log.info("onComplete" );
        }
    };
    //3,建立订阅关系
    observable.subscribe(observer);

发布订阅模式:

发布订阅模式属于广义上的观察者模式。
发布订阅模式是最常用的一种观察者模式的实现,并且从解耦和重用角度来看,更优于典型的观察者模式。
示例可参考redis的发布订阅模式,有兴趣的可以查找一下,这里不做详细的解释了。

在这里插入图片描述

3、通过web3j实现观察者模式

web3j的响应式函数可以使观察者通过事件去通知消息订阅者。
通过web3j对链服务建立连接,根据具体的事件去监听链上事件,实现跨服务订阅的一个效果。

在Ethereum以太坊中支持 三种web3j过滤器:
1、块滤波器(Block filters)
2、未决交易过滤器(Pending transaction filters)
3、主题过滤器(Topic filters)
块过滤器和未决交易过滤器提供了在网络上创建新交易或块的通知。
主题过滤器更灵活。允许根据提供的特定标准创建过滤器。

主题过滤器做出的示例demo:

Subscriber 对 Observer 接口进行了一些扩展,但他们的基本使用方式是完全一样的。

//添加要监听事件的主题,和合约地址
EthFilter filter = new EthFilter(new DefaultBlockParameterNumber(startBlock),DefaultBlockParameterName.LATEST, "合约地址");
//与链建立连接
Web3j web3j = Web3j.build(new HttpService("http://127.0.0.1:6792"));
web3j.ethLogObservable(filter).subscribe(new Subscriber<Log>() {
		//在监听逻辑执行之前,先执行此方法
        @Override
        public void onStart() {
            Log.info("onStart");
        }
        @Override
        public void onNext(Log l) {
        	//处理逻辑
            Log.info("onNext : " + l);
        }
        @Override
        public void onError(Throwable e) {
            Log.info("onError");
        }
        @Override
        public void onComplete() {
            Log.info("onComplete" );
        }
        });

块和交易过滤器:

可以根据具体的需求选择合适的过滤器。

/**
 * 接收所有新块把它们添加到区块链(false参数指定我们只需要块)
 */
Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
    ...
});
/**
 * 接收所有新交易,把它们添加到块链
 */
Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
    ...
});
/**
 * 接收所有待提交交易并提交到网络(即在它们被分组在一起之前)
 */
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
    ...
});

/**
 * 不再需要的时候取消订阅unsubscribe
 */
subscription.unsubscribe();

再现过滤器:

/**
 * 从区块链再现一系列块
 * startBlockNumber:开始的块高
 * endBlockNumber:结束的块高
 * fullTxObjects:如果为true,则提供嵌入在块中的交易,否则提供交易散列
 */
Subscription subscription = web3j.replayBlocksObservable(
        startBlockNumber, endBlockNumber, fullTxObjects)
        .subscribe(block -> {
            ...
});
/**
 * 再现包含在一个块范围内的单个交易:
 */
Subscription subscription = web3j.replayTransactionsObservable(
        startBlockNumber, endBlockNumber)
        .subscribe(tx -> {
            ...
});
/**
 * 重置所有的区块到最新的位置,那么当有新建区块的时候会通知你
 */
Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewBlocksObservable(
        startBlockNumber, fullTxObjects)
        .subscribe(block -> {
            ...
});
/**
 * 重置所有的交易到最新的位置,那么当有新建交易的时候会通知你
 */
Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewTransactionsObservable(
        startBlockNumber)
        .subscribe(tx -> {
            ...
});

参考:https://www.jianshu.com/p/6954cd0defec
参考:https://www.wenjiangs.com/doc/hcjb47yt
参考:https://gank.io/post/560e15be2dca930e00da1083

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:14:28  更:2021-07-15 16:14:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:40:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码