fabric2.X以上系统用test-network环境测试自己的链码

2023-11-02

首先,我们需要安装好fabric2.X的环境,具体参考我之前的文章:

这里默认已经有了fabric2.X的环境,进入test-network文件夹:

在开始测试之前:先把gopath项目路径全部解锁:

sudo chmod -R 777 $GOPATH

打开测试网络:sudo ./network.sh up

如果想要同时启动CA服务器和couchdb,执行这条指令:./network.sh up createChannel -ca -s couchdb

可以看到启动了fabric2.3的测试网络,包含了一个cli,两个peer结点,和一个orderer结点(用来排序的):

可以用docker ps 查看开启的容器:

接着在测试网络加入通道:

./network.sh createChannel

这里我们设置一下go的环境变量,当然如果有科学上网那最好,但是还是同时设置下:

这是go语言代理的网址:

Goproxy.cnThe most trusted Go module proxy in China.https://goproxy.cn/

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

然后可以看下go env:

看到go的 环境变量改了:

我这里已经设置了,就不操作了: 

重要:

这里我们进行自己链码安装:

首先在当前目录下新建一个文件夹mychaincode再在里面新建一个文件夹,把自己编写的链码放进去:

在这里打开终端:

执行:go mod init

再执行:go mod tidy  (增加需要的包,去掉不需要的包)

最后执行:go mod vendor

这里是讲链码的所有依赖下载到本文件夹内的vendor内,实现依赖封装:

此时,我们的链码环境才算完成了!

接下来就是链码的安装:

回到test-network目录下:

我们先看示例:sudo ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

我们执行:sudo ./network.sh deployCC -ccn mycc -ccp ../asset-transfer-basic/chaincode-go -ccl go

如果出现这个报错:

是因为我们用了sudo 管理员模式下会有时候找不到go的环境 我们去掉sudo:

运行:./network.sh deployCC -ccn mycc -ccp ../asset-transfer-basic/chaincode-go -ccl go

显示:

说明我们的链码在两个组织的结点上都安装成功了!

这个时候我们就要来实例化链码了:

这里注意,我们使用的官方的脚本,在fabric2.0版本中默认是不需要实例化链码了,所以直接调用invoke即可:

首先配置一下环境变量:

export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
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

这里执行初始化链码:

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 mycc --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":"Init","Args":["A","100","B","200"]}'

为什么参数这么写?让我们看一下链码:

这里需要传入四个参数,(注意!fabric2.0中,无论链码需要传入什么参数,我们统一用字符串进行传入即可,就是

执行结果:

说明已经执行成功了!

此时执行自己写的一个链码方法:

我们看链码源码:

在2.0链码里,方法名就是Saysomething,对应前面的"function":"Saysomething",后面的args后面的参数就是链码中的something string。

在执行查询链码:

从链码可知道,只需要传进去一个A string就行了:

执行:

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 mycc --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":"Query","Args":["A"]}'

 

可以看到查出来了:100,A的资产是100,也就是最开始初始化链码时存入账本的值。

这里尝试把peer0.org1.example.com和peer0.org2.example.com的路径删除再执行:

发现可以执行的!说明在查询的时候,也就是设计到账本改动的时候是不需要加背书策略的!

这里可以注意一下:就是如果是查询操作,仅仅是查询账本上的数据,那么可以把invoke改成query即可,当然也可以继续使用invoke也可以的!

如:

peer chaincode query -C mychannel -n mycc -c '{"function":"Query","Args":["A"]}'

因为是查询,所以不需要连接orderer结点,也不需要加上两个peer的证书,也就是查询不需要背书策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fabric2.X以上系统用test-network环境测试自己的链码 的相关文章

随机推荐

  • 嘿!不备案不要HTTPS!小程序请求任意网站黑科技来了!

    顶着被 封 的危险 我要偷偷告诉你一个目前还没 公布 的黑科技 方法原创研发 并在实际项目中得到了很好的使用体验 好 认真往下看 我将会告诉你一个非常好玩 实用 黑科技的技能 这将让你扩展到更多小程序开发思路 从而实现之前无法实现的功能 来
  • php查询对象是否有某个属性可用,JavaScript 判断对象中是否有某属性的常用方法...

    判断对象中是否有某属性的常见方式总结 不同的场景要使用不同的方式 一 点 或者方括号 通过点或者方括号可以获取对象的属性值 如果对象上不存在该属性 则会返回undefined 当然 这里的 不存在 指的是对象自身和原型链上都不存在 如果原型
  • 报错Failed to load config “prettier“ to extend from.两步解决方案

    解决方案 1 进入项目根目录 npm i eslint prettier eslint eslint config prettier save dev 原因 I just had this error I was manually inst
  • SQLITE源码剖析

    http www iteye com blogs subjects deepfuture
  • 走进首个通用无代码开发平台—iVX

    目录 1 iVX简介 首个 通用 无代码 开发平台 应用可移植特性 2 iVX三大属性 iVX的语言属性 iVX的云属性 云原生 iVX的工具属性 3 iVX两大能力 代码生成能力 图灵完备 的逻辑能力 4 iVX能开发哪些应用 webAp
  • 离散化算法

    文章目录 离散化模板 巩固练习 电影 区间和 金发姑娘和 N 头牛 粉刷栅栏 线段覆盖 逆序对 程序自动分析 基本介绍 离散化 把无限空间中有限的个体映射到有限的空间中去 以此提高算法的时空效率 通俗的说 离散化是在不改变数据相对大小的条件
  • Flutter开发:Flutter UI之弹窗系列

    import dart io import package flutter material dart import package flutter services dart import package flutter app demo
  • [764]tmux简介及使用教程

    tmux是一个开源工具 用于在一个终端窗口中运行多个终端会话 它可以减少过多的打开终端控制台 tmux的源码在 https github com tmux tmux 它的License是BSD Tmux 是一个终端复用器 terminal
  • 记录yolov5更改backbone为ShuffleBlock网络迁移训练出错问题以及解决方法

    前言 最近在学习yolov5 记录一些报错 1 张量不对 Sizes of tensors must match except in dimension 1 Expected size 16 but got size 8 for tenso
  • 雾化(使用w分量)

    11
  • 将一个按钮固定在右下角

    fix btn position fixed bottom 5rem right 2rem
  • xpath——4k解析图片

    需求 解析下载图片数据 http pic netbian com 4kyouxi import requests from lxml import etree import os if name main headers User Agen
  • 互联网背景下为什么会出现NoSQL?

    一 传统应用模式 ALL IN ONE 所有的东西都部署在一台机器上 包括站点 数据库 文件等等 现在阿里云的出现方便了很多 核心工作就是 前端传过来一些数据 然后业务逻辑层拼装 然后访问数据库 数据库返回数据 数据拼装成页面 最终返回到浏
  • Python做一个简单的名片管理系统

    项目介绍 如下图 本次项目主要完成新建名片 显示全部名片 查询对应名片并对对应名片完成相关操作 框架搭建 名片管理首先可以由main py以及tools py组成 main py主要完成主要功能 tools主要完成选择分支下的功能 由于每次
  • 面经-阿里电话面试

    又是一年面试季节 闲来无事看看市面上都在找那些技术 查缺补漏弥补不足 当然如果能够找到不错的去处也是好的 说来惭愧 第一次接到阿里电话时正在外边跟同事吃饭 环境实在是不允许 冒昧的给推迟到第二天了 第二次 是第二天的下午开会中 由于手机静音
  • VLC相关参数中文说明!

    用法 vlc 选项 流 您可以在命令行中指定多个流 它们将被加入播放列表队列 指定的首个项目将被首先播放 选项样式 选项 用于设置程序执行期间的全局选项 选项 单字母版本的全局 选项 选项 一个仅在流之前应用的选项 且将覆盖先前的设置 流
  • 探索Java中的反射机制:解析类的信息与执行动态操作

    探索Java中的反射机制 解析类的信息与执行动态操作 引言 在Java编程领域中 反射机制是一项强大的工具 它使得我们能够在运行时动态地获取 使用类的信息 甚至可以对类进行修改 通过反射 我们可以在编译时未知类的情况下 通过获取类的构造方法
  • 为什么 Java 中只有值传递?

    开始之前 我们先来搞懂下面这两个概念 形参 实参 值传递 引用传递 形参 实参 方法的定义可能会用到 参数 有参的方法 参数在程序语言中分为 实参 实际参数 用于传递给函数 方法的参数 必须有确定的值 形参 形式参数 用于定义函数 方法 接
  • python中函数返回值为func 和func() 的区别

    今天看书注意到一个问题 就是有些函数的返回值是直接return func 有些则是return func 看不清其区别 所以自己探究了一下 首先定义一个foo函数 def foo pass 察看type foo 得到
  • fabric2.X以上系统用test-network环境测试自己的链码

    首先 我们需要安装好fabric2 X的环境 具体参考我之前的文章 这里默认已经有了fabric2 X的环境 进入test network文件夹 在开始测试之前 先把gopath项目路径全部解锁 sudo chmod R 777 GOPAT