从源码中解析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"`
}

本文作为区块链浏览器系列的开篇,结构体中各字段的含义会在之后的文章中一一介绍,这里就不再过多介绍。接下来将以类图的形式来解析区块中包含的信息。

classDiagram
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区块数据结构(一)的更多相关文章

  1. Android 网络框架之Retrofit2使用详解及从源码中解析原理

    就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...

  2. 观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 ...

  3. Java设计模式:23种设计模式全面解析(超级详细)以及在源码中的应用

    从网络上找的设计模式, 很全面,只要把UML类图看懂了, 照着类图将代码实现是很容易的事情. 步骤: 先看懂类图, 然后将代码实现, 之后再看文字 http://c.biancheng.net/des ...

  4. 从express源码中探析其路由机制

    引言 在web开发中,一个简化的处理流程就是:客户端发起请求,然后服务端进行处理,最后返回相关数据.不管对于哪种语言哪种框架,除去细节的处理,简化后的模型都是一样的.客户端要发起请求,首先需要一个标识 ...

  5. [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结

    本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...

  6. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  7. Android 源码中的设计模式

    最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...

  8. VueRouter 源码深度解析

    VueRouter 源码深度解析 该文章内容节选自团队的开源项目 InterviewMap.项目目前内容包含了 JS.网络.浏览器相关.性能优化.安全.框架.Git.数据结构.算法等内容,无论是基础还 ...

  9. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  10. Go netpoll I/O 多路复用构建原生网络模型之源码深度解析

    导言 Go 基于 I/O multiplexing 和 goroutine 构建了一个简洁而高性能的原生网络模型(基于 Go 的I/O 多路复用 netpoll),提供了 goroutine-per- ...

随机推荐

  1. 火山引擎DataTester:AB实验平台未来演进趋势是怎样的?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,DataFun联合行行AI举办第四届"数据智能创新与实践人工智能大会,火山引擎DataTester ...

  2. 新能源物流车行业如何服务升级?地上铁联合火山引擎VeDI“破题”

    今年以来,克服种种不利因素影响,我国工业经济实现企稳回升,一些行业逆势而上,表现亮眼.尤其是新能源车行业,得益于技术创新与系列重大政策利好推动,在国内和国外市场均实现了快速增长,中国汽车工业协会最新统 ...

  3. 无法停止服务、无法终止 PID 4100 的进程

    服务中无法停止服务. 先查出服务对应的进程 Microsoft Windows [版本 10.0.19043.1348] (c) Microsoft Corporation.保留所有权利. C:\Us ...

  4. MySQL 添加用户,分配权限

    1. 添加用户 CREATE USER `vipsoft`@`%` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; 2. 权限配置 GRANT 权限1,权限 ...

  5. DevOps 运维提醒 钉钉 机器人 群通知

    应用系统在碰到运行异常等情况时,发送预警消息@群内相关人员,可以及时发出问题,观察对问题的响应情况 1. 创建一个群(可以是公司内部群) 2. 添加机器人 自定义机器人安全设置: https://op ...

  6. 一文聊透 IP 地址的那些事

    IP 地址,是一个大家都耳熟能详的名词.以生活举例,IP 在互联网中的作用就像是寄件时的收件人地址和寄件人地址,收件人地址让信件可以被正确送达,寄件人地址则让收到信的人可以回信. IP 地址作为每一个 ...

  7. 阿里云视频云vPaaS低代码音视频工厂:极速智造,万象空间

    当下音视频技术越来越广泛地应用于更多行各业中,但因开发成本高.难度系数大等问题,掣肘了很多企业业务的第二增长需求.阿里云视频云基于云原生.音视频.人工智能等先进技术,提供易接入.强拓展.高效部署和覆盖 ...

  8. Java 开发手册 (阿里巴巴开发手册)

    Java 开发手册 (有需要pdf版本的私信我,可以邮箱发)0版本号 制定团队 更新日期 备注 1.4.0 阿里巴巴集团技术团队 2018.5.20 增加设计规约(详尽版) 一.编程规约 (一) 命名 ...

  9. 活动回顾|阿里云 Serverless 技术实践营 Serverless +AI 专场

    8月25日"阿里云Serverless技术实践营( Serverless + AI 专场)"北京站圆满落幕.活动受众以关注 Serverless +AI 技术的开发者.企业决策人. ...

  10. 最全!即学即会 Serverless Devs 基础入门(上)

    作者 | 刘宇(花名:江昱) 在上篇<即学即会 Serverless | 如何解决 Serverless 应用开发部署的难题>中,我们阐述了工具链的重要性,那么本文将带领各位快速实现 Se ...