区块链服务 BCS区块链服务 BCS

计算
弹性云服务器 ECS
裸金属服务器 BMS
云手机 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器 HECS
VR云渲游平台 CVR
特惠算力专区
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
专属企业存储服务
云存储网关 CSG
专属分布式存储服务 DSS
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘小站 IES
智能边缘平台 IEF
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
园区智能体 CampusGo
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
视频分析服务 VAS
语音交互服务 SIS
知识图谱 KG
人证核身服务 IVS
IoT物联网
设备接入 IoTDA
设备管理 IoTDM(联通用户专用)
全球SIM联接 GSL
IoT开发者服务
IoT数据分析
车联网服务 IoV
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
开发与运维
软件开发平台 DevCloud
项目管理 ProjectMan
代码托管 CodeHub
流水线 CloudPipeline
代码检查 CodeCheck
编译构建 CloudBuild
部署 CloudDeploy
云测 CloudTest
发布 CloudRelease
移动应用测试 MobileAPPTest
CloudIDE
Classroom
开源镜像站 Mirrors
应用魔方 AppCube
云性能测试服务 CPTS
应用管理与运维平台 ServiceStage
云应用引擎 CAE
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
资源管理服务 RMS
应用身份管理服务 OneAccess
区块链
区块链服务 BCS
可信跨链服务 TCS
智能协作
IdeaHub
开发者工具
SDK开发指南
API签名指南
DevStar
HCloud CLI
Terraform
Ansible
API问题定位指导
云生态
云市场
合作伙伴中心
华为云培训中心
其他
管理控制台
消息中心
产品价格详情
系统权限
我的凭证
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
应用编排服务 AOS
多云容器平台 MCP
基因容器 GCS
容器洞察引擎 CIE
云原生服务中心 OSC
容器批量计算 BCE
容器交付流水线 ContainerOps
应用服务网格 ASM
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB (for openGauss)
云数据库 GaussDB(for MySQL)
云数据库 GaussDB NoSQL
数据管理服务 DAS
数据库和应用迁移 UGO
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据湖治理中心 DGC
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
API网关 APIG
分布式缓存服务 DCS
分布式消息服务RocketMQ版
企业应用
域名注册服务 Domains
云解析服务 DNS
云速建站 CloudSite
网站备案
华为云WeLink
会议
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMAExchange
API全生命周期管理 ROMA API
安全与合规
安全技术与应用
DDoS防护 ADS
Web应用防火墙 WAF
云防火墙 CFW
应用信任中心 ATC
企业主机安全 HSS
容器安全服务 CGS
云堡垒机 CBH
数据库安全服务 DBSS
数据加密服务 DEW
数据安全中心 DSC
云证书管理服务 CCM
SSL证书管理 SCM
漏洞扫描服务 VSS
态势感知 SA
威胁检测服务 MTD
管理检测与响应 MDR
安全治理云图 Compass
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
专属云
专属计算集群 DCC
解决方案
高性能计算 HPC
SAP
游戏云
混合云灾备
华为工业云平台 IMC
价格
成本优化最佳实践
专属云商业逻辑
用户服务
帐号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
更新时间:2021-08-24 GMT+08:00
分享

GO SDK Demo

本节提供了一个基于Go SDK的Demo,帮助用户开发自己的Go客户端应用程序。

本Demo仅适用于Hyperledger Fabric增强版的区块链服务。

准备工作

  • 准备弹性云服务器。
  • 在弹性云服务器上安装golang环境,Go版本要求:1.12及以上,1.16以下(>=1.12,<1.16)。
  • 获取Go SDK源码,获取方法:登录区块链服务管理控制台,进入“体验中心 > 应用案例”,单击“GO示例Demo-GO SDK Demo”中Go应用程序源码的“下载”按钮。

购买区块链服务

购买区块链服务,具体请参见服务部署

安装及实例化链代码

