• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

以太坊源码分析---go-ethereum之event

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文微信公众号 月牙寂道长 文章链接为:https://mp.weixin.qq.com/s/gdVIXq75MW3SrH6Of-wT2A

本文图片可能不太清晰,看清晰版本的,可以看原文链接微信公众号链接。

 

以太坊go-ethereum源码的模块划分非常清晰,所以其各个模块,几乎是相互独立的。

 

有一个以太坊的架构图:

图片来自:https://blog.csdn.net/s_lisheng/article/details/77990523

(已得到原作者转载许可)

 

以太坊源码分析---go-ethereum之MPT(Merkle-Patricia Trie) 是讲解其中Trie模块

 

此次分析的是事件Event模块

 

源码目录为:github.com/ethereum/go-ethereum/event

注:代码版本为1.0.0

 

 

 

Event

event是一个订阅与发布模块

 

先看看github.com/ethereum/go-ethereum/event/example_test.go

这里面显示了用法

22-24:定义了三个不同类型的数据结构

26:声明了一个TypeMux变量mux

29-30:注册订阅了两种数据类型的消息

31-37:开启一个协程,用于接收订阅消息

40-43:post发布消息

48:停止订阅发布系统

 

那么看源码github.com/ethereum/go-ethereum/event/event.go

 

46:读写锁

47:重点subm为保存注册的消息类型与订阅的者的muxsub

48:停止标识

 

其结构如下图

 

subm用于保存不同类型的消息订阅者,其中每个类型后面是一个队列,队列里保存的是muxsub,多个类型中,也可以有相同的订阅者muxsub

 

Subscribe

 

注册订阅者

58:声明一个变量订阅者sub

59-60:加锁

61-62:判断是否已经stop

64-65:判断subm是否初始化过,没有则初始化

67-77:为注册流程

    68:获取消息类型

    69:获取消息类型已经注册过的所有订阅者

    70:从旧的订阅者查找是否是重复订阅

    73-76:将新的订阅者放到队列尾部

 

这里的注册过程很简单也很清晰

 

Post

85:获取发布消息的类型

91:查找消息类型对于的订阅者队列

93-95:对每个订阅者进行消息传递 deliver

 

muxsub

 

消息订阅者

145:订阅发布者

154:消息读取chan

155:消息发布chan

 

162-163:初始化,读取和发送初始化都是同一个chan

读取

在example中,就有获取消息读取chan,进行等待读取的。如下图红框

 

发送

 

195:将ev通过postC发送

 

event/filter

过滤模块

还是先看案例

github.com/ethereum/go-ethereum/event/filter/filter_test.go

 

28:初始化了一个过滤系统 New

29:过滤系统启动 Start

30-42:Install过滤模块

43:Notify进行过滤

44:过滤系统停止 Stop

 

github.com/ethereum/go-ethereum/event/filter/filter.go

Filters

 

33:id记录filter数量

34:注册的过滤模块

35:事件chan

37:退出chan

22-24:Filter接口,两个方法Compare、Trigger

27-29:FilterEvent

 

Start

loop

主要流程在77-84

77:从事件chan中获取事件event

78:遍历所有注册的watcher

80:判断事件类型与watcher的类型是否一致

81:进行事件的Compare

82:进行Trigger

 

Install

其中id就是从0开始。就是将过滤的规则注册到watchers中

 

Notify

将需要过滤的事件,发送到过滤处理loop中

 

github.com/ethereum/go-ethereum/event/filter/generic_filter.go

一个简单的字符串过滤,实现了Compare和Trigger方法

 

eth_filter

流程是类似的

github.com/ethereum/go-ethereum/event/filter/eth_filter.go

这里的区别在于

filters是core.Filter(github.com/ethereum/go-ethereum/core中的)

 

Installfilter

注册,将filter注册到filters中(map[int]*core.Filter)

 

Start

filterLoop

订阅了三个类型的消息ChainEvent、TxPreEvent、state.Logs

93:从订阅的消息中,等待获取消息事件

95-102:处理的是ChainEvent

104-111:处理的是TxPreEvent

113-123:处理的是state.Logs

 

 

龚浩华

月牙寂道长

QQ 29185807

2018年09月04日

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go程序:变量声明、赋值与输出发布时间:2022-07-10
下一篇:
Dubbo-go 源码笔记(一)Server 端开启服务过程发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap