fabric-go-sdk 架构简要分析与开发入门
fabric提供了golang node等各种语言的开源sdk,其中,go sdk使用最为广泛。本文对go sdk的架构做简要分析,并给出简单的实战代码,供开发者参考。
Go sdk的核心是pkg包,分为client common context core fab fabsdk gateway msp util几个子包,根据官网文档,主要提供给开发者使用的包有,
pkg/fabsdk:fabsdk实例管理及相关context、provider的使用。
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等),想要详细了解各种方法可以针对每个函数找下具体实现。客户调用核心方法context和channelcontext,则可以获取到这些封装好的interface,将context以参数传入client包,client包就会读取其中的信息,调用common provider,并实现相关的接口功能。客户自己也可以调用这些provider,获取加密套件、infra、log、metric、节点配置等信息。
type FabricSDK struct {
opts options
provider *context.Provider
cryptoSuite core.CryptoSuite
system *operations.System
clientMetrics *metrics.ClientMetrics
}
具体的,在初始化时这些provider通过被三类factory来创建,core msp和service。Corefactory创建cryptosuite signingmanager infraprovider loggerprovider,mspfactory创建userstore和identitymanager,svcfactory创建Localdiscoveryprovider和channelprovider。比较常用的provider有infraprovider 和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只查询,不commit,execute走select endorse,最后会真正commit一笔交易;Event包中有一个方法叫RegisterFilteredBlockEvent,他和可以传入filter的RegisterBlockEvent是不一样的,后者的filter才是过滤的意思,而前者的FilteredBlock是block简要信息的意思;resmgmt包中有1.0的install instantiate链码方法,也有2.0的lifecycle链码方法,lifecycle需要走投票流程;msp包中有些Affiliation方法都是与附属关系相关的,想了解的同学可以详细了解下fabric ca服务。
最近有点忙,有时间再继续写吧~ 附官网链接 https://pkg.go.dev/github.com/hyperledger/fabric-sdk-go
- 点赞
- 收藏
- 关注作者
评论(0)