fabric-sdk-go

Fabric-SDK-go

  • 区块链网络搭建
  • fabric-sdk代码
    • 代码结构:
    • 代码eg:

区块链网络搭建

使用fabric-sample的网络结构用容器搭建起测试网络即可。

fabric-sdk代码

代码很简易,主要为了了解怎么使用fabric为编程人员提供的sdk从而提供HTTP接口的情况。

代码结构:

在这里插入图片描述
main.go:定义对外http接口的web路由,与程序的启动。
client.go:可以理解为./pkg/fabric/路径下的代码文件为chaincode,主要包含对链操作部分的代码----智能合约。
handler.go:http web接口的实现,在接口中通过调用智能合约实现对区块链的操作。
go.mod:golang环境相关文件。
go.sum:golang环境相关文件。

代码eg:

main.go

package mainimport ("log""my-fabric-sdk/pkg/fabric"customhttp "my-fabric-sdk/pkg/http""net/http"
)func main() {fabricClient, err := fabric.NewFabricClient("wallet", "connection-profile.yaml","my_channel", "my_chaincode")if err != nil {log.Fatalf("Failed to create Fabric client: %v", err)}handler := customhttp.NewHandler(fabricClient)http.HandleFunc("/submit", handler.SubmitTransactionHandler)http.HandleFunc("/query", handler.QueryTransactionHandler)log.Println("Starting server on :8080")log.Fatal(http.ListenAndServe(":8080", nil))
}

client.go

package fabricimport ("fmt""github.com/hyperledger/fabric-sdk-go/pkg/core/config""github.com/hyperledger/fabric-sdk-go/pkg/gateway"
)type FabricClient struct {Network  *gateway.NetworkContract *gateway.Contract
}func NewFabricClient(walletPath, connectionProfile, channelName, chaincodeID string) (*FabricClient, error) {// 加载钱包wallet, err := gateway.NewFileSystemWallet(walletPath)if err != nil {return nil, fmt.Errorf("failed to create wallet: %v", err)}// 设置 Fabric Gateway 的连接gateway, err := gateway.Connect(gateway.WithConfig(config.FromFile(connectionProfile)),gateway.WithIdentity(wallet, "User1"),)if err != nil {return nil, fmt.Errorf("failed to connect to gateway: %v", err)}// 获取网络通道network, err := gateway.GetNetwork(channelName)if err != nil {return nil, fmt.Errorf("failed to get network: %v", err)}// 获取智能合约contract := network.GetContract(chaincodeID)return &FabricClient{Network:  network,Contract: contract,}, nil
}func (fc *FabricClient) SubmitTransaction(function string, args ...string) (string, error) {result, err := fc.Contract.SubmitTransaction(function, args...)if err != nil {return "", fmt.Errorf("failed to submit transaction: %v", err)}return string(result), nil
}func (fc *FabricClient) QueryTransaction(function string, args ...string) (string, error) {result, err := fc.Contract.EvaluateTransaction(function, args...)if err != nil {return "", fmt.Errorf("failed to evaluate transaction: %v", err)}return string(result), nil
}

handler.go

package httpimport ("encoding/json""my-fabric-sdk/pkg/fabric""net/http"
)type Handler struct {FabricClient *fabric.FabricClient
}func NewHandler(client *fabric.FabricClient) *Handler {return &Handler{FabricClient: client,}
}func (h *Handler) SubmitTransactionHandler(w http.ResponseWriter, r *http.Request) {type request struct {Function string   `json:"function"`Args     []string `json:"args"`}var req requestif err := json.NewDecoder(r.Body).Decode(&req); err != nil {http.Error(w, "Invalid request", http.StatusBadRequest)return}result, err := h.FabricClient.SubmitTransaction(req.Function, req.Args...)if err != nil {http.Error(w, "Transaction failed: "+err.Error(), http.StatusInternalServerError)return}w.WriteHeader(http.StatusOK)w.Write([]byte(result))
}func (h *Handler) QueryTransactionHandler(w http.ResponseWriter, r *http.Request) {type request struct {Function string   `json:"function"`Args     []string `json:"args"`}var req requestif err := json.NewDecoder(r.Body).Decode(&req); err != nil {http.Error(w, "Invalid request", http.StatusBadRequest)return}result, err := h.FabricClient.QueryTransaction(req.Function, req.Args...)if err != nil {http.Error(w, "Query failed: "+err.Error(), http.StatusInternalServerError)return}w.WriteHeader(http.StatusOK)w.Write([]byte(result))
}

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

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

相关文章

Git 修改分支名

在Git中修改分支名称&#xff0c;可以使用以下步骤&#xff1a; 切换到要重命名分支之外的其他分支&#xff1a; git checkout <其他分支名>重命名本地分支&#xff1a; git branch -m <旧分支名> <新分支名>如果需要删除远程的旧分支并创建新分支&#xff1…

浅谈华为 HarmonyOS Next

1. 万物互联时代的新机遇 随着万物互联时代的到来&#xff0c;智能应用从几十亿部手机扩展到数百亿个IoT设备&#xff0c;深刻改变了人们的生活方式。这为我们应用开发者带来了新的机遇和挑战。 机遇 : 目前正处于万物互联时代的前夕&#xff0c;正在经历手机单设备到全场景多…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下&#xff0c;提高生产效率、降低成本的同时&#xff0c;满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势&#xff0c;在汽车涂装领域的应用日益广泛。然而&#xff0c;随之而来的喷涂废溶剂处理问题也日益凸显。…

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域&#xff0c;但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…