本示例使用链代码文件获取方法:登录区块链服务管理控制台,进入“体验中心 > 应用案例”,单击“GO示例Demo-GO SDK Demo”中Go语言示例链代码的“下载”按钮。

参考章节:用户指南-区块链管理-链代码管理

下载SDK和证书

  1. 登录区块链服务管理控制台。
  2. 在“服务管理”界面,在服务卡片中,单击“获取客户端配置”。
  3. 在新打开的页面,勾选“SDK文件”,SDK配置参数如下:

    参数

    链代码名称

    chaincode

    说明:

    链代码名称需要和链代码安装&实例化时的一致。

    证书存放路径

    /root/gosdkdemo/config

    通道名称

    channel

    组织&Peer节点

    保持系统默认

    勾选“共识节点证书”。

    勾选“Peer节点证书”,指定节点组织选择organization,勾选“管理员证书”。

  4. 单击“下载”。下载SDK配置文件、orderer组织的管理员证书和organization组织的管理员证书。

部署应用

  1. 将Go SDK源码下载至准备的弹性云服务器“/root”路径下并解压。

    下载方法:登录区块链服务管理控制台,进入“体验中心 > 应用案例”,单击“GO示例Demo-GO SDK Demo”中Go应用程序源码的“下载”按钮。

  2. 下载SDK和证书步骤中的zip文件解压后,把configs文件夹中的orderer文件夹、peer文件夹、sdk-config.json、sdk-config.yaml文件全部拷贝到/root/gosdkdemo/config/目录下。
  3. 在代码中找到“/gosdkdemo/src/main.go”文件,进行以下修改:
    1. 将configFile中的值修改为实际的SDK配置文件名称,例如:demo-channel-sdk-config.yaml。
    2. 将org的值修改为organization对应的组织哈希值。
      在通道管理页面,单击“查看节点”获取组织的哈希值(MSP标识去掉“MSP”后缀即为对应组织的哈希)。
      var (    
          configFile = "/root/gosdkdemo/config/go-sdk-demo-channel-sdk-config.yaml"    
          org = " 9103f17cb6b4f69d75982eb48bececcc51aa3125"
       )
  4. 使用go mod方式配置GOPATH路径,请根据实际安装路径进行配置。
    1. 设置环境变量GO111MODULE为on。
      export GO111MODULE=on
    2. go.mod文件如图所示,用户需要根据实际安装路径修改replace代码。
      module main  
      go 1.15
      // 指定导入的依赖包及其版本
      require ( 
              github.com/bitly/go-simplejson v0.5.0 
              github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869// indirect 
              github.com/ghodss/yaml v1.0.0 
              github.com/hyperledger/fabric-sdk-go v1.0.0 
              github.com/pkg/errors v0.9.1 
              github.com/spf13/viper v1.7.1 
      )  
      // 以项目路径为/root/gosdkdemo/src为例 
      replace github.com/hyperledger/fabric-sdk-go => /root/gosdkdemo/src/github.com/hyperledger/fabric-sdk-go
  5. 找到“gosdkdemo/src”路径下的main.go文件,执行如下命令:
    go run main.go

通过内存传入私钥

如果用户需要对私钥文件进行加密,并在demo中解密后传入FabricSDK。

  1. 对于TLS私钥

    在main.go文件的initializeSdk函数中,按如下方式调用函数:

    encryptedtlsKey,err := GetTlsCryptoKey(org)  //从配置文件指定路径下读取加密过的TLS私钥
    //用户按照自行规定的加解密方法对encryptedtlsKey进行解密得到decryptedTlsKey字符串
    SetClientTlsKey(decryptedTlsKey)      //将解密后的TLS私钥传入Fabric-SDK,实现通过内存传入TLSKey
  2. 对于MSP私钥

    在main.go文件的insert函数中,按如下方式调用函数:

    encryptedbytekey,_:= GetPrivateKeyBytes(org)  //从配置文件指定路径下读取加密过的MSP私钥
    //用户按照自行规定的加解密方法对encryptedbytekey进行解密得到decryptedKey字符串
    SetPrivateKey(decryptedKey) //将解密后的MSP私钥赋值给全局变量privateKey并通过该变量传入

