提交链码-编辑前后端,调用链码功能

 一 . 链码介绍

1.什么链码?

  • • 链码是一段用 Go、Node.js 或者 Java 实现了规定接口的程序。链码在安全的Docker容器中运行, 与背书节点的进程隔离。通过应用程序提交的交易,链码初始化和管理账本状态。
  • • 链码通常处理网络成员协商达成的业务逻辑,因此可以被视为”智能合约”。由链码创建的账本更新 仅限于该链码的范围,其他链码无法直接访问。然而,在同一个网络中,如果具有适当的权限,一个 链码可以调用另一个链码来访问其状态。
  • • 在这个概念主题中,我们将从区块链网络运营者的角度来探讨链码,而不是应用程序开发者。链码运 营者可以将本主题作为指南,了解如何使用Fabric链码生命周期在其网络上部署和管理链码。

 2.链码生命周期

二.代码形式实现链码的生命周期

 1. 链码准备

准备文件 

  1.  在测试目录下创建chaincode 
mkdir chaincode
  1.  拷贝测试链码进chaincode目录

  1. 拷贝set-env.sh脚本进scripts目录

2.打包链码 

打包测试链码

运行以下链码:

export FABRIC_CFG_PATH=${PWD}/config
peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/chaincode-basic --lang node --label chaincode_basic_1.0

检查打包结果:

3. 安装链码

运行以下进入fabric-cli容器:
docker exec -it fabric-cli bash

1. 在org1中安装 运行以下链码安装:

. scripts/set-env.sh 1 0 7051
peer lifecycle chaincode install chaincode/chaincode_basic.tar.gz

在org2中安装 运行以下链码安装:

. scripts/set-env.sh 2 0 9051
peer lifecycle chaincode install chaincode/chaincode_basic.tar.gz

查看安装情况
peer lifecycle chaincode queryinstalled

4. 批准链码

org1批准链码

1. 设置链码环境变量

export CC_PACKAGE_ID=chaincode_basic_1.0:1acd72b79f2d6f41ee6c55d408e8639ddd1cb90b4a450f571ded881d5d91f439

2. 设置Org1环境变量

. scripts/set-env.sh 1 0 7051

3.批准链码

peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

org2批准链码

1. 设置Org1环境变量

. scripts/set-env.sh 2 0 9051

2.批准链码

peer lifecycle chaincode approveformyorg -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

检查提交准备

peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --sequence 1 --tls --cafile $ORDERER_CA --output json

5. 提交链码

提交链码是特殊交易,需要背书节点背书,因此需要指定2个背书节点。具体操作如下:

peer lifecycle chaincode commit -o orderer.example.com:7050 --ordererTLSHostnameOverride orderer.example.com --channelID $CHANNEL_NAME --name chaincode_basic --version 1.0 --sequence 1 --tls --cafile $ORDERER_CA --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA

查询提交的链码

peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name chaincode_basic --tls --cafile $ORDERER_CA

6. 测试验证

调用InitLedger功能

执行以下命令调用:

peer chaincode invoke -o orderer.example.com:7050 --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name chaincode_basic --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"function":"InitLedger", "Args":[]}'

调用ReadAsset功能

执行以下命令调用:

peer chaincode query -C $CHANNEL_NAME --name chaincode_basic -c '{"function":"ReadAsset","Args":["asset1"]}'

三.HF链码调用

1.. 使用示例代码调用

拷贝application-gateway-go项目

1. 在服务器创建goProject目录

2. 找到fabric-samples\asset-transfer-basic\application-gateway-go文件夹

3. 将文件夹拷贝至服务器goProject目录

拷贝证书

运行以下代码拷贝:

cd ~/goProject/application-gateway-go 
cp ~/test/organizations . -r

安装依赖

运行以下代码安装依赖:

go mod tidy

运行项目验证

运行以下代码:

go run assetTransfer.go

2. 使用给定接口项目调用

使用VSCode打开Go-Gateway项目

修改app.conf

修改peer1Org1IP为你服务器IP

拷贝organizations目录

拷贝服务器test目录下的organizations目录到项目中

复制项目进入服务器goProject中

安装依赖并运行

go mod tidy
bee run

使用Postman验证

验证evaluate接口

三.fabric基础案例开发实训

项目架构

1. 构建案例项目服务端

创建项目

• 创建目录 在指定目录下创建base-back文件夹,在文件夹下创建app.py

构建最小系统

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
 return 'Hello World!'
if __name__ == '__main__':
 app.run()

运行与调试代码

点击右上角三角符号 执行成功将有下方信息显示

访问“/”路由确认 使用浏览器,访问“http://localhost:5000/”

 

2. 代码调用basic链码

