Fabric:使用GoLand+Fabric-SDK-Go操作Fabric网络

遇到bug, 未完待续!!!

写在最前

前序博客已经介绍了使用命令的方式在Fabric上创建通道以及部署执行链码的方法,但这个过程太繁琐,尤其是当Fabric网络中peer节点和组织Org过多时,需要频繁的更改环境变量。
Hyperledger Fabric官方提供了Fabric-sdk-go(也有针对其他语言的sdk)使开发人员能够与Fabric网络进行交互,并且可基于此构建区块链技术的应用程序。本篇博客主要介绍Fabric-sdk-go的简单使用。

基本环境

本机操作系统为MAC系统,和Fabric运行在虚拟机中。Fabric的具体运行环境为:
操作系统:Ubuntu 16.04
版本:Hyperledger Fabric: V2.5.4

1 GoLand连接虚拟机

要使用ssh方式连虚拟机之前,需要在两个系统上安装ssh服务。无论是在MAC上安装ssh,还是在Ubuntu系统上安装ssh,网络上资料都很多,这里不在赘述。

1.1 在MAC上使用ssh连接虚拟机

为了保证后续能顺利使用Goland连接虚拟机,这里先在MAC上使用ssh连接虚拟机。首先要保证本机系统上和虚拟机上的Ubuntu系统上的ssh服务都是开启状态。接着本机系统的终端上尝试连接虚拟机,具体指令如下:

ssh sherry@172.16.8.129

其中@前的部分为Ubuntu系统的用户名。@后面的ip地址可以在Ubuntu系统上通过ifconfig命令进行查询,具体如下:
在这里插入图片描述
上述命令运行成功之后,将可以在MAC的终端上操作Ubuntu系统。具体如下:
在这里插入图片描述

1.2 GoLand连接Fabric网络

1.2.1 启动Fabric网络

Fabric-sdk-go不能创建Fabric网络,所以Fabric网络的创建过程仍然在Ubuntu系统中来创建。为了简便,使用fabric-samples提供的测试网络test-network,其创建如下。

sudo ./network.sh up
docker ps -a

其结果如下:
在这里插入图片描述

1.2.2 Goland连接Fabric网络

使用Goland连接Fabric网络需要完成以下几件事情:

  • Goland连接虚拟机。
    在Goland中,打开Tools->Deployment->configuration进入Deployment界面,这里要新建一个SFTP部署。具体如下:
    connecton
    在这里插入图片描述
    其中ssh configuration的配置界面如下:
    在这里插入图片描述

  • 在Goland中配置Fabric网络文件映射目录。
    在这里插入图片描述这里的Deployment path即为Ubuntu系统上Fabric网络的相对路径地址(根路径为/home/sherry)。而local path即为Deployment path中的文件在本地系统上的映射地址。

  • 接着启动ssh连接。具体如下:
    在这里插入图片描述
    之后便可以在Goland中操作Ubuntu系统了。具体如下:
    在这里插入图片描述

  • 接着为了能在GoLand中修改链码及编写代码。先将Fabric网络中的文件映射到本地系统上。具体如下:
    在这里插入图片描述
    Tips:在文件同步时可能会出错,可以先在Ubuntu系统上更改Fabric网络文件的权限,再重新进行同步。

2 使用Fabri-SDK-GO操作网络

2.1 准备工作

  • 在Ubuntu系统上搭建finance网络。具体搭建过程可以参考博客:https://blog.csdn.net/yeshang_lady/article/details/134113296
  • 修改Goland的ssh部署。将finance网络所在的Ubuntu目录映射到GoLand的Fabric_GOPATH目录上,并将finance网络的所有文件下载到Fabric_GOPATH目录上。
  • 准备链码文件。在Fabric_GOPATH上创建usersChaincode/chaincode目录来保存链码文件asset-transfer.goasset-transfer.go文件参考博客:https://blog.csdn.net/yeshang_lady/article/details/134801201
  • 配置相关包。在Fabric_GOPATH/userChaincode/下执行如下代码(在GoLand->Terminal->local中执行):
go mod init
vim go.mod #这里要修改go.mod文件,将go语言版本修改为1.21
go get github.com/hyperledger/fabric-contract-api-go/contractapi
go get github.com/hyperledger/fabric-sdk-go
GO111MODULE=on go mod vendor
  • 为了保证Fabric-sdk-go的顺利执行,进入如下vendor/github.com/hyperledger目录,git命令下载fabric-sdk-go源文件。具体如下:
git clone https://github.com/hyperledger/fabric-sdk-go.git