常用API接口

Fabric-sdk-go的主要入口是FabricSDK类,这个可以通过NewSDK()方法分别可以生成。

Fabric-sdk-go的常用操作基本都可以用这四个client实现:FabricClient,ChannelClient,ChannelMgmtClient,ResourceMgmtClient。

  • FabricSDK

    FabricSDK在pkg\fabsdk\fabsdk.go中,通过New ()方法生成object。New ()方法支持可变参数Option,以下是生成FabricSDK的例子:

    var opts []fabsdk.Option

    opts = append(opts, fabsdk.WithOrgid(org))

    opts = append(opts, fabsdk.WithUserName("Admin"))

    sdk, err = fabsdk.New(config.FromFile(configFile), opts...)

    configFile是SDK配置文件的路径。OrgId是SDK配置文件中的组织id。

    FabricSDK在def/fabapi/fabapi.go中,通过NewSDK()方法生成object。NewSDK()方法有一个Options参数,以下是生成Options参数的例子:

    deffab.Options{ConfigFile: configFile, LoggerFa
    logging.LoggerProvider(), UserName: sysadmin}

    ConfigFile是SDK配置文件的路径。LoggerFactory是可选的,不提供的话default会log到console。

  • FabricClient

    FabricClient主要有以下常用的接口。

    接口名称

    描述

    参数值

    返回值

    CreateChannel

    创建Channel的接口,用于创建channel。

    request

    CreateChannelRequest

    txn.TransactionID, error

    QueryChannelInfo

    查询Channel的接口,用于查询Channel的信息。

    name string, peers

    []Peer

    Channel, error

    InstallChaincode

    安装链码的接口,安装链码到区块链中。

    request

    InstallChaincodeRequest

    []*txn.TransactionPropos

    lResponse, string, error

    InstallChaincode

    安装链码的接口,安装链码到区块链中。

    request

    InstallChaincodeRequest

    []*txn.TransactionPropos

    lResponse, string, error

    QueryChannels

    查询channel的接口,查询区块链中已创建的通道。

    peer Peer

    *pb.ChannelQueryResponse, error

    QueryInstalledChaincodes

    查询已安装链码的接口,查询区块链中已安装的链码。

    peer Peer

    *pb.ChaincodeQueryResponse, error

  • ChannelClient

    ChannelClient主要包括链码查询和链码调用两类接口。

    接口名称

    描述

    参数值

    返回值

    Query

    链码查询接口,调用链码进行查询。

    request

    QueryRequest

    []byte, error

    QueryWithOpts

    带options的链码查询接口,与Query类似,但是可以通过QueryOpts指定notifier, peers,和timeout。

    request

    QueryRequest, opt

    QueryOpts

    []byte, error

    ExecuteTx

    链码调用接口,用于链码的调用。

    request

    ExecuteTxRequest

    TransactionID,

    error

    ExecuteTxWithOpts

    带options的链码调用接口,与ExecuteTx类似,但是可以通过ExecuteTxOpts指定notifier, peers,和timeout。

    request

    ExecuteTxRequestopt ExecuteTxOpts

    TransactionID,

    error

  • ChannelMgmtCLient

    ChannelMgmtClient 只有两个接口SaveChannel(req SaveChannelRequest) error 和SaveChannelWithOpts(req SaveChannelRequest, opts SaveChannelOpts) error 这两个接口是用于创建channel用的,这两个接口里面具体实现会调用到FabricClient里createChannel()接口。

  • ResourceMgmtClient

    ResourceMgmtClient主要就是与链码生命周期相关的接口和一个peer加入通道的接口。

    链码的删除接口为我们增加的接口,目前只实现了删除链码安装包的功能。

    接口名称

    描述

    参数值

    返回值

    InstallCC

    安装链码,用于安装链码。

    reqInstallCCRequest

    []InstallCCResponse, error

    InstallCCWithOpts

    带options的链码安装,与InstallCC类似,但是可以通过InstallCCOpts指定peers。

    reqInstallCCRequest,opts InstallCCOpts

    []InstallCCResponse, error

    InstantiateCC

    实例化链码接口,用于实例化链码。

    channelID string,reqInstantiateCCRequest

    error

    InstantiateCCWithOpts

    带options的链码实例化,与InstantiateCC类似,但是可以通过InstantiateCCOpts指定peers和timeout。

    channelID string,reqInstantiateCCRequest, optsInstantiateCCOpts

    error

    UpgradeCC

    升级链码,用于链码的升级。

    channelID string,reqUpgradeCCRequest

    error

    UpgradeCCWithOpts

    带options的链码升级,与UpgradeCC类似,但是可以通过UpgradeCCOpts指定peers和timeout。

    channelID string,reqUpgradeCCRequest, optsUpgradeCCOpts

    error

    DeleteCC

    删除链码,用于链码的删除,目前只有删除安装包的功能。

    channelID string,reqDeleteCCRequest

    error

    DeleteCCWithOpts

    带options的链码删除,与DeleteCC类似,但是可以通过DeleteCCWithOpts指定peers和timeout。

    channelID string,reqDeleteCCRequest,opts DeleteCCOpts

    error

    JoinChannel

    Peers加入Channel的接口,用于peers加入Channel。

    channelID string

    error

    JoinChannelWithOpts

    带options的Peers加入Channel的接口,与JoinChannel类似,但是可以通过JoinChannelOpts指定peers。

    channelID string,optsJoinChannelOpts

    error

    带options的接口都可以指定peers,peers可通过def/fabapi/pkgfactory.go 里的NewPeer(userName string, orgName string, url string, certificate string, serverHostOverride string, config config.Config) (fab.Peer, error) 生成。这个method比原生的NewPeer多两个参数userName, orgName, 这两个参数用于peer双向tls找到对应的tls证书。

