本文是区块链浏览器系列的第三篇,本文介绍区块链浏览器的主体部分,即区块数据的解析。

这一版本的区块链浏览器是基于gin实现的,只提供三种接口:

  • /block/uploadPOST,上传Protobuf格式的区块数据文件
  • /block/parse/:msgTypeGET,根据msgType来解析上传的区块文件
  • /block/update/:channelPOST,根据上传的json格式配置文件生成Protobuf格式的文件

结构如下:

$ tree
.
├── LICENSE
├── README.md
├── cmd # 解析区块的示例
│   ├── main.go
│   ├── mychannel_config.block
│   └── mychannel_newest.block
├── conf # 浏览器的配置
│   ├── conf.pb.go
│   └── conf.proto
├── configs # 配置文件存放路径
│   └── config.yaml
├── go.mod
├── go.sum
├── log # 日志库
│   └── logger.go
├── main.go # 程序入口
├── service # 项目实现代码
│   ├── handler.go
│   ├── service.go
│   └── utils.go
└── utils # 一些工具函数
├── protoutils.go
└── utils.go 7 directories, 17 files

详细介绍

配置介绍

当前版本配置比较简单,使用Protobuf进行定义:

syntax = "proto3";

package browser.conf;

option go_package = "./;conf";

import "google/protobuf/duration.proto";

message Bootstrap {
Server server = 1;
Log log = 2;
} message Server {
message HTTP {
string network = 1;
string addr = 2;
google.protobuf.Duration timeout = 3;
}
message TLS {
// 是否启用tls
bool enbale = 1;
// 证书路径
string cert = 2;
// 对应私钥路径
string key = 3;
}
HTTP http = 1;
TLS tls = 2;
} message Log {
// 日志级别设置
// 支持debug(-1)、info(0)、warn(1)、error(2)、dpanic(3)、panic(4)、fatal(5)
int32 level = 1;
// 日志输出格式,支持json or console
string format = 2;
}

日志

log基于zap进行简单封装使用:

func DefaultLogger(logConf *conf.Log) *zap.Logger {
var coreArr []zapcore.Core //获取编码器
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder //指定时间格式
encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder //按级别显示不同颜色
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder //显示完整文件路径 var encoder zapcore.Encoder //NewJSONEncoder()输出json格式,NewConsoleEncoder()输出普通文本格式
if logConf.Format == "console" {
encoder = zapcore.NewConsoleEncoder(encoderConfig)
} else {
encoder = zapcore.NewJSONEncoder(encoderConfig)
} //日志级别
highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { //error级别
return lev >= zap.ErrorLevel
})
lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { //info和debug级别,debug级别是最低的
return lev < zap.ErrorLevel && lev >= zap.DebugLevel
}) infoCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout)), lowPriority) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志
errorCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout)), highPriority) //第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志 coreArr = append(coreArr, infoCore)
coreArr = append(coreArr, errorCore) return setLogLevel(zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()), logConf.GetLevel())
} func setLogLevel(log *zap.Logger, level int32) *zap.Logger {
switch level {
case -1:
return log.WithOptions(zap.IncreaseLevel(zapcore.DebugLevel))
case 0:
return log.WithOptions(zap.IncreaseLevel(zapcore.InfoLevel))
case 1:
return log.WithOptions(zap.IncreaseLevel(zapcore.WarnLevel))
case 3:
return log.WithOptions(zap.IncreaseLevel(zapcore.DPanicLevel))
case 4:
return log.WithOptions(zap.IncreaseLevel(zapcore.PanicLevel))
case 5:
return log.WithOptions(zap.IncreaseLevel(zapcore.FatalLevel))
default:
return log.WithOptions(zap.IncreaseLevel(zapcore.ErrorLevel))
}
}

service

service为本项目的主体,提供区块解析服务。

/block/upload/block/parse/:msgType二者配合使用。

/block/upload完成文件上传后,会存储在./pb目录下,通过session记录上传的Protobuf格式区块文件与用户交互:

type pbCache struct {
// 缓存session
cache sync.Map
// 定时器,超时后自动删除对应的pb文件
time *time.Ticker
} type pbFile struct {
// pb文件名称,文件存储在服务端的名称
Name string
// 文件过期时间,过期后自动删除
Expired int64
}

调用/block/parse/:msgType时,服务端通过loadSessionsession中获取,每次调用都会对当前pb文件自动续期:

func loadSession(ctx *gin.Context) (string, error) {
// get filename from session
session := sessions.Default(ctx)
buf := session.Get("filename")
if buf == nil {
srvLogger.Error("no filename in session")
return "", errors.New("no filename in session")
} // 更新pbFile过期时间
pf := &pbFile{}
pf.Unmarshal([]byte(buf.(string)))
pf.renewal() data, _ := pf.Marshal()
session.Set("filename", string(data))
session.Save()
return pf.Name, nil
}

msgType支持以下类型:

  • block:将上传的pb文件解析为json
  • header:获取区块header域信息
  • metadata:获取区块metadata域信息
  • data:获取区块的data域信息
  • config:获取配置块信息,如果解析的是数据块,将返回空信息
  • chaincode:获取智能合约信息
  • actionstransaction:区块中包含的交易信息
  • input:获取交易信息中的输入信息
  • rwset:获取交易中包含的读写集信息
  • channel:获取通道信息
  • endorsements:获取交易的背书信息
  • creator:获取交易发起者信息