在这里插入图片描述
如果不进行这一步操作,后续使用fabric-sdk-go创建客户端的时候会可能会遇到如下错误:
..\vendor\github.com\hyperledger\fabric-sdk-go\internal\github.com\hyperledger\fabric\discovery\client\api.go:47:38: undefined: discovery.ChaincodeCall

  • Fabric_GOPATH\usersChaincode下创建sdkInit目录并创建start.go文件。后续所有与Fabric-SDK-GO操作相关的代码都存放在该文件中。
  • Fabric_GOPATH\usersChaincode下闯将main.go文件作为主函数所在的文件。

2.2 实例化Fabri SDK

在实例化Fabric SDK之前,需要在Fabric_GOPATH/usersChaincode下生成config.yaml文件。finance网络对应的config.yaml文件如下(Fabric-sdk-go中给了一些样例文件可以参考):

# Copyright SecureKey Technologies Inc. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
version: 1.0.0
client:
  organization: org1 #此应用程序的所有者
  logging:
    level: info
  cryptoconfig:
    path: ${GOPATH}/src/Fabric_GOPATH/organizations
  credentialStore:
    path: "/tmp/state-store"
    cryptoStore:
      path: /tmp/msp
  BCCSP:
    security:
      enabled: true
      default:
        provider: "SW"
      hashAlgorithm: "SHA2"
      softVerify: true
      level: 256

  tlsCerts:
    systemCertPool: true
    client:
      key:
        path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/users/Admin@org1.finance.com/tls/client.key
      cert:
        path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/users/Admin@org1.finance.com/tls/client.crt

channels:
  channel1:
    peers:
      peer0.org1.finance.com:
        endorsingPeer: true
        chaincodeQuery: true
        ledgerQuery: true
        eventSource: true
      peer1.org1.finance.com:
        endorsingPeer: true
        chaincodeQuery: true
        ledgerQuery: true
        eventSource: true
      peer0.org2.finance.com:
        endorsingPeer: true
        chaincodeQuery: true
        ledgerQuery: true
        eventSource: true
    policies:
      queryChannelConfig:
        minResponses: 1
        maxTargets: 1
        retryOpts:
          attempts: 5
          initialBackoff: 500ms
          maxBackoff: 5s
          backoffFactor: 2.0
      selection:
        SortingStrategy: BlockHeightPriority
        Balancer: RoundRobin
        BlockHeightLagThreshold: 5
      eventService:
        resolverStrategy: MinBlockHeight
        balancer: RoundRobin
        blockHeightLagThreshold: 4
        reconnectBlockHeightLagThreshold: 8
        peerMonitorPeriod: 6s
organizations:
  org1:
    mspid: Org1MSP
    cryptoPath:  ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/users/Admin@org1.finance.com/msp
    peers:
      - peer0.org1.finance.com
      - peer1.org1.finance.com
    certificateAuthorities:
      - ca.org1.finance.com
  org2:
    mspid: Org2MSP
    cryptoPath:  ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org2.finance.com/users/Admin@org2.finance.com/msp
    peers:
      - peer0.org2.finance.com
    certificateAuthorities:
      - ca.org2.finance.com
orderers:
  orderer.finance.com:
    url: orderer.finance.com:7050
    grpcOptions:
      ssl-target-name-override: orderer.finance.com
      keep-alive-time: 0s
      keep-alive-timeout: 20s
      keep-alive-permit: false
      fail-fast: false
      allow-insecure: false
    tlsCACerts:
      path: ${GOPATH}/src/Fabric_GOPATH/organizations/ordererOrganizations/finance.com/tlsca/tlsca.finance.com-cert.pem
peers:
  -defaults:
    grpcOptions:
      keep-alive-time: 0s
      keep-alive-timeout: 20s
      keep-alive-permit: false
      fail-fast: false
      allow-insecure: false

  peer0.org1.finance.com:
    url: peer0.org1.finance.com:7051
    grpcOptions:
      ssl-target-name-override: peer0.org1.finance.com
    tlsCACerts:
      path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/tlsca/tlsca.org1.finance.com-cert.pem
  peer1.org1.finance.com:
    url: peer1.org1.finance.com:8051
    grpcOptions:
      ssl-target-name-override: peer1.org1.finance.com
    tlsCACerts:
      path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/tlsca/tlsca.org1.finance.com-cert.pem
  peer0.org2.finance.com:
    url: peer0.org2.finance.com:9051
    grpcOptions:
      ssl-target-name-override: peer0.org2.finance.com
    tlsCACerts:
      path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org2.finance.com/tlsca/tlsca.org2.finance.com-cert.pem