链码功能说明链码功能包括:InitLedger(初始 化资产)、CreateAsset(创建资 产)、ReadAsset(读取资产)、UpdateAsset(更新资产)、DeleteAsset(删除资产)

启动go-gateway

服务端进入指定目录

bee run

初始化接口功能

使用VSCode在app.py中添加如下代码:

from flask import Flask,request,jsonify
import requests
import json
app = Flask(__name__)
invokeURL = "http://192.168.200.112:8080/invoke"
evaluateURL = "http://192.168.200.112:8080/evaluate"
@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/initLedger',)
def ledgerInit():
    pass

@app.route('/createAsset',methods=['POST'])
def assetCreate():
    json_data = request.json
    payload = json.dumps({
        "channelName":"applicationchannel",
        "chaincodeName":"chaincode_basic",
        "funcName":"CreateAsset",
        "paramArray":json_data.get("paramArray")
    })
    headers = {
        'Content-Type': 'application/json'
    }

    response = requests.request("POST",invokeURL,headers=headers,data=payload)

    print(response.text)
    return jsonify({
        'code':200,
        'msg':"create success"
    })


@app.route('/readAsset',methods=['POST'])
def assetRead():
    json_data = request.json
    payload = json.dumps({
        "channelName": "applicationchannel",
        "chaincodeName": "chaincode_basic",
        "funcName": "ReadAsset",
        "paramArray": json_data.get("paramArray")
    })
    headers = {
        'Content-Type': 'application/json'
    }

    response = requests.request("POST",evaluateURL,headers=headers,data=payload)

    print(response.text)
    return jsonify({
        'code':200,
        'msg':"query success",
        "data": response.text
    })

@app.route('/updateAsset',)
def assetUpdate():
    pass

@app.route('/deleteAsset',)
def assetDelete():
    pass

if __name__ == '__main__':
    app.run()

安装并使用requests

pip install requests

开发CreateAssets功能

使用VSCode在app.py中添加如下代码:

CreateAssets功能开发验证

开发ReadAssets功能

使用VSCode在app.py中添加如下代码:

ReadAssets功能开发验证

3. 开发前端项目代码

使用VSCode打开项目

解压base-front-init.zip文件,使用VSCode打开项目

首先要把原本20.0版本的Node删掉,下载16.6版本 

使用VSCode打开项目

使用npm run serve运行项目,使用浏览器打开url: http://localhost:8020

完善CreateAsset功能代码

找到Basic.vue完善以下代码:

在调用之前确保postman已经调用成功,启动go-gateway 

createAsset功能调用

 

完善ReadAsset功能代码

在Basic.vue中首先完善页面显示代码:

readAsset功能调用

1. 页面输入参数:

2. 点击调用,显示调用成功:

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

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

相关文章

全网都在找的python+requests接口自动化测试框架实例详解教程

前言 Python是一种功能强大的编程语言,它可以用于自动化测试,特别是接口自动化测试。许多Python库都可以用于接口自动化测试,其中requests库是其中最受欢迎的库之一。 requests库可以用于发送HTTP请求并获取服务器响应,从而轻松…

spring常用注解(五)lombok库

一、介绍: 1、简介: Lombok是一个作用于编辑器和构建工具的 Java 库,可以对编写的 Java 代码进行增强,比如说不用再写实体类的 getter 方法,equals 方法而是自动生成,自动生成日志输出变量等等&#xff0…

uniapp 之 开发微信小程序入门详细指南

目录 配置运行设置(编辑器的设置)项目目录文件配置基础配置中的uniapp应用标识(AppID)配置微信小程序的AppID 总结 配置运行设置(编辑器的设置) 点击编辑器上方菜单栏 - 运行 - 运行到小程序模拟器 - 运行…

css利用transform:skew()属性画一个大屏的背景斜面四边形特效

在工作工程中需要写一个如下的大屏背景&#xff0c;是由几个斜面做成的效果 使用css transform function中的skew()方法实现画其中一个斜面&#xff0c;然后调整背景色实现 写一个div <div class"skew_container test-2"><div class"skew_container_it…

【Linux进程】守护进程

【Linux进程】守护进程 目录 【Linux进程】守护进程守护进程守护进程概念进程组和会话的概念 系统的守护进程函数 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.4.27 前言&#xff1a;本篇博客将会介绍守护进程&#xff0c;以及进程组和会话的概念&#xff0c;如何变成…

【信息收集】WAF防火墙识别工具Wafw00f

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、了解WAF防火墙 Web应用防护系统&#xff08;也称为&…

【Pytorch】(十三)模型部署: TorchScript