调用/block/update/:channel时,可以将json格式的配置块信息转换为Protobuf格式。


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意


Fabric区块链浏览器(1)的更多相关文章

  1. 第五章 FISCO BCOS 区块链浏览器的部署

    想了解相关区块链开发,技术提问,请加QQ群:538327407 前提 前面我们已经通过底层部署.sdk调测.自定义智能合约编写与部署.联合单元测试调测,已经初步对FISCO BCOS的区块链底层和实际 ...

  2. hyperledger explorer 结合 fabric1.4 搭建 区块链浏览器 踩坑记录

    博主通过这篇博客的步骤搭建区块链浏览器:https://blog.csdn.net/qq_32675427/article/details/99946945 进行到下面这一步时出现各种异常,浪费了博主 ...

  3. github源码开源区块链浏览器

    <ignore_js_op> 帅爆了吧 https://blockexplorer.com/ github源码:https://github.com/bitcoin-blockexplor ...

  4. 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1

    摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...

  5. 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系

    ☞ ░ 前往老猿Python博文目录 ░ 一.超级账本(hyperledger) 超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,成员包括 ...

  6. 区块链学习7:超级账本项目Fabric中的背书、背书节点、背书策略、背书签名

    ☞ ░ 前往老猿Python博文目录 ░ 在Hyperledger Fabric区块链中,有背书节点进行背书,Hyperledger Fabric 使用背书策略来定义哪些节点需要执行交易. Hyper ...

  7. Hyperledger Fabric 2.x Java区块链应用

    一.说明 在上一篇文章中 <Hyperledger Fabric 2.x 自定义智能合约> 分享了智能合约的安装并使用 cli 客户端进行合约的调用:本文将使用 Java 代码基于 fab ...

  8. 如何从零开始学习区块链技术——推荐从以太坊开发DApp开始

    很多人迷惑于区块链和以太坊,不知如何学习,本文简单说了一下学习的一些方法和资源. 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取 ...

  9. NEO区块链-DAPP开发直通车-第零篇

    什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称.   NEL将为开发DAPP提供全面的服务 ...

  10. [币严区块链]BitcoinCash - BCH钱包地址生成与扫块充值监控(JAVA版)

    本文的方案无需自建节点,因为BCH当前区块数据大小已经达到200G以上,BTC区块数据也已超过300G,若每个币都自建节点,对云服务器的消耗会非常大. 认识BitcoinCash(BCH) Bitco ...

随机推荐

  1. appuploader   iOS 应用自动发布

    appuploader是一款专门为 iOS 和 Android 开发人员设计的自动化工具,可以帮助开发人员轻松解决一些繁琐的任务,例如生成屏幕截图.处理配置文件和发布应用程序等.这个工具可以让开发人员 ...

  2. 让 Java 打包缩小一大半,Solon v1.9.3 发布

    相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...

  3. Kubernetes(K8S) 介绍

    Master Api Server 统一入口,以 Restful 方式,交给 etcd 存储 Scheduler 节点调试,选择 Node 节点,做应用部署 Controller Manager 处理 ...

  4. 远程桌面CredSSP 加密数据库修正

    如图所示: 远程桌面连接,出现身份验证错误,要求的函数不受支持,这可能是由于 CredSSP 加密数据库修正

  5. Jmeter软件测试

    1.1. 性能测试是什么 基于协议模拟用户发出请求,对服务器形成一定负载,来测试服务器的性能指标是否满足要求 性能指标关注点:时间性能.空间性能 性能测试与页面无关 性能测试定义:指通过自动化的测试工 ...

  6. 一个IT老码农的创业和生活(一)抑郁和自杀

    2019年2月18日,离我的38周岁生日还差两个月,我的编程培训班"源栈"开张了.   在此之前,从我2002年大学毕业,6年时间,我先后做过英语教师.实习律师.公司法务.装修公司 ...

  7. 关于ABAP索引

    1.什么是索引 如果把数据库表看做一本书,索引就可以看做书的检索目录.目录中包含书中的大小标题(部分字段数据),并且有对应的数据表条目的页码(指针),可以快速的访问数据库表中对应行的所有字段内容 一个 ...

  8. OpenTSDB 数据存储详解

    本文首发于 vivo互联网技术 微信公众号链接: https://mp.weixin.qq.com/s/qayKiwk5QAIWI7-nyD3FVA作者:DuZhimin 随着互联网.尤其是物联网的发 ...

  9. 打造绿色城市,数字孪生天然气站 3D 可视化

    前言 天然气作为常见的燃料,与我们的生活息息相关,而对于这种燃料的存储与传输,对于天然气供应站有着严格的要求.燃气企业一般都会将点供站设计为无人值守站,而往往在运营管理过程中,对点供站的安全管理尤为重 ...

  10. 深度学习基础课: “判断性别”Demo需求分析和初步设计(下2)

    大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放1 本节课录像回 ...