• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • 安全教程
  • 安全设置
  • 杀毒防毒
  • 病毒查杀
  • 脚本攻防
  • 入侵防御
  • 工具使用
  • 业界动态
  • Exploit
  • 漏洞分析
  • 加密解密
  • 手机安全
  • 区块链
您的位置:首页 > 网络安全 >区块链 > golang-event 在以太坊中的使用

golang-event 在以太坊中的使用

作者:巴比特资讯 字体:[增加 减小] 来源:互联网

巴比特资讯向大家分享了golang-event 在以太坊中的使用,其中包含golang,以太坊等知识点,遇到此问题的同学们可以参考下
go-ethereum中go-event库的使用

github.com/ethereum/go-ethereum/event 包实现了一个事件发布订阅的库,使用接口主要是 event.Feed 类型,以前还有 event.TypeMux 类型,看代码注释,说过时了,目前主要使用 Feed 类型。
package main
?import (
?"fmt"
?"sync"
?"github.com/ethereum/go-ethereum/event"
?)
?func main() {
?type someEvent struct{ I int }
?var feed event.Feed
?var wg sync.WaitGroup
?ch := make(chan someEvent)
?sub := feed.Subscribe(ch)
?wg.Add(1)
?go func() {
?defer wg.Done()
?for event := range ch {
?fmt.Printf("Received: %#v\n", event.I)
?}
?sub.Unsubscribe()
?fmt.Println("done")
?}()
?feed.Send(someEvent{5})
?feed.Send(someEvent{10})
?feed.Send(someEvent{7})
?feed.Send(someEvent{14})
?close(ch)
?wg.Wait()
?}

通过调用 event.Feed 类型的Subscrible方法订阅事件通知,需要使用者提前指定接收事件的 channel,Subscribe 返回 Subscription 对象,是一个接口类型:

type Subscription interface {
?Err() // returns the error channel
?Unsubscribe()
?// cancels sending of events, closing the error channel
?}
Err() 返回获取error 的channel,调用Unsubscribe()取消事件订阅。事件的发布者调用 Send() 方法,发送事件。

可以使用同一个channel实例,多次调用Feed 的Subscrible()方法:
package main
?import (
?"fmt"
?"sync"
?"github.com/ethereum/go-ethereum/event"
?)
?func main() {
?var (
?feed event.Feed
?recv sync.WaitGroup
?sender sync.WaitGroup
?)
?ch := make(chan int)
?feed.Subscribe(ch)
?feed.Subscribe(ch)
?feed.Subscribe(ch)
?expectSends := func(value, n int) {
?defer sender.Done()
?if nsent := feed.Send(value); nsent != n {
?fmt.Printf("send delivered %d times, want %d\n", nsent, n)
?}
?}
?expectRecv := func(wantValue, n int) {
?defer recv.Done()
?for v := range ch {
?if v != wantValue {
?fmt.Printf("received %d, want %d\n", v, wantValue)
?} else {
?fmt.Printf("recv v = %d\n", v)
?}
?}
?}
?sender.Add(3)
?for i := 0; i < 3; i++ {
?go expectSends(1, 3)
?}
?go func() {
?sender.Wait()
?close(ch)
?}()
?recv.Add(1)
?go expectRecv(1, 3)
?recv.Wait()
?}
这个例子中, 有三个订阅者, 有三个发送者, 每个发送者发送三次1, 同一个channel ch 里面被推送了9个1。

ethereum event 库还提供了一些高级别的方便接口, 比如event.NewSubscription函数,接收一个函数类型,作为数据的生产者, producer本身在后台一个单独的goroutine内执行, 后台goroutine往用户的channel 发送数据:
package main
?import (
?"fmt"

您可能想查找下面的文章:

  • golang-event 在以太坊中的使用

相关文章

  • BigONE交易平台,最新版注册和认证详细教程来了
  • 备受争议的脑钱包(Brainwallet)
  • 理解ERC-20 token合约
  • 一文读懂比特币分叉
  • 几张简单的图就揭示了整个区块链世界
  • 区块链简介-什么是私有链
  • 临界(Hashgard)新手引导教程
  • 如何安全地存储数字加密货币
  • 如何妥善备份你的以太坊钱包?
  • 丝绒分叉是什么鬼?据说它能解决硬分叉和软分叉的争议

文章分类

  • 安全教程
  • 安全设置
  • 杀毒防毒
  • 病毒查杀
  • 脚本攻防
  • 入侵防御
  • 工具使用
  • 业界动态
  • Exploit
  • 漏洞分析
  • 加密解密
  • 手机安全
  • 区块链

最近更新的内容

    • 如何编写以太坊ERC-20智能合约的单元测试
    • DFINITY区块链:密码学技术介绍
    • DAG与区块链简介(从零开始学区块链 184)
    • Qtum量子链对等节点通信原理剖析以及调试
    • 蚂蚁矿机E3挖矿教程
    • 某乎上面对于区块链的理解(一)
    • imToken如何导出与导入钱包
    • 加密经济学:区块链技术前景之路基
    • 为什么去中心化和分布式存储对一个更好的互联网至关重要?
    • 多空双方力量浮标- AD(Chaikin A/D线)策略

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有