调用合约

Main.go是一个简单的客户端应用示例程序,主要是为了方便用户熟悉客户端开发的流程,主要包含以下步骤:

//1.导入相关包:Sdk包中提供了一些API,以便用户的应用程序能够访问链代码。
import (
   "fmt"  
   "github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
   "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"    ……
)
//2.创建文件配置:这部分封装了应用开发必要的一些公共配置,包括sdk配置文件路径、组织名
var (
   configFile = "/root/fabric-go-demo/config/go-sdk-demo-channel-sdk-config.yaml"
   org = "9103f17cb6b4f69d75982eb48bececcc51aa3125"
   ……
)
//3.加载配置文件
loadConfig()
//4. 初始化sdk
initializeSdk()
//5. 执行链代码,将数据写入账本,key = "testuser",value= "100"
insert("insert",[][]byte{
   []byte("testuser"),
   []byte("100"),
})
//6.查询链代码,输出查询结果,key = "testuser" 
query("query",
[][]byte{
[]byte("testuser"),
})
表1 调用函数介绍

函数名

说明

getOptsToInitializeSDK

解析配置文件,创建并返回fabsdk.Option对象。

GetDefaultChaincodeId

解析配置文件,返回chaincodeID。

GetDefaultChannel

解析配置文件,返回channelID。

UserIdentityWithOrgAndName

用户身份验证,输入为组织名和用户名,返回为验证结果。

ChannelClient

创建*channel.Client对象,输入为组织名、用户名以及通道ID,返回*channel.Client对象。

insert

将数据写入账本,输入参数为链码的对应方法名称以及要插入的键值对,返回为写入的结果。

query

查询链上信息,输入参数为链码的对应方法名称以及要查询的数据,返回为查询的结果。

分享:

    相关文档

    相关产品

关闭导读