文章目录 &#xff08;十三&#xff09;模型部署: TorchScriptPytorch动态图的优缺点TorchScriptPytorch模型转换为TorchScripttorch.jit.tracetorch.jit.scripttrace和script的区别总结trace 和script 混合使用保存和加载模型 &#xff08;十三&#xff09;模型部署: TorchScr…

基于java+springboot+vue实现的医疗挂号管理系统(文末源码+Lw)203

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对医疗挂号信息管理的提升&#x…

Pytorch 之torch.nn初探 卷积--Convolution Layers

任务描述 本关任务&#xff1a; 本关提供了一个Variable 类型的变量input&#xff0c;按照要求创建一 Conv1d变量conv&#xff0c;对input应用卷积操作并赋值给变量 output&#xff0c;并输出output 的大小。 相关知识 卷积的本质就是用卷积核的参数来提取原始数据的特征&a…

OpenHarmony语言基础类库【@ohos.util.Stack (线性容器Stack)】

ohos.util.Stack (线性容器Stack) Stack基于数组的数据结构实现&#xff0c;特点是先进后出&#xff0c;只能在一端进行数据的插入和删除。 Stack和[Queue]相比&#xff0c;Queue基于循环队列实现&#xff0c;只能在一端删除&#xff0c;另一端插入&#xff0c;而Stack都在一…

[Qt的学习日常]--信号和槽

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习&#xff…

PyQt6 优化操作:建立侧边栏,要求可拖拽改变宽度,可用按钮控制侧边栏的展开和收起

1. 官方文档 QSplitter — PyQt Documentation v6.6.0 2. 效果展示 可拖拽改变宽度比例 点击按钮快速收起或展开侧边栏 点击按钮&#xff0c;侧边栏收起&#xff0c;同时按钮图标变为向左箭头 (对应展开功能)&#xff0c;再次点击按钮&#xff0c;侧边栏展开&#xff0c;同…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

英智数字孪生机器人解决方案,赋能仓库物流模式全面升级

工业机械臂、仓储机器人、物流机器人等模式的机器人系统在现代产业中扮演着愈发重要的角色&#xff0c;他们的发展推动了自动化和智能化水平的提高&#xff0c;有助于为制造业、物流业、医疗保健业和服务业等行业创造新效率并提升人们的生活质量。 行业面临的挑战 机器人开发、…

Windows安装Elasticsearch 7.9.2

1 下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-windows-x86_64.zip 2 配置 进入config目录&#xff0c;打开elasticsearch.yml文件&#xff0c;给集群和节点配置名称。 cluster.name: my-es node.name: node-1 3 启动 打开bin目录&am…

Docker之常见FAQ记录清单

一、前言 本文记录Docker使用过程中遇见的问题&#xff0c;供后续回顾参考。 关联资源&#xff1a;网络Docker博客、官方FAQ、文档、Docker 从入门到实践、中文社区、riptutorial 二、问题及处理记录 2.1、docker容器内没有vi,nano等编辑器 1&#xff09;如果宿主机本地有&a…

vs2019 - warning LNK4098 : 默认库“msvcrt.lib”与其他库的使用冲突

文章目录 vs2019 - warning LNK4098 : 默认库“msvcrt.lib”与其他库的使用冲突概述笔记实验 - 编译静态库实验 - 编译主工程&#xff0c;包含静态库实验主工程和静态库编译设置不同时的编译报错和警告备注备注 - 判断/Mdd, /MdEND vs2019 - warning LNK4098 : 默认库“msvcrt.…

[SWPUCTF-2022-新生赛]ez_sql

title:[SWPUCTF 2022 新生赛]ez_sql 审题 根据提示&#xff0c;POST传参 得到假的flag 判断类型 字符型注入 判断列数 发现空格和’or’被过滤 重新构造 nss-1/**/oorrder/**/by/**/4#发现为3个字段 采用联合注入union 爆库 发现union被过滤&#xff0c;双写union绕过 发…

以生命健康为中心的物联网旅居养老运营平台

随着科技的飞速发展和人口老龄化的日益加剧&#xff0c;养老问题逐渐成为社会关注的焦点。传统的养老模式已经难以满足现代老年人的多元化需求&#xff0c;因此&#xff0c;构建一个以生命健康为中心的物联网旅居养老运营平台显得尤为重要。 以生命健康为中心的物联网旅居养老运…

两大成果发布!“大规模量子云算力集群”和高性能芯片展示中国科技潜力

在当前的科技领域&#xff0c;量子计算的进步正日益引起全球的关注。中国在这一领域的进展尤为显著&#xff0c;今天&#xff0c;北京量子信息科学研究院&#xff08;以下简称北京量子院&#xff09;和中国科学院量子信息与量子科技创新研究院&#xff08;以下简称量子创新院&a…