从源码中解析fabric区块数据结构(一)

源码,解析,fabric,区块,数据结构 · 浏览次数 : 212

小编点评

**类图解析** ```class Diagram { class Block { // Block结构的定义 } class BlockHeader { // Block头结构的定义 } class BlockData { // Block数据结构的定义 } // 其他类定义省略 } ``` **类描述** * **Block** 类代表区块结构,包含 block 的头、数据和 metadata。 * **BlockHeader** 类代表区块头结构,包含 block 的版本、数据hash 和签名。 * **BlockData** 类代表区块数据结构,包含数据数组。 * **BlockMetadata** 类代表区块 metadata 结构,包含 metadata 数组。 * **Metadata** 类代表区块 Metadata 结构,包含签名数组。 * **MetadataSignature** 类代表区块 Metadata 结构中的签名。 * **SignatureHeader** 类代表区块 Metadata 结构中的签名头。 * **Payload** 类代表区块数据结构中的 payload。 * **Header** 类代表区块头结构中的 header。 * **ChaincodeProposalPayload** 类代表区块链提案请求的 payload。 * **ChaincodeEndorsedAction** 类代表区块链提案响应的行动。 * **ProposalResponsePayload** 类代表区块链提案响应的返回值。 * **KVRead** 类代表 Key-Value 读取结构。 * **KVWrite** 类代表 Key-Value 写结构。 * **KVMetadataWrite** 类代表 Key-Value 数据写入结构。 * **Block** 类代表区块结构。 * **TxReadWriteSet** 类代表交易读取设置结构。 * **NsReadWriteSet** 类代表非识取交易读取设置结构。 * **KVRWSet** 类代表 Key-Value 读取设置结构。

正文

从源码中解析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区块数据结构(一)相似的内容:

从源码中解析fabric区块数据结构(一)

从源码中解析fabric区块数据结构(一) 前言 最近打算基于fabric-sdk-go实现hyperledger fabric浏览器,其中最重要的一步就是解析fabric的上链区块。虽说fabric是Golang实现的,但直到2021年2月1号才发布了第一个稳定版fabric-sdk-go,而且官

深入浅出 OkHttp 源码解析及应用实践

OkHttp 在 Java 和 android 世界中被广泛使用,深入学习源代码有助于掌握软件特性和提到编程水平。本文首先从源代码入手简要分析了一个请求发起过程中的核心代码,接着通过流程图和架构图概括地介绍了OkHttp的整体结构,重点分析了拦截器的责任链模式设计,最后列举了OkHttp拦截器在项目中的实际应用。

Spring源码:Bean生命周期(四)

在本文中,我们深入探讨了 Spring 框架中 Bean 的实例化过程,关于某些细节以后我会单独拿出一篇文章单独讲解,我们来总结下实例化都做了哪些事情:先从bean定义中加载当前类,因为最初Spring使用ASM技术解析元数据时只获取了当前类的名称寻找所有InstantiationAwareBeanPostProcessors实现类,并调用实例化前的方法postProcessBeforeInsta

FFmpeg开发笔记(二十二)FFmpeg中SAR与DAR的显示宽高比

​《FFmpeg开发实战:从零基础到短视频上线》一书提到:通常情况下,在视频流解析之后,从AVCodecContext结构得到的宽高就是视频画面的宽高。然而有的视频文件并非如此,如果按照AVCodecContext设定的宽高展示视频,会发现画面被压扁或者拉长了。比如该书第10章源码playsync.

【源码解读】asp.net core源码启动流程精细解读

引言 core出来至今,已经7年了,我接触也已经4年了,从开始的2.1,2.2,3.1,5,6再到如今的7,一直都有再用,虽然我是一个Winform仔,但是源码一直从3.1到7都有再看,然后在QQ上面也一直比较活跃,之前好几年前一直说给大家解读asp.net core源码,在之前的博客中,讲的都是比

聊聊我认为的OpenFeign

此篇文章不从源码角度解析,网上一搜一大把。我个人的习惯是自己评估与思考下大概的设计思路是什么,然后看源码与博客佐证。否则一来就是使用然后看源码,一坨一坨的代码,真的看的头疼。以上仅是个人的学习方法。 聊聊OpenFeign,其实这个框架,之前用过,但没留意太多;说白了这个框架的出现就是为了让我们做R

从源码角度深入解析Callable接口

摘要:从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小。 本文分享自华为云社区《一个Callable接口能有多少知识点?》,作者: 冰 河。 并发编程一直是程序员们比较头疼的,如何编写正确的并发程序相比其他程序来说,是一件比较困难的事情,并

如何正确使用 ThreadLocal,你真的用对了吗?

本文主要从源码的角度解析了 ThreadLocal,并分析了发生内存泄漏的原因及正确用法,最后对它的应用场景进行了简单介绍。

源码解析Collections.sort ——从一个逃过单测的 bug 说起

本文从一个小明写的bug 开始,讲bug的发现、排查定位,并由此展开对涉及的算法进行图解分析和源码分析。

一文详解RocketMQ-Spring的源码解析与实战

摘要:这篇文章主要介绍 Spring Boot 项目使用 rocketmq-spring SDK 实现消息收发的操作流程,同时笔者会从开发者的角度解读 SDK 的设计逻辑。 本文分享自华为云社区《RocketMQ-Spring : 实战与源码解析一网打尽》,作者:勇哥java实战分享。 Rocket