从源码中解析fabric区块数据结构(一)
从源码中解析fabric区块数据结构(一)
前言
最近打算基于fabric-sdk-go实现hyperledger fabric浏览器,其中最重要的一步就是解析fabric的上链区块。虽说fabric是Golang实现的,但直到2021年2月1号才发布了第一个稳定版fabric-sdk-go,而且官方几乎没有响应的文档介绍。对于fabric-sdk-go,基本都是参照源码中的测试用例来使用;而要实现区块链浏览器,仅靠测试用例还差好多,特别是对出块信息的解析。
通过event.Client.RegisterBlockEvent()可以监听fabric的出块事件,但返回的信息中有用的是一个BlockEvent类型的chan,定义如下:
// BlockEvent contains the data for the block event
type BlockEvent struct {
// Block is the block that was committed
Block *cb.Block
// SourceURL specifies the URL of the peer that produced the event
SourceURL string
}
区块链浏览器需要的所有信息基本都包含在Block中,其定义如下:
// This is finalized block structure to be shared among the orderer and peer
// Note that the BlockHeader chains to the previous BlockHeader, and the BlockData hash is embedded
// in the BlockHeader. This makes it natural and obvious that the Data is included in the hash, but
// the Metadata is not.
type Block struct {
Header *BlockHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
Data *BlockData `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
Metadata *BlockMetadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"`
}
本文作为区块链浏览器系列的开篇,结构体中各字段的含义会在之后的文章中一一介绍,这里就不再过多介绍。接下来将以类图的形式来解析区块中包含的信息。
class Block{
Header *BlockHeader
Data *BlockData
Metadata *BlockMetadata
}
class BlockHeader{
Number uint64
PreviousHash []byte
DataHash []byte
}
class BlockData{
Data [][]byte
}
class BlockMetadata{
Metadata [][]byte
}
class Metadata{
Value []byte
Signatures []*MetadataSignature
}
class MetadataSignature{
SignatureHeader []byte
Signature []byte
IdentifierHeader []byte
}
class SignatureHeader{
Creator []byte
Nonce []byte
}
class SerializedIdentity{
Mspid string
IdBytes []byte
}
class Certificate{
crypto/x509.Certificate
}
class IdentifierHeader{
Identifier uint32
Nonce []byte
}
class Envelope{
Payload []byte
Signature []byte
}
class Payload{
Header *Header
Data []byte
}
class Header{
ChannelHeader []byte
SignatureHeader []byte
}
class ChannelHeader{
Type int32
Version int32
Timestamp *timestamp.Timestamp
TxId string
Epoch uint64
Extension []byte
TlsCertHash []byte
}
class Transaction{
Actions []*TransactionAction
}
class TransactionAction{
Header []byte
Payload []byte
}
class ChaincodeActionPayload{
ChaincodeProposalPayload []byte
Action *ChaincodeEndorsedAction
}
class ChaincodeEndorsedAction{
ProposalResponsePayload []byte
Endorsements []*Endorsement
}
class ProposalResponsePayload{
ProposalHash []byte
Extension []byte
}
class Endorsement{
Endorser []byte
Signature []byte
}
class ChaincodeProposalPayload{
Input []byte
TransientMap map[string][]byte
}
class ChaincodeInvocationSpec{
ChaincodeSpec *ChaincodeSpec
}
class ChaincodeSpec{
Type ChaincodeSpec_Type
ChaincodeId *ChaincodeID
Input *ChaincodeInput
Timeout int32
}
class ChaincodeID{
Path string
Name string
Version string
}
class ChaincodeInput{
Args [][]byte
Decorations map[string][]byte
IsInit bool
}
class ChaincodeAction{
Results []byte
Events []byte
Response *Response
ChaincodeId *ChaincodeID
}
class TxReadWriteSet{
DataModel TxReadWriteSet_DataModel
NsRwset []*NsReadWriteSet
}
class NsReadWriteSet{
Namespace string
Rwset []byte
CollectionHashedRwset []*CollectionHashedReadWriteSet
}
class KVRWSet{
Reads []*KVRead
RangeQueriesInfo []*RangeQueryInfo
Writes []*KVWrite
MetadataWrites []*KVMetadataWrite
}
Block --* BlockHeader
Block --* BlockData
Block --* BlockMetadata
BlockMetadata --* Metadata
Metadata --* MetadataSignature
MetadataSignature --* SignatureHeader
MetadataSignature --* IdentifierHeader
SignatureHeader --* SerializedIdentity
SerializedIdentity --* Certificate
BlockData --* Envelope
Envelope --* Payload
Payload --* Header
Payload --* Transaction
Transaction --* TransactionAction
TransactionAction --* ChaincodeActionPayload
ChaincodeActionPayload --* ChaincodeEndorsedAction
ChaincodeActionPayload --* ChaincodeProposalPayload
ChaincodeProposalPayload --* ChaincodeInvocationSpec
ChaincodeInvocationSpec --* ChaincodeSpec
ChaincodeSpec --* ChaincodeID
ChaincodeSpec --* ChaincodeInput
ChaincodeEndorsedAction --* Endorsement
ChaincodeEndorsedAction --* ProposalResponsePayload
ProposalResponsePayload --* ChaincodeAction
ChaincodeAction --* TxReadWriteSet
TxReadWriteSet --* NsReadWriteSet
NsReadWriteSet --* KVRWSet
Header --* ChannelHeader
Header --* SignatureHeader
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin92
Github: mengbin92
cnblogs: 恋水无意
从源码中解析fabric区块数据结构(一)的更多相关文章
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...
- 观V8源码中的array.js,解析 Array.prototype.slice为什么能将类数组对象转为真正的数组?
在官方的解释中,如[mdn] The slice() method returns a shallow copy of a portion of an array into a new array o ...
- Java设计模式:23种设计模式全面解析(超级详细)以及在源码中的应用
从网络上找的设计模式, 很全面,只要把UML类图看懂了, 照着类图将代码实现是很容易的事情. 步骤: 先看懂类图, 然后将代码实现, 之后再看文字 http://c.biancheng.net/des ...
- 从express源码中探析其路由机制
引言 在web开发中,一个简化的处理流程就是:客户端发起请求,然后服务端进行处理,最后返回相关数据.不管对于哪种语言哪种框架,除去细节的处理,简化后的模型都是一样的.客户端要发起请求,首先需要一个标识 ...
- [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- Android 源码中的设计模式
最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...
- VueRouter 源码深度解析
VueRouter 源码深度解析 该文章内容节选自团队的开源项目 InterviewMap.项目目前内容包含了 JS.网络.浏览器相关.性能优化.安全.框架.Git.数据结构.算法等内容,无论是基础还 ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- Go netpoll I/O 多路复用构建原生网络模型之源码深度解析
导言 Go 基于 I/O multiplexing 和 goroutine 构建了一个简洁而高性能的原生网络模型(基于 Go 的I/O 多路复用 netpoll),提供了 goroutine-per- ...
随机推荐
- 火山引擎数智平台旗下DataWind升级半年报 6大功能助力企业数据消费
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 "以数据消费促数据生产"--是火山引擎提出的数据飞轮的核心理念,在这一理念的指导下,智能数 ...
- socket.d.js v2.3.4 支持"微信"、"uniapp"
Socket.D 是基于"事件"和"语义消息""流"的网络应用层协议.有用户说,"Socket.D 之于 Socket,尤如 Vu ...
- Excel 2016 VBA 提取单元格的中文字符
启用开发工具 方式一:[右键Sheet1 ]->[查看代码] 方式二:[开发者工具]->[Visual Basic] Function chinese(rng As String) Dim ...
- WEB端播放华为海康大华视频方案
WEB端播放华为海康大华视频方案 类似标题:谷歌浏览器播放华为海康大华视频方案 方案 以下方案相当于给需要播放视频的WEB系统做了一个专用的浏览器,通过专用浏览器的CS客户端组件播放视频,当然,这个专 ...
- 备忘 springboot 整合ehcache,注入CacheManager时提示 required a bean of type 'org.springframework.cache.CacheManager' that could not be found
问题因人而异,此处仅做备忘 整合过程: 1.添加maven依赖 <dependency> <groupId>net.sf.ehcache</groupId> < ...
- SpringBoot 学习笔记:运维篇
SpringBoot程序的打包和运行 开发部门使用Git.SVN等版本控制工具上传工程到版本服务器 服务器使用版本控制工具下载工程 服务器上使用Maven工具在当前真机环境下重新构建项目 启动服务 程 ...
- 关于 Windows10升级版本后,内存占用率居高不下的解决办法
一个月前,打开系统更新,win 10 推送了 最新版本. 然后手贱点了更新. 的确一开始没觉得的有什么明显变化,但最近总觉得机子卡的卡的严重,查看了下内存,占用率居高不下. 经常才打开一两个软件内存就 ...
- 最全!即学即会 Serverless Devs 基础入门(下)
作者 | 刘宇(阿里云 Serverless 产品经理) 在上篇<最全!即学即会 Serverless Devs 基础入门>中,我们阐述了工具链的重要性,并对安装方式 & 密钥配置 ...
- ThreadLocal应用及理解
转载请注明出处: 1. 先展示threadLocal的一个简单封装,该封装用来在不同的请求线程中解析用户参数.在请求经过过滤器时, 对用户的信息进行设置入 ThreadLocalContext 中,可 ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.21)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...