那样啥是超账本结构中的Protobuf呢?

- 编辑:admin -

那样啥是超账本结构中的Protobuf呢?

在本文中,我将讲解怎么用Protobuf在超账本结构中序列化和架构数据。Protobuf简化了超级账本结构中的数据处置和格式化过程。它用特殊生成的源码来生成数据,这部分数据可以在同一个智能契约中轻松地撰写和读取

协调编辑|卡罗尔

作者是| Deeh3timan Pattnaik

|区块链camh3

在本文中,我将讲解怎么用Protobuf在超账本结构中序列化和架构数据。Protobuf简化了超级账本结构中的数据处置和格式化过程。它用特殊生成的源码来生成数据,这部分数据可以在同一个智能契约中轻松地撰写和读取。

在超级账本结构中,Chaincode是一个特定的程序,用于处置区块链互联网中参与者一致赞同的核心业务逻辑。Hyperledger fabric还用了一种名为SmartContract的数据格式技术,该技术是为Chaincode中的一组特定数据模概念的。Chaincode可以有多组smartcontract来控制不同数据模的事务逻辑。容易地说,SmartContract管理事务,而Chaincode管理怎么样部署SmartContract。

比如,假如某些用户信息记录需要存储在分类帐中,那样大家需要一个SmartContract来概念一条记录所需的数据字段。

安装

第一,大家需要遵循安装过程来用protobuf编译器。

$gogetgithub.com/golang/protobuf $gogetgithub.com/golang/protobuf/proto $goget-ugithub.com/golang/protobuf/protoc-gen-go exportPATH =路径:USDUSDGOPATH / bin

目前,安装protobuf编译器

$sudoaptinstallprotobuf -编译器

然后,在命令行上输入protoc’。它应该显示;输入fileAMPLrsquo失踪;,这意味着成功安装了protobuf编译器。

期望你感觉有用!

原始链接:https://hackernoon.com/what-protobuf -in-hyperledger- fabric-explaining-gk7s32fz

样例

第一,大家需要创建一个财务。原文件。它由Financial类的消息格式组成,包含四个字段:银行名字、ifsc代码、帐号和创建日期。

金融。Protosyntax = " proto3”;Packagemain;MessageFinancial {stringbankName = 1;StringifscCode = 2;StringaccNumber = 3;StringcreatedDate = 4;}

编译原文件,生成用于财务消息格式的protobuf数据模文件。

$protoc——go_out =*原

你将看到protobuf文件已经作为financial.pb.go生成。此文件是与proto包兼容的数据模,将用于将proto消息格式转换为字节。

金融。Pb。/ / Codegeneratedbyprotoc - gen - Go。DONOTEDIT。/ /资料出处:财务。ProTOPackagemainimport  / / referenceimportstosuppresserrorsif他们没其他作用与功效。Var_ =原。Marshalar_ = FMT。Errorfar_ = math.h Inf / / Thisisacompile - timeassertiontosurethisgeneratedfile / /与proTOPackageitisbeingcompiledagainst兼容。/ / a ompilationerrat this linelikelymeansyourcopyof / / proTOPackageneedstobeupdated。Const_ =原。proTOPackagetypefinancialstruct {BankNamestring ' protobuf:“字节,1、选择的名字= bankName p Roto3 " json:“bankName, omitempty”“IfscCodestring”protobuf:“字节,2、选择、名字= ifscCode proto3“json:“ifscCode, omitempty”“AccNumberstring”protobuf:“字节、3、选择、名字= accNumber proto3“json:“accNumber omitempt Y”“CreatedDatestring”protobuf:“字节,4、选择、名字= createdDate proto3“json:“createdDate,omitempty“XXX_NoUnkeyedLiteralstruct{}的json:“——”XXX_unrecognized byte [] json:”——“XXX_sizecacheint32 json:”——“‘} func 重置M ={*金融{}}func 字符串String  {returnproto.Com pactTextString } funcProtoMessage  {func描述符 {returnfileDescriptor_a283e Be7677acfbc, int [] {0}} func XXX_Unmarshal byte []  {returnxxx_messageInfo_Financial的错误。func  XXX_Marshal   {returnxxx_message Info_Financial。marshall }func  XXX_Merge 消息){xxx_messageInfo_Financial。func  XXX_Size  {returnxxx_messageInfo_Financial。Size }是一个有趣的函数C  xxx_dunknown  {xxx_messageInfo_Financial。DiscardUnknown } arxxx_messageInfo_Financialproto。imfofunc  GetBankName  {ifm!。= nil {returnm BankName} return ""} func  GetIfscCode  {ifm!。= nil {returnm IfscCode} return ""} func  GetAccNumber  {ifm!。= nil {returnm AccNumber} return ""} func  GetCreatedDate  {ifm!。= nil {returnm CreatedDate} return ""} funcinit  {proto。RegisterType , Financial”main Financial ")} funcinit  {proto。RegisterFile} arfileDescriptor_a Ebe7677acfbc = 283字节[]{x8b bytesofagzippedfiledescriptorproto0x1f / / 136, 0, 0  funcmain  {financial: = AMPL AMPLFinancial {IFSCCode BankName: "HellenicBank": "1234", AccNumber: "8765", CreatedDate: "12/12/08,} financialdata, err: = proto。元帅iferr != nil {the Fatal } userdata: = AMPL AMPL用户{ID: "1", Email: "[protected] Email AMPL # 160;" Name: "James ", " Mobile: "8765432",年龄:"34",Financial: string ,} userDataJSONasBytes, err: = json。元帅iferr != nil {returnshim。indexName: = "id" userNameIndexKey, err: = stub。创建ecompositekey 。Id}) iferr != nil {returnshim。Error )} err =存根。PutState  iferr!= nil {returnshim。错误)

分析Protobuf

分析protobuf数据非常简单,由于它以字节的形式存储记录,可以用Financial proto轻松地分析这部分记录。

FinancialByteData, err: =原。元帅 iferr != nil {the Fatal } / / Parsingthefinancialbytedatafinancial: = AMPL AMPLFinancial {} err = proto。整理= nil {the Fatal } FMT。Println 。Println 。Println 。Println )