certificateAuthorities:
  ca.org1.finance.com:
    url: https://ca.org1.finance.com:7054
    grpcOptions:
      ssl-target-name-override: ca.org1.finance.com
    tlsCACerts:
      path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/tlsca/tlsca.org1.finance.com-cert.pem
      client:
        key:
          path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/users/Admin@org1.finance.com/tls/client.key
        cert:
          path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org1.finance.com/users/Admin@org1.finance.com/tls/client.crt
    registrar:
      enrollId: admin
      enrollSecret: adminpw
    caName: ca.org1.finance.com
  ca.org2.finance.com:
    url: https://ca.org2.finance.com:9054
    grpcOptions:
      ssl-target-name-override: ca.org2.finance.com
    tlsCACerts:
      path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org2.finance.com/tlsca/tlsca.org2.finance.com-cert.pem
      client:
        key:
          path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org2.finance.com/users/Admin@org2.finance.com/tls/client.key
        cert:
          path: ${GOPATH}/src/Fabric_GOPATH/organizations/peerOrganizations/org2.finance.com/users/Admin@org2.finance.com/tls/client.crt
    registrar:
      enrollId: admin
      enrollSecret: adminpw
    caName: ca.org2.finance.com

start.go文件中添加如下代码:

/*代码的import部分会自己生成,这里为了节省空间就不在展示了*/
package sdkInit
func SetupSDK(configFile string, initialized bool) (*fabsdk.FabricSDK, error) {
	if initialized {
		return nil, fmt.Errorf("Fabric SDK已经实例化")
	}
	sdk, err := fabsdk.New(config.FromFile(configFile))
	if err != nil {
		return nil, fmt.Errorf("实例化Fabric SDK失败: %v", err)
	}
	fmt.Println("Fabric SDK初始化成功")
	return sdk, nil
}

main.go中添加如下代码,具体如下:

const (
	configFile  = "config.yaml"
	initialized = false
)
func main() {
	sdk, err := sdkInit.SetupSDK(configFile, initialized)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer sdk.Close() //
}

运行main.go文件即可完成Fabric SDK的实例化。

参考资料

  1. https://blog.csdn.net/lakersssss24/article/details/125645713

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/262513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023 英特尔On技术创新大会直播 |AI科技创新的引路者

英特尔大会 前言英特尔人工智能英特尔创新技术基于英特尔架构的科学计算总结 前言 英特尔技术创新大会是一个令人激动和启发的盛会。在这次大会上,我有幸观看了许多令人瞩目的科技创新和前沿技术的展示。这些展示不仅展示了英特尔作为科技巨头的实力,更…

【C语言刷题每日一题#牛客网BC69】——空心正方形图案

目录 问题描述 思路分析 代码实现 结果测试 问题描述 思路分析 首先根据输入的描述,多组输入需要将scanf放在循环中来实现分析输出的规律:当输入为4时,分别在第0行和第3行(4-1行),第0列和第3列&#xf…

使用VSC从零开始Vue.js——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务3:数据可视化

使用Visual Studio Code(VSC)进行Vue开发非常方便,下面是一些基本步骤: 一、下载和安装Vue 官网下载地址Download | Node.js Vue.js是基于Node.js的,所以首先需要安装Node.js,官网下载地址:No…

redis命令

