之前的俩个小短文简单的写了fabric基础网络的搭建,但是要在实际使用的时候要将cli容器实体化,即将在原cli容器中的代码进行自动化即创建一个客户端,这样的需求就引进了sdk的使用,下面是fabric-sdk-go的具体实现过程,作者使用的是golang编译环境。【注意go依赖的拉取】

一、前期准备工作

1、现将之前我们的基础环境放到fixtures文件夹中,这个是fabric的基础网络配置文件。

2、将之前的链码放到同阶层的chaincode文件夹中,这个是fabric的链码文件。

3、同阶层的config.yaml文件,这个是将fixtures的基础网络进行简化配置【sdk会加载这个文件进行fabric网络配置】,代码如下:【作者进行了备注,这里没加证书的配置

version: 1.0.0
# SDK使用的客户端部分 意思就是换客户端 从这里换
client:
# 应用程序所属的Org组织名
organization: org1

logging:
level: info
# 指定存储证书所在目录
cryptoconfig:
path: /root/go/src/sdk-test/fixtures/crypto-config
# 指定密钥存储库
credentialStore:
path: “/tmp/state-store”
cryptoStore:
# Specific to the underlying KeyValueStore that backs the crypto key store.
path: /tmp/msp

# 为客户端配置BCCSP 密码算法模块 基本都这样写
BCCSP:
security:
enabled: true
default:
provider: “SW”
hashAlgorithm: “SHA2”
softVerify: true
level: 256
# 证书池策略,默认为false,提高身份认证速率
tlsCerts:
# [Optional]. Use system certificate pool when connecting to peers, orderers (for negotiating TLS) Default: false
systemCertPool: true

# [Optional]. Client key and cert for TLS handshake with peers and orderers
client:
# 客户端密钥路径
key:
path: /root/go/src/sdk-test/fixtures/crypto-config/peerOrganizations/org1.traceability.com/users/User1@org1.traceability.com/tls/client.key
# 证书路径
cert:
path: /root/go/src/sdk-test/fixtures/crypto-config/peerOrganizations/org1.traceability.com/users/User1@org1.traceability.com/tls/client.crt

channels:

# 指定通道信息
mychannel:
peers:
peer0.org1.traceability.com:
endorsingPeer: true # 是否为背书节点,默认为true
chaincodeQuery: true # 是否接受链码查询,默认为true
ledgerQuery: true # 是否接受不需要链码的查询,默认为true
eventSource: true # 是否为SDK侦听器注册的目标,默认为true

peer0.org2.traceability.com:
endorsingPeer: true
chaincodeQuery: true
ledgerQuery: true
eventSource: true

policies:
queryChannelConfig: # 检索通道配置块选项
minResponses: 1 # 从目标/peers的最小响应数
maxTargets: 1 # 通道配置随机检索目标数量
retryOpts: #查询区块配置的重试选项
attempts: 5 # 重试次数
initialBackoff: 500ms # 第一次重试的间隔时间
maxBackoff: 5s # 重试的最大间隔时间
backoffFactor: 2.0

discovery:
#[Optional] discovery info will be retrieved for these number of random targets
maxTargets: 2
#[Optional] retry options for retrieving discovery info
retryOpts:
#[Optional] number of retry attempts
attempts: 4
#[Optional] the back off interval for the first retry attempt
initialBackoff: 500ms
#[Optional] the maximum back off interval for any retry attempt
maxBackoff: 5s
#[Optional] he factor by which the initial back off period is exponentially incremented
backoffFactor: 2.0
#
# list of participating organizations in this network
#
organizations: # 指定网络环境中的组织信息
org1:
mspid: Org1MSP

# This org’s MSP store (absolute path or relative to client.cryptoconfig)
cryptoPath: peerOrganizations/org1.traceability.com/users/{username}@org1.traceability.com/msp

peers:
– peer0.org1.traceability.com
org2:
mspid: Org2MSP

# This org’s MSP store (absolute path or relative to client.cryptoconfig)
cryptoPath: peerOrganizations/org2.traceability.com/users/{username}@org2.traceability.com/msp

peers:
– peer0.org2.traceability.com

ordererorg:
# Membership Service Provider ID for this organization
mspID: OrdererMSP
# Needed to load users crypto keys and certs for this org (absolute path or relative to global crypto path, DEV mode)
cryptoPath: ordererOrganizations/traceability.com/users/{username}@traceability.com/msp

二、具体客户端操作过程【原cli容器的执行过程】

创建通道——>加入通道———->更新锚节点———–>打包链码———->安装链码———->链码认证———>链码提交————->链码初始化———->链码调用

【具体体现就是sdkSetting.go中的一个个函数】

1、在sdkInt中的sdkInt.go配置所用的建立组织、通道信息的结构体:

2、建立一个main.go的主函数:

同时注意在 主函数中进行,建一个基础信息的初始化,根据自己的配置信息修改实际路径:

3、在sdkInt的文件中建立sdk配置的主文件,sdkSetting.go中建立setup函数,这个是启动sdk,其中包括启动fabric-sdk-go实例化、client实例化、链码实例化等;【了解具体介绍可参考Hyperledger fabric-SDK-GO客户端开发篇(六) – 风云傲天 – 博客园 (cnblogs.com)】

在main.go的主函数中通过sdk, err := sdkInit.Setup(“config.yaml”, &info) 进行sdk启动。

4、启动了sdk后,进行接下来的操作创建、加入通道和打包、安装链码等,具体的过程之前文章提过;提到的sdkInt的函数在sdkSetting.go中。

main.go

sdkSetting.go【网上具体函数代码很多,都可以参考】

5、挡完成链码的提交之后要进行链码的初始化

获取对应用通道闸中对链码的操作权限权限通过sdkSetting.go的initService函数【注意:这个函数是通过结构体调用的】

函数set.go:【上链】

函数get.go:【查询】

成功执行


注意事项:

1、进行单个函数debug测试的时候,记得先启动基本网络 docker-compose up -d【测试正式完成会都会写一个小脚本,前期就没必要了】

2、有些依赖会要求go的版本,还有golang编译器的debug模式也会要求go的版本【作者之前的16版本不够,只能生成18版本的】