Fabric使用自己的链码进行测试-go语言

news2024/12/27 7:53:09

书接前文

Fabric链码部署-go语言

通过上面这篇文章,你可以部署好自己的链码

(后面很多命令是否需要修改,都是根据上面这篇文章来的,如果零基础的话建议先看上面这篇)

就进行下一步

在测试网络上运行自己的链码


目录

1、导航到test-network目录

1.1 打开日志Logspout(可选)

2、启动测试网络

3、测试网络的组成

4、创建一个通道

5、在通道上启动链码

6、与网络交互

6.1 配置对等CLI

6.2 运行Org1

6.2.1 设置环境变量

6.2.2 初始化账本

6.2.3 查询账本

6.2.4 修改账本

6.3 运行Org2


1、导航到test-network目录

打开终端窗口 ,直接cd

下面是我的路径的位置

cd ./go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network

你的可能不一样,这里或许要微调

不过只要到这个目录就可以

1.1 打开日志Logspout(可选)

此步骤不是必需的,但对于链码故障排除非常有用。

要监控智能合约的日志,管理员可以使用logspout工具查看一组Docker容器的聚合输出。

该工具将来自不同 Docker 容器的输出流收集到一个位置,从而可以轻松地从单个窗口查看发生的情况。

这可以帮助管理员在安装智能合约时或开发者调用智能合约时调试问题。

由于某些容器纯粹是为了启动智能合约而创建的,并且只存在很短的时间,因此从网络收集所有日志会很有帮助。

Logspout 工具将不断地将日志传输到的终端,因此将需要使用新的终端窗口。

可以通过运行以下命令来启动 Logspout(直接复制,不需要改)

./monitordocker.sh fabric_test

如果你启动失败,可能是这个位置没有对应文件,我上一篇博客里有提到怎么复制,从哪复制,建议参考

2、启动测试网络

可以在test-network 目录中找到用于启动网络的脚本。


 如果你先前启动了网络,建议先进行一下关闭先前网络的操作,以免后面出一些预料之外的错误

方式为(直接复制,不需要改)

./network.sh down

之后直接输入:(直接复制,不需要改)

./network.sh up

就开始启动网络了

你会看到类似这些内容的输出,就说明成功了

从这里可以看到节点对应的端口信息,后面会用到,不过每次都是一样的,知道在这里找就可以

3、测试网络的组成

部署测试网络后,可以花一些时间检查其组件。

运行以下命令以列出计算机上运行的所有 Docker 容器。(直接复制,不需要改)

docker ps -a

应该能看到由 network.sh 脚本创建的三个节点

测试网络包括两个对等组织:Org1 和 Org2。

它还包括一个维护网络排序服务的单一排序节点组织。

网络中的每个对等点都需要属于一个组织。

在测试网络中,每个组织各运行一个对等点:peer0.org1.example.com 和peer0.org2.example.com

示例网络使用由排序节点组织运营的单节点 Raft 排序服务。

您可以看到在您的计算机上运行的排序节点为 orderer.example.com

4、创建一个通道

现在我们的机器上运行了对等节点和排序节点,我们可以使用脚本为 Org1 和 Org2 之间的事务创建 Fabric 通道。

运行以下命令创建一个默认名称为 mychannel 的通道:(直接复制,不需要改)

./network.sh createChannel

如果命令成功,您可以在日志中看到以下消息:


还可以使用通道标志来创建具有自定义名称的频道。

例如,以下命令将创建一个名为channel1的通道:

./network.sh createChannel -c channel1

通道标志还允许您通过指定不同的通道名称来创建多个通道。

创建mychannel或channel1后,您可以使用以下命令创建第二个名为channel2的频道:

./network.sh createChannel -c channel2

如果您想一步启动网络并直接创建通道,您可以同时使用 up 和 createChannel 模式:

./network.sh up createChannel

5、在通道上启动链码

通道启动之后

下一步就是启动自己的链码了

通过下面命令进行启动(这里需要改)

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/test-protocol-go -ccl go
  • deployCC是这个脚本中定义的一个命令或子命令,它是用来在peer0.org1.example.com 和peer0.org2.example.com 上安部署链码的功能,然后将链代码部署在使用通道标志指定的通道上,如果未指定通道,则部署在mychannel 上
  • -ccn basic指定了链码的名称,这里设置为basic,这意味着你将要部署一个名为basic的链码。(这个名称是官方示例里给的,自己可以修改,但是后面对应位置也要改)
  • -ccp ../asset-transfer-basic/test-protocol-go用于指定链码的路径,../asset-transfer-basic/test-protocol-go是链码所在的目录路径。
  • -ccl go指定链码的语言类型,这里是go,意味着使用的是 Go 编程语言编写的链码。