计算机网络架构实例

小型企业网络 1. 终端设备&#xff1a; - 员工的台式电脑和笔记本电脑&#xff0c;用于日常办公&#xff0c;如文档处理、邮件收发、业务软件使用等。 - 智能手机和平板电脑&#xff0c;方便员工在外出或移动办公时也能接入公司网络&#xff0c;查看邮件和处理紧急事务。 2.…

三周精通FastAPI:1 第一步入门

FastAPI是一个非常棒的python web和api框架&#xff0c;准备用三周的时间“精通它” 学习流程参考FastAPI官网的用户教程&#xff1a;教程 - 用户指南 - FastAPI 学前提示 运行代码 所有代码片段都可以复制后直接使用&#xff08;它们实际上是经过测试的 Python 文件&#x…

UG NX12.0建模入门笔记:1.0 UG NX12.0安装教程

一、如何关闭防火墙&#xff1f; 提示&#xff1a;安装软件之前&#xff0c;建议先 关闭防火墙和杀毒软件&#xff01;&#xff01;&#xff01; 文章目录 一、如何关闭防火墙&#xff1f;二、UG NX12.0安装包三、UG NX12.0安装教程1.新建文件夹2.安装JAVA环境3.安装许可证管理…

LeetCode_2235. 两整数相加_java

1、问题 2235. 两整数相加https://leetcode.cn/problems/add-two-integers/ 给你两个整数 num1 和 num2&#xff0c;返回这两个整数的和。 示例 1&#xff1a; 输入&#xff1a;num1 12, num2 5 输出&#xff1a;17 解释&#xff1a;num1 是 12&#xff0c;num2 是 5 &am…

智慧监管:EasyCVR视频汇聚智能分析平台助力有限空间作业实现全天候可视化监控

随着工业化和城市化进程的加快&#xff0c;有限空间作业&#xff08;如地下管道、储罐、隧道等&#xff09;在各类企事业单位中日益频繁。然而&#xff0c;这类作业环境复杂、危险系数高&#xff0c;对作业人员的安全管理和实时监控提出了严峻挑战。为了保障有限空间作业的安全…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

Hadoop集群基础搭建

目录 一.虚拟机安装 1.配置虚拟机的ip 2.配置本机的ip 3.新建虚拟机 4.克隆三台虚拟机 二.虚拟机网络配置 1.修改ip配置 2.配置主机名和主机映射 3.配置SSH免密登陆 三.安装JDK 1.tar命令解压JDK安装包 2.配置JDK的环境变量 四.安装Hadoop 1.tar命令解压Hadoop安…

Maven项目打包为jar的几种方式

1.直接打包 通过不打依赖包的方式&#xff0c;仅仅只是打包出项目中的代码到JAR包中。在POM文件合适的位置添加如下plugin即可&#xff0c;随后执行maven install <plugin> <groupId>org.apache.maven.plugins</groupId> &l…

快速了解kubernetes中的存储管理

目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…

RestTemplate 学习笔记

简介 RestTemplate是一个执行HTTP请求的同步阻塞式工具类&#xff0c;它仅仅只是在 HTTP 客户端库&#xff08;例如 JDK HttpURLConnection&#xff0c;Apache HttpComponents&#xff0c;okHttp 等&#xff09;基础上&#xff0c;封装了更加简单易用的模板方法 API&#xff0c…

Renesas R7FA8D1BH (Cortex®-M85) 上光电编码器测速功能

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 硬件架构 2.1 硬件框架结构 2.2 测速功能原理介绍 2.2.1 理论描述 2.2.2 实现原理 2.2.3 系统硬件结构 3 软件实现 3.1 FSP配置项目 3.2 代码实现 3.2.1 初始化函数 3.2.2 功能函数 3.…

论文学习——基于Whisper迁移学习的阿尔兹海默症检测方法——音频特征和语义特征的结合

文章目录 引言正文——基于Whisper迁移学习的阿尔茨海默病检测方法&#xff08;使用转述文本作为提示&#xff0c;利用音频段落进行分类&#xff09;摘要1 Introduction介绍ADReSSo 数据集Whisper模型 2 Methods方法Audio Processing音频预处理Transfer Learning&#xff08;TL…

commonjs和esmodule的导入导出细节

CommonJS和ES Module是JavaScript中两种不同的模块系统&#xff0c;它们在导入导出细节上存在差异&#xff0c;以下是两者的具体对比以及方便区分记忆的方法&#xff1a; 1. 导入导出细节 CommonJS 导出&#xff1a;使用module.exports或exports对象来导出模块中的变量、函数…

利用移动式三维扫描技术创建考古文物的彩色纹理网格【上海沪敖3D】

文章来源于蔡司工业质量解决方案&#xff0c;作者蔡司工业质量 在考古环境中&#xff0c;三维扫描技术应用广泛&#xff0c;如存档、保存、复制和分享&#xff08;包括实体和虚拟形式&#xff09;。 文中&#xff0c;通过真实的扫描案例&#xff0c;您将了解到三维光学解决方案…

Lua简介

软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在编程语言的浩瀚星空中&#xff0c;Lua以其独特的魅力和广泛的应用场景&#xff0c;成为了众多开发者心中的一颗璀璨明星。作为一篇专注于技术深度与实践应…