文章目录 NoSQL数据库引入NoSQL数据库简介redis6概述和安装启动方式相关知识介绍key键操作stringlistSethashZset NoSQL数据库引入 解决CPU以及内存压力 cookie是一种存储在用户计算机上的小型文本文件,用于跟踪、识别用户和提供个性化的服务。 会话(Se…

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好,但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite Vue3 TS E…

VS Code+MinGW 搭建Windows C++开发环境

官方文档是最香香的:https://code.visualstudio.com/docs/cpp/config-mingw 文章目录 1、一些非常不友好的名词1.1 什么TMD是 GNU、MinGW、GCC、gcc、g?1.2 MSVC 2、获取g编译器3、VS Code单文件编译和调试流程3.1 安装插件3.2 单个源文件编译运行3.3 ta…

(1)(1.10) SiK Radio v1

文章目录 前言 1 概述 2 连接无线电台 3 参数说明 前言 本文介绍了如何将 3DR Radio v1 连接到飞行控制器。你还应阅读 SiK Radio v2,其中包含更详细的用户指南和功能列表。 1 概述 3DR 无线电设备是在自动驾驶仪和地面站之间建立遥测连接的最简单方法。 3DR…

HarmonyOS应用事件打点开发指导

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息。因此,应用开发者需要一种数据打点机制,用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent 是在系统层面…

宋仕强论道之华强北存在的价值(二十九)

华强北特点是小快灵,主要服务散布在世界各地游离态的小体量硬件研发生产企业,这种企业也很难找到大一点的供应商来配套,以前覆盖珠三角长三角,现在是辐射世界各地。华强北是一个大集散地,据华强电子网统计,…

ubuntu 18.04 共享屏幕

用于windows远程ubuntu 1. sudo apt install xrdp 2. 配置 sudo vim /etc/xrdp/startwm.sh 把最下面的test和exec两行注释掉,添加一行 gnome-session 3.安装dconf-editor : sudo apt-get install dconf-editor 关闭require encrytion org->gnome->desktop…

【数据结构】五、数组与广义表

目录 一、定义 二、计算数组元素地址 三、稀疏矩阵快速转置 稀疏矩阵的表示 稀疏矩阵快速转置 四、广义表 一、定义 我们所熟知的一维、二维数组的元素是原子类型。广义表中的元素除了原子类型还可以是另一个线性表。当然所有的数据元素仍然属于同一类型。 这里的数组可…

深圳市城市更新区域关注程度分析数据,tiff格式,附数据可视化,精细到区县

基本信息. 数据名称: 深圳市城市更新区域关注程度分析数据 数据格式: tiff 时间版本:2022年 数据几何类型: 无 数据精度:区县 数据坐标系: WGS84 数据来源:网络公开数据 数据可视化. www.bajidata.com

微信小程序-textarea组件字数实时更新

一、前言 本文实现的是在小程序中&#xff0c;textarea文本框输入文字后&#xff0c;实时显示文字的字数&#xff0c;获取更好的用户输入体验以及提示。 下图是实现的效果 二、代码实现 2-1、wxml代码 <view style"padding: 30rpx;"><view style"…

【已解决】解决Springboot项目访问本地图片等静态资源无法访问的问题

今天在开发一个招聘系统的时候&#xff0c;有投递简历功能&#xff0c;有投递就会有随之而来的查看简历对吧&#xff0c;我投递过的简历&#xff0c;另存为一个文件夹&#xff0c;就是说本地磁盘(或者服务器)有一个专门存放投递过的简历的文件夹&#xff0c;用于存放PDF&#x…

Java最全面试题专题---5、Spring面试题(1)

Spring概述&#xff08;10&#xff09; 什么是spring? Spring是一个轻量级Java开发框架&#xff0c;最早有Rod Johnson创建&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack&#xff08;一站式&#xff…

【jvm从入门到实战】(十) 实战篇-内存调优

内存溢出和内存泄漏&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&#xff0c;这种情况就称之为内存泄漏。内存泄漏绝大多数情况都是由堆内存泄漏引起的。少量的内存泄漏可以容忍&#x…

基于Linphone android sdk开发Android软话机

1.Linphone简介 1.1 简介 LinPhone是一个遵循GPL协议的开源网络电话或者IP语音电话&#xff08;VOIP&#xff09;系统&#xff0c;其主要如下。使用linphone&#xff0c;开发者可以在互联网上随意的通信&#xff0c;包括语音、视频、即时文本消息。linphone使用SIP协议&#…

云原生系列3-Kubernetes

1、Kubernetes概述 k8s缩写是因为k和s之间有八个字符。k8s是基于容器技术的分布式架构方案。官网&#xff1a;https://kubernetes.io/zh-cn/ Google在 2014年开源了Kubernetes项目&#xff0c;Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。同样类似的…

拥抱鸿蒙 - 在展讯T606平台上的探索与实践

前 言 自OpenHarmony 问世后受到了社会各界的广泛关注&#xff0c;OpenHarmony 的生态系统在如火如荼的发展。 酷派作为一家积极拥抱变化的公司&#xff0c;经过一段时间的探索与实践&#xff0c;成功实现将OpenHarmony 系统接入到展讯平台上&#xff0c;我们相信这是一个重要…

华为麒麟系统与鸿蒙系统:发展历程、问题解决与未来展望

导言 华为作为全球领先的科技企业&#xff0c;其自主研发的麒麟系统和鸿蒙系统备受瞩目。本文将深入研究这两者的发展历程、遇到的问题、解决过程&#xff0c;探讨未来的可用范围以及在全球的应用和研究趋势&#xff0c;进一步探讨在哪些方面能取胜&#xff0c;并在哪些领域发力…