fabric-go-sdk 架构简要分析与开发入门

举报
hwttt 发表于 2022/07/05 15:42:22 2022/07/05
【摘要】 fabric提供了golang node等各种语言的开源sdk,其中,go sdk使用最为广泛。本文对go sdk的架构做简要分析,并给出简单的实战代码,供开发者参考。 Go sdk的核心是pkg包,分为client common context core fab fabsdk gateway msp util几个子包,根据官网文档,主要提供给开发者使用的包有,pkg/fabsdk:fabs...

fabric提供了golang node等各种语言的开源sdk,其中,go sdk使用最为广泛。本文对go sdk的架构做简要分析,并给出简单的实战代码,供开发者参考。

 

Go sdk的核心是pkg包,分为client common context core fab fabsdk gateway msp util几个子包,根据官网文档,主要提供给开发者使用的包有,

pkg/fabsdkfabsdk实例管理及相关contextprovider的使用。

pkg/client/channel:主要用来调用、查询链码等

pkg/client/resmgmt:区块链网络资源管理,比如创建通道、节点加入通道、部署链码等

pkg/client/event:事件相关,包括区块、交易、链码事件等

pkg/client/ledger:账本的查询,如查询区块、交易等

pkg/client/msp:身份、成员关系等的管理

 


除以上包外,经常使用的还有gateway包(在上述功能基础上进一步封装的高阶sdk方法,比起client包使用更便捷),及core/config包(处理配置文件,初始化等),还有resource包中链码的相关功能。

 

使用fabric go sdk需要先初始化fabsdk实例,初始化实例时可以指定组织、用户、身份、密码学套件、配置、日志等可选参数。Fabsdk实例的数据结构包含opts provider等私有字段,opts允许客户自定义一些interface的实现或配置信息(比如logger metric等),provider则封装了大量的interface,其中一部分是config类的provider方法(如endpointconfig identityconfig等,与配置信息有关),另一部分是userstore cryptosuite discovery identitymanager等方法。这些interface的通用定义在pkg/common包,具体实现则按功能的划分分布在了其他各个internal package中(如core fab msp等),想要详细了解各种方法可以针对每个函数找下具体实现。客户调用核心方法contextchannelcontext,则可以获取到这些封装好的interface,将context以参数传入client包,client包就会读取其中的信息,调用common provider,并实现相关的接口功能。客户自己也可以调用这些provider,获取加密套件、infralogmetric、节点配置等信息。

 

type FabricSDK struct {

         opts          options

         provider      *context.Provider

         cryptoSuite   core.CryptoSuite

         system        *operations.System

         clientMetrics *metrics.ClientMetrics

}

 

具体的,在初始化时这些provider通过被三类factory来创建,core mspserviceCorefactory创建cryptosuite signingmanager infraprovider loggerprovidermspfactory创建userstoreidentitymanagersvcfactory创建Localdiscoveryproviderchannelprovider。比较常用的providerinfraprovider endpointconfig(获取orderer peer等),channel service里的channel config(获取通道配置),IdentityManager(获取当前client端的身份、密钥等)。

 

Go sdk中对外方法提供了大量的可选参数(with开头的函数),以下面列出的方法为例,可选参数大多定义在每个子包的opts文件中,返回一个function的定义,function的参数则是其内部定义的私有结构体,函数启动初期轮询所有opts调用该function就可以将用户的输入覆盖到默认值上。这些可选函数的传参有些比较简单,在配置中就可以找到,还有些看起来结构稍微复杂一些第一次看可能会不知道从哪里来的,但其实按结构体定义搜索下就能发现大多都可以在其他方法中间接的获取到,比如signingIdentity可以调用msp包的方法得到,parentContext可以调用context得到,还有些interface类型的参数支持自定义。

 

 

func WithBlockNum(from uint64) ClientOption {

         return func(c *Client) error {

                   c.fromBlock = from

                   return nil

         }

}

 

Client包中的方法,官方都给了解释和示例,有几个可能写的比较简单稍微难理解些,这里挑选其中几个做解释。Channel包中的Query方法和Execute方法都会调用链码,区别在于query只查询,不commitexecuteselect endorse,最后会真正commit一笔交易;Event包中有一个方法叫RegisterFilteredBlockEvent,他和可以传入filterRegisterBlockEvent是不一样的,后者的filter才是过滤的意思,而前者的FilteredBlockblock简要信息的意思;resmgmt包中有1.0install instantiate链码方法,也有2.0lifecycle链码方法,lifecycle需要走投票流程;msp包中有些Affiliation方法都是与附属关系相关的,想了解的同学可以详细了解下fabric ca服务。

 

最近有点忙,有时间再继续写吧~ 附官网链接 https://pkg.go.dev/github.com/hyperledger/fabric-sdk-go

 

 

 

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。