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

golang-event 在以太坊中的使用

作者:巴比特资讯 字体:[增加 减小] 来源:互联网 时间:2018-11-03

巴比特资讯向大家分享了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"
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

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

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

相关文章

  • 2018-11-03如何以简单的方式创建ERC20代币
  • 2018-11-03瑞波币Ripple(XRP)最新详细教程
  • 2018-11-03BLOCKBENCH:一种评估私有链的框架(上)
  • 2018-11-03区块链落地从p2p这几个应用方向出发
  • 2018-11-03Kraken比特币交易所图文教程——注册与认证
  • 2018-11-03IOTA(埃欧塔)钱包使用教程
  • 2018-11-03初学者如何在IBM Bluemix(IBM云)中部署自己的区块链
  • 2018-11-03Hcash钱包和挖矿方法教程
  • 2018-11-03安全代币中的安全和隐私协议
  • 2018-11-03什么是Plasma,Plasma Cash?

文章分类

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

最近更新的内容

    • 如何使用U盘创建自己的比特币钱包
    • Chrome插件钱包MetaMask介绍及教程
    • 基于服务众筹的合法性原理构建ICO的合规思路
    • EMONT Frenzy一EMONT联盟的区块链游戏
    • 加密经济学:区块链技术前景之路基
    • DAG与区块链简介(从零开始学区块链 184)
    • 各区块链架构的横向比较
    • 比原链(Bytom)合约交易构造流程
    • ZB网身份验证器下载及使用教程
    • 巨头征战新零售,实体小玩家如何求得生机?

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

©2015-2018 All Rights Reserved. 微课江湖 版权所有