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

 一 . 链码介绍

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.jsonpayload = 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.jsonpayload = 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():passif __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. 点击调用,显示调用成功:

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

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

相关文章

若依文件下载

后端自带工具controller package com.ruoyi.web.controller.common;import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.Logger…

docker常用基本命令

把jar包和 dockerfile文件放到同一目录下#构建Docker镜像 注意后面的 . 不能省略 docker build -t your-image-name .#运行并创建一个容器 docker run -d -p 8080:8080 --name container_name your-image-name# 停止容器 767fce4cb990 容器ID (容器名也可以) docker stop 767f…

HarmonyOS开发案例:【rating组件】

介绍 将引导开发者使用rating组件实现星级打分功能。 相关概念 [rating组件]:评分条,可根据用户判断进行打分。 环境搭建 软件要求 [DevEco Studio]版本:DevEco Studio 3.1 Release及以上版本。OpenHarmony SDK版本:API vers…

sCrypt全新上线RUNES功能

sCrypt智能合约平台全新上线一键etch/mint RUNES功能! 请访问 https://runes.scrypt.io/ 或点击阅读原文体验! 关于sCrypt sCrypt是BSV区块链上的一种智能合约高级语言。比特币使用基于堆栈的Script语言来支持智能合约,但是用原生Script编…

宁盾LDAP统一用户认证与单点登录:构建高效安全的企业身份认证

在信息化时代,企业面临着众多的应用系统和数据资源,如何有效地管理和保护这些资源,确保信息安全和高效利用,成为了企业信息化建设的核心问题。LDAP统一用户认证和单点登录(SSO)作为一种高效、安全的身份验证…

Quarto Dashboards 教程 2:Dashboard Layout

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度,分享官方文档的中文教程。软件可能随时更新,建议配合官方文档一起阅读。推荐先按顺序阅读往期内容: 1.quarto 教程 1:Hello, Quarto 2.qu…

srpingMVC基本使用

文章目录 1. springMVC基本功能(1) maven坐标导入(2) 编写表现层(3) springMVC配置类编写(4) 部署tomcat访问 2. 各种请求方法get请求post请求put请求delete请求请求参数提取 3. 请求参数接收(1) param参数接受封装到对象中 (2) 路劲参数接收集合接受时间类型接收json参数接收m…

1.C++入门(上)

目录 1.C关键字 2.命名空间 作用域方面的优化 a.命名空间定义 b.命名空间使用 3.C 输入&输出 1.C关键字 C有63个关键字,C语言有32个关键字,存在重叠如荧光笔标出 2.命名空间 作用域方面的优化 如果变量,函数和类的名称都存在于全…

java 词法分析练习

import parser.Parser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arrays.asList("int","String…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

mac 教程 终端如何拆墙

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)

【Paddle】PCA线性代数基础及领域应用 写在最前面一、PCA线性代数基础1. PCA的算法原理2. PCA的线性代数基础2.1 标准差 Standard Deviation2.2 方差 Variance2.3 协方差 Covariance2.4 协方差矩阵 The Covariance Matrix2.5 paddle代码demo①&#xff1a;计算协方差矩阵2.6 特…

4.8 Python dict字典

Python dict字典详解 Python字典&#xff08;dict&#xff09;是一种无序的、可变的序列&#xff0c;它的元素以“键值对&#xff08;key-value&#xff09;”的形式存储。相对地&#xff0c;列表&#xff08;list&#xff09;和元组&#xff08;tuple&#xff09;都是有序的序…

【Android12】Bugreport实现原理

Bugreport实现原理 Bugreport Bugreport介绍 Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。 系统发生某些问题时&#xff0c;可以通过bugreport把系统当前时刻点&#xff08;运行BugRepot的时刻&#xff09;的系统相关的状态和信息…

HarmonyOS 实战开发-MindSpore Lite引擎进行模型推理

场景介绍 MindSpore Lite 是一款 AI 引擎&#xff0c;它提供了面向不同硬件设备 AI 模型推理的功能&#xff0c;目前已经在图像分类、目标识别、人脸识别、文字识别等应用中广泛使用。 本文介绍使用 MindSpore Lite 推理引擎进行模型推理的通用开发流程。 基本概念 在进行开…

YOLOv5利用Labelimg标注自己数据集

目录 一、Labelimg介绍二、Labelimg下载三、Labelimg安装四、Labelimg使用1、准备2、开始标注 一、Labelimg介绍 LabelImg是一款开源的图片标注工具&#xff0c;使用Python编写&#xff0c;基于PyQt5框架。它提供了一个直观的图形用户界面&#xff0c;方便用户对图片进行标注&…

axios——503响应超时重复多次请求——技能提升

今天在写后台管理系统时&#xff0c;遇到一个问题&#xff0c;就是每天早上一启动项目&#xff0c;接口会提示503超时&#xff0c;因此项目运行必须重新刷新请求成功后才可以正常使用。 后端同事说请求超时了&#xff0c;需要前端处理一下&#xff0c;如果是503的状态码&#…

Golang特殊init函数

介绍 init()函数是一个特殊的函数&#xff0c;存在一下特性 不能被其它函数调用&#xff0c;而是子main()函数之前自动调用不能作为参数传入不能有传入参数和返回值 作用&#xff1a; 对变量进行初始化检查/修复程序状态注册运行一次计算 以下是<<the way to go>>…

Web APIs 学习归纳1---Web API概述简单的元素获取

JS基础中我们学习了JS的基本语句&#xff0c;这些是后续学习中的基础。 有了上述JS的基础以后&#xff0c;我们就可以开始学习交互效果的实现方法。这里很多时候直接调用JS封装好的API即可。 一、Web APIs 和 JS 基础关联性 这里有一张图很好的解释了这个问题&#xff1a; 我们…

python高校贫困学生资助奖学金管理系统vue+django

我们根据项目文档&#xff0c;包括规格说明、文档及在设计过程中形成的测试大纲、测试内容及测试的通过准则、再次全面熟悉系统&#xff0c;做好测试准备。为了保证测试的质量&#xff0c;我们将测试过程分为几个阶段。第一阶段&#xff0c;在单元测试阶段我们对每个子模块进行…