结论

Protobuf简化了数据处置和格式化。它用特殊生成的源码来架构数据,使得在同一个smartcontract中撰写和读取数据变得比较容易。

1. https://deelopers.谷歌.com/protocol-buffers

2. https://deelopers.谷歌.com/protocol-buffers/docs/gotutorial

这是对Protobu的基本概述它将被用于超账本结构一直到SmartContract。

金融SmartContract

{IDstring ' json:" id" ' BankNamestring ' ' json:" bankName" ' IFSCCodestring ' ' ifscCode ' AccNumberstring ' ' json:" accNumber ' CreatedDatestring ' '

这两个smartcontract将被部署到Chaincode,并处置这两个分类状况。AMPL 区块链的世界状况和事务逻辑。

SmartContract在世界状况下主要实行Put、Get、Delete和GetHistory操作。

1. PutState—AMPL 为每一个不一样的键创建新对象,或覆盖现有对象。

2. GetState AMPL ndash;AMPL 从分类帐状况检索具备不同键值的对象。

3.DelState AMPL AMPL 从分类账的世界状况中移除对象。

4. GetHistoryForKey AMPL AMPL 返回跨时间键的所有事务的历史记录。

所有记录都作为世界状况记录存储在CouchDB中。对象以JSON格式存储为键-值对。CouchDB可以从数据库迅速查看JSON集合。在区块链状况下,所有这部分记录都以字节存储,并且是不可变的。

协议缓冲区是Google的序列化结构化数据,它是语言和平台无关的,具备可扩展的机制。与传统的数据格式相比,序列化的结构化数据是按字节编译的,因此它更小、更快、更容易。

大家可以看到,有两个smartcontract, User和Financial,存储在同一个用户的分类账中,即User存储用户的基本信息,Financial存储用户银行竞价推广账户的详细情况。

但,假如大家从查看目的的角度来看smartcontract,两个数据集之间没关系。大家不可以为用户和金融数据模概念相同的ID作为键,由于分类帐数据存储在键-值对中,假如出现相同的键,则信息将被覆盖。

这两条记录以两种不一样的id存储在分类帐状况中

为知道决这个问题,Protobuf提供了一个更快、更灵活的解决方法。大家要做的就是写出a。描述数据结构的原文件,在本例中,是大家想要存储的金融数据结构。

因此,protobuf消息格式中的字节结果被直接调用给用户SmartContract, Financial SmartContract被完全删除。

下面,大家将知道怎么样设置protobuf编译器并生成protobuf消息格式。

用户SmartContract

TypeUserstruct {IDstring ' json: "id" ' Emailstring ' ' json: "email" ' Namestring ' ' json: "name" ' Mobilestring ' ' json: "mobile" ' Agestring ' ' age ' '}

在SmartContract中,有ID、电子邮件、名字、手机、年龄和其他与个人用户记录有关的数据。同样,假如大家需要存储每一个用户的财务记录,大家需要另一个名为Financial的smartcontract。

你会喜欢下面的文章?