对方是谁:即fabric网络结构的信息,channel、org、orderer和peer等 的怎么组合起当前fabric网络的,这些结构信息应当与configytx.yaml中是一致的。这是通用配置,每个客户端都可以拿来使用。另外,这部分信息并不需要是完整fabric网络信息,如果当前client只和部分节点交互,那配置文件中只需要包含所使用到的网络信息。
![](/home/liuhui/文档/hyperledge Fabric/config-yaml.png)
1.4、使用go mod管理项目依赖fabric go sdk目前本身使用go modules管理依赖,从go.mod可知,依赖的一些包指定了具体的版本, 如果你的项目依赖的版本和fabric go sdk依赖的版本不同,会产生编译问题。
因此建议项目也使用go moudles管理依赖,然后相同的软件包可以使用相同的版本,可以这样操作:
go mod init初始化好项目的go.mod文件。
编写代码,完成后运行go mod run,会自动下载依赖的项目,但版本可能与 fabric go sdk中的依赖版本不同,编译存在问题。
把go.mod中的内容复制到项目的go.mod中,然后保存,go mod会自动合并相同的依赖, 运行go mod tidy,会自动添加新的依赖或删除不需要的依赖。
1.5、创建fabric-SDK-GO入口实例通过config.FromFile解析配置文件,然后通过fabsdk.New创建fabric go sdk的入口实例。
import "github.com/hyperledger/fabric go sdk/pkg/core/config" import "github.com/hyperledger/fabric go sdk/pkg/fabsdk" sdk, err := fabsdk.New(config.FromFile(c.ConfigPath)) if err != nil { log.Panicf("failed to create fabric sdk: %s", err) } 1.6、创建fabric-SDK-GO的资源管理客户端管理员账号才能进行Hyperledger fabric网络的管理操作,所以创建资源管理客户端一定要使用管理员账号。
通过fabsdk.WithOrg("Org1")和fabsdk.WithUser("Admin")指定Org1的Admin账户,使用sdk.Context创建clientProvider,然后通过resmgmt.New创建fabric-SDK-GO资源管理客户端。
import "github.com/hyperledger/fabric go sdk/pkg/client/resmgmt" rcp := sdk.Context(fabsdk.WithUser("Admin"), fabsdk.WithOrg("Org1")) rc, err := resmgmt.New(rcp) if err != nil { log.Panicf("failed to create resource client: %s", err) } 1.7、创建fabric-SDK-GO的通道客户端使用用户账号创建fabric-SDK-GO的通道客户端,以便进行fabric链码的调用和查询。使用sdk.ChannelContext创建channelProvider,需要指定channelID和用户User1,然后通过channel.New创建通道客户端,这个通道客户端就是调用channelID对应channel上链码的channel client。
################两种方法可以创建通道客户端#####################
方法一:
import "github.com/hyperledger/fabric go sdk/pkg/client/channel" ccp := sdk.ChannelContext(ChannelID, fabsdk.WithUser("User1")) cc, err := channel.New(ccp) if err != nil { log.Panicf("failed to create channel client: %s", err) }方法二:
// New creates a new Client instance mspClient, err := mspclient.New(sdk.Context(), mspclient.WithOrg(info.OrgName)) if err != nil { return fmt.Errorf("根据指定的 OrgName 创建 Org MSP 客户端实例失败: %v", err) } // Returns: signing identity adminIdentity, err := mspClient.GetSigningIdentity(info.OrgAdmin) if err != nil { return fmt.Errorf("获取指定id的签名标识失败: %v", err) } // SaveChannelRequest holds parameters for save channel request channelReq := resmgmt.SaveChannelRequest{ChannelID:info.ChannelID, ChannelConfigPath:info.ChannelConfig, SigningIdentities:[]msp.SigningIdentity{adminIdentity}} // save channel response with transaction ID _, err = resMgmtClient.SaveChannel(channelReq, resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint(info.OrdererOrgName)) if err != nil { return fmt.Errorf("创建应用通道失败: %v", err) } fmt.Println("通道已成功创建,") 1.8、peer节点加入通道 // allows for peers to join existing channel with optional custom options (specific peers, filtered peers). If peer(s) are not specified in options it will default to all peers that belong to client's MSP. err = info.OrgResMgmt.JoinChannel( info.ChannelID, resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint(info.OrdererOrgName) ) if err != nil { return fmt.Errorf("Peers加入通道失败: %v", err) } fmt.Println("peers 已成功加入通道.") 1.9、资源管理客户端安装链码