注意,你需要修改的地方是链码的路径,也就是-ccp之后的部分,需要将路径修改成你的链码的存储位置

如果你不清楚应该如何提前部署己的链码,看我上一篇文章(开头有链接)

成功后是这个样子 

6、与网络交互

6.1 配置对等CLI

使用对等 CLI (peer CLI)与您的网络进行交互

对等 CLI 允许您从 CLI调用已部署的智能合约、更新通道或安装和部署新的智能合约。

使用以下命令将二进制文件添加到您的 CLI 路径:(直接复制,不需要改)

export PATH=${PWD}/../bin:$PATH
  • export:这个命令用于设置环境变量,使得后续的命令可以在当前Shell会话中使用。
  • PATH是一个环境变量,它用于指定系统在哪些目录中查找可执行文件。当你在命令行中输入一个命令时,系统会根据PATH的值在指定的目录中查找这个命令的可执行文件。
  • ${PWD}:是一个变量,表示当前工作目录的路径。
  • ../bin:表示当前工作目录的上一级目录中的bin目录。..表示上一级目录,bin则是一个通常用于存放可执行文件的目录。
  • :$PATH:表示将新设置的目录${PWD}/../bin添加到原始PATH变量中的值的末尾,使用冒号分隔。

还需要将 FABRIC_CFG_PATH设置为指向 Fabric-samples 存储库中的 core.yaml 文件:(直接复制,不需要改)

export FABRIC_CFG_PATH=$PWD/../config/
  • export:这个命令用于设置环境变量,使得后续的命令可以在当前Shell会话中使用。
  • FABRIC_CFG_PATH是一个环境变量,它用于指定Hyperledger Fabric配置文件的路径。
  • $PWD:是一个环境变量,代表当前工作目录的路径。
  • ../config/:表示当前工作目录的上一级目录中的config目录。..表示上一级目录,config则是存放Fabric配置文件的目录。

core.yamlHyperledger Fabric节点的配置文件,用于配置节点的各种参数和设置。这个文件包含了节点的基本配置信息,影响着节点的行为、功能和性能。

Fabric中,每个节点(如对等节点、排序节点等)都有自己的core.yaml配置文件,用于定义节点的特定设置。

6.2 运行Org1

6.2.1 设置环境变量

现在可以设置环境变量,以允许您将对等 CLI 作为 Org1 进行操作:(直接复制,不需要改)

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
  1. CORE_PEER_TLS_ENABLED=true:启用对等节点的TLS安全传输。这表示对等节点将使用安全的TLS协议进行通信。
  2. CORE_PEER_LOCALMSPID="Org1MSP":指定了对等节点所属的本地组织的MSP(成员服务提供者)ID。这里设置为"Org1MSP",表示该对等节点隶属于组织"Org1"。
  3. CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt:设置了对等节点TLS连接时使用的根证书文件路径。这个证书文件用于验证与对等节点通信的远程端的TLS证书的合法性。
  4. CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp:指定了对等节点的MSP配置路径,其中包含了与该对等节点关联的身份验证相关信息,比如管理员身份的证书、私钥等。
  5. CORE_PEER_ADDRESS=localhost:7051:设置了对等节点的地址和端口号,指明其他节点在本地主机(localhost)上的通信地址为7051端口。这是对等节点的gRPC通信地址,其他节点可以使用这个地址与该节点进行通信。

6.2.2 初始化账本

运行以下命令初始化账本:(直接复制,不需要改)

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'

更直观的表示为:(这里是方便你看的,复制的话复制上面这个就可以)

peer chaincode invoke \  # 调用链码命令
  -o localhost:7050 \  # 排序服务节点的地址和端口号
  --ordererTLSHostnameOverride orderer.example.com \  # 排序服务节点的TLS主机名
  --tls \  # 使用TLS连接
  --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \  # 用于验证排序服务节点TLS证书的根证书文件路径
  
  -C mychannel \  # 指定链码所在的通道名称
  -n basic \  # 指定要调用的链码的名称
  
  --peerAddresses localhost:7051 \  # 要调用的对等节点的地址和端口号
  --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \  # 用于验证对等节点TLS证书的根证书文件路径
  
  --peerAddresses localhost:9051 \  # 另一个要调用的对等节点的地址和端口号
  --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \  # 用于验证另一个对等节点TLS证书的根证书文件路径
  -c '{"function":"InitLedger","Args":[]}'  # 指定要调用的链码函数及其参数

最后一行调用了InitLedger函数,这个在我们的链码里是有的

如果成功,应该看到类似以下的输出:

-> INFO 001 Chaincode invoke successful. result: status:200

这条信息表示链码调用成功。status:200表示调用返回了一个 HTTP 200 状态码,通常代表着成功的响应。这表明了链码函数的执行在区块链网络中被成功地触发,并且成功完成了所需的操作。

6.2.3 查询账本

现在可以从 CLI 查询分类帐。

(我的理解是查询不需要背书,所以就一行很简单的代码,但是修改需要背书,就需要标出网络中的其余节点用以联系)

运行以下命令以获取已添加到通道分类帐的资产列表:(直接复制,不需要改,前提是你的链码和我的一样(上一篇博客))

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllIdentities"]}'
  • peer chaincode query: 这部分指明了使用peer命令行工具,并调用其中的chaincode query子命令,用于执行链码的查询操作。
  • -C mychannel: 指定了要执行查询的通道名称,这里是mychannel
  • -n basic: 指定了要查询的链码的名称为basic
  • -c '{"Args":["GetAllIdentities"]}': 这是指定了要调用的链码函数及其参数的部分。在这里,调用了链码中的GetAllAssets函数,它是一个查询函数,用于获取所有资产的信息。

如果成功,应该看到以下输出:

6.2.4 修改账本

使用以下命令通过调用链码来更新现有的数据:(直接复制,不需要改,前提是你的链码和我的一样(上一篇博客))

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"UpdateIdentity","Args":["identity4","P","S","V"]}'

上述语句的功能是修改id为identity4的数据

成功会返回下列输出

2023-12-12 09:07:59.485 CST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 

我们再次输出全部数据看一下

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllIdentities"]}'

 可以看到已经更改了

先前这些操作都是通过Org1进行的,如果你想通过Org2进行,通过下面的方式进入Org2

6.3 运行Org2

设置以下环境变量以运行Org2 :(直接复制,不需要改)

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

设置好这些环境变量之后就ok了

后面直接调用函数就可以,方式和6.2.2-6.2.4一样,除了函数名和输入给函数的参数那一块需要自行更改之外,其他的直接复制

7、关闭网络

链码里所有的函数都可以在刚刚通过Org1或者Org2进行测试

读者可以自己多试试

测试完之后就要关闭网络

注意:如果你没有关闭网络,下次再部署网络时会出现难以预料的错误!!!

./network.sh down

通过上面这条语句就可以关闭网络

8、常见问题

我这里就说说我遇到的问题


8.1 connection refused

在第5步启动链码时,如果是第一次启动链码,会从GitHub下载一些依赖,可能会出现connection refused问题

建议去配一下GitHub的SSH密钥连接,就可以解决


8.2 不要sudo

上面的所有语句都不要加sudo

如果出现提示说权限不足,先退到上级文件夹,改一下这个文件夹的权限,设置为最高就可以

就是那个777的命令,去搜一下如何修改文件权限就能找到


我遇到的就这两个错误

其他的错误也有,不过如果按照我上篇文章和这篇文章的步骤来的话,应该是都可以避开的

这篇教程就到此结束

后面我继续肝一下官方文档里的CA部分,如果搞明白了会继续出新教程

如果能帮到你的话顺手留个赞奥,谢谢好心人/doge

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32单片机项目实例:基于TouchGFX的智能手表设计(5)硬件驱动层程序设计

STM32单片机项目实例:基于TouchGFX的智能手表设计(5)硬件驱动层程序设计 目录 一、 概述 二、 新建工程与外设配置 三、 TouchGFX配置 四、 增加TouchGFX关键驱动 一、 概述 本文内容主要进行工程新建,硬件外设的配置以及添加…

《PySpark大数据分析实战》-10.独立集群模式的代码运行

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…

03. 医院设置_后端

1、Swagger2 测试工具 编写和维护接口文档是每个程序员的职责,根据Swagger2可以快速帮助我们编写最新的API接口文档,再也不用担心开会前仍忙于整理各种资料了,间接提升了团队开发的沟通效率。 swagger通过注解表明该接口会生成文档&#xf…

CSC公派研究生项目|电气工程在读博士谈丹麦奥尔堡大学联培体会

2023年已近兔尾,很多人已经开始新一年的规划,对于国内在读博士而言,申请国家留学基金委(CSC)公派研究生项目也开始列入议事日程,然而,如何申请?在国外学习收获如何?本篇知…

IDEA小技巧

目录 1. IDEA自动添加注释 创建类的时候自动添加注释 创建函数、方法的注释 1. IDEA自动添加注释 参考文档:idea java 自动添加文件注释 idea新建类自动注释_mob6454cc73c728的技术博客_51CTO博客 【操作工具】IDEA创建类及已有类添加注释-详细操作_idea设置创建…

【状态机FSM 序列检测 饮料机_2023.12.1】

同步状态机 概念 同步状态机(同一脉冲边沿触发):有限个离散状态及某状之间的转移 异步状态机无法综合 分类 Moore状态机 只和状态有关,与输入无关 Mealy状态机 和状态和输入都有关 Mealy型比Moore型少一个状态 结构 由状态寄…

AI日报:OpenAI向新用户重新开放ChatGPT Plus订阅

欢迎订阅专栏 《AI日报》 获取人工智能邻域最新资讯 文章目录 总览Chatgptplus重新开放订阅#暂停原因功能 OpenAI的1000万美元安全人工智能拨款拨款初衷学术捐赠 总览 ChatGPT Plus再次向新用户开放,但目前每三小时限制发送40条消息。 OpenAI还宣布拨款1000万美元…

喜报!Coremail荣获2023信创“大比武”优秀生态融合奖

近期,2023信创“大比武”金融业务创新应用赛道(简称金融赛道)活动正式落下帷幕。经过赛程的层层考核,中泰证券股份有限公司(简称“中泰证券”)与Coremail联合组成的“中泰证券CACTER邮件安全保卫队”最终在…

Linux篇:信号

一、信号的概念: ①进程必须识别能够处理信号,信号没有产生,也要具备处理信号的能力---信号的处理能力属于进程内置功能的一部分 ②进程即便是没有收到信号,也能知道哪些信号该怎么处理。 ③当进程真的受到了一个具体的信号的时候…

2021实战面试

1、Rem , em , px , % , vw 之间的区别 PX: px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。 em: 1,子元素字体大小的em是相对于父元素字体大小 2,元素的width/height/padding/margin用em的话是相对于该元素的font-size rem:1rem是…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针(非函数指针): 有类型的函数指针: void 类型的指针: 结语 前言 进行单元测试之后,但凡…

免费且强大卸载软件工具-Geek Uninstaller

Geek Uninstaller是一款用于Windows操作系统的免费卸载软件。它提供了一种比Windows内置卸载工具更彻底的卸载程序的方法。界面简单没有广告,操作也十分的简单。 特点 完全的程序卸载:Geek Uninstaller 被设计为彻底卸载程序,包括删除剩余…

YOLOv8改进《目标对象计数》多任务实验:深度集成版来了!支持自定义数据集训练自定义模型

💡该教程为改进YOLO专栏,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可💡更方便的统计更多实验数据,方便写作 YOLOv8改进《目标对象计数》多任务实验:深度集成版来了!支持自定义数据集训练自定…

springboot发送邮件,内容使用thymeleaf模板引擎排版

springboot发送邮件,内容使用thymeleaf模板引擎排版 1、导入jar包2、yml设置3、收件人以及收件信息设置4、发邮件service5、模版页面6、controller 1、导入jar包 <!--发送邮件--><dependency><groupId>org.springframework.boot</groupId><artifac…

使用Axure RP结合内网穿透工具制作本地静态web页面并实现公网访问

作者简介&#xff1a; 懒大王敲代码&#xff0c;正在学习嵌入式方向有关课程stm32&#xff0c;网络编程&#xff0c;数据结构C/C等 今天给大家讲解使用Axure RP结合内网穿透工具制作本地静态web页面并实现公网访问&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &am…

订单系统设计-状态机

1. 状态机 1.1 状态机简介 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型。 有限状态机一般都有以下特点&#xff1a; 可以用状态来描述事物&#xff0c;并且任一时刻&#xff0c;事物总是处于一种状态&#xff1b;事物拥有的状态总数…

线程安全集合类

文章目录 1. ConcurrentHashMap2. LinkedBlockingQueue 阻塞队列3. ConcurrentLinkedQueue4. CopyOnWriteArrayList JDK1.7 hashmap采用数组加链表头插的方式&#xff0c;在扩容时会出现循环死链问题&#xff0c;A->B->C扩容后C->B->A AB BA出现循环死链。 1. Conc…

Dockerfile的介绍和使用

什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerf…

【Monitor, Maintenance Operation, Script code/prgramme】

Summary of M,M&O,Program JD) Monitor & M&O Symbio信必优) Job chance/opportunities on Dec 12th, 20231.1) Content 招聘JD job description:1.2) suggestions from Ms Liang/Winnie on Wechat app1.3) Java微服务是什么&#xff1f;1.3.1) [URL Java 微服务](…

yarn系统架构与安装

1.1 YARN系统架构 YARN的基本思想是将资源管理和作业调度/监视功能划分为单独的守护进程。其思想是拥有一个全局ResourceManager (RM)&#xff0c;以及每个应用程序拥有一个ApplicationMaster (AM)。应用程序可以是单个作业&#xff0c;也可以是一组作业。 一个ResourceManage…