当前位置: 首页 > article >正文

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 main

import (
	"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 fabric

import (
	"fmt"
	"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
	"github.com/hyperledger/fabric-sdk-go/pkg/gateway"
)

type FabricClient struct {
	Network  *gateway.Network
	Contract *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 http

import (
	"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 request
	if 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 request
	if 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.kler.cn/news/360384.html

相关文章:

  • Django模型优化
  • uniapp兼容不同小程序环境写法
  • C语言笔记20
  • Docker启动报错【flags: 0x5000: not a directory: unknown】
  • FPGA图像处理之三行缓存
  • 数据结构部分混淆
  • solid wrok笔记记录
  • Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色
  • Modbus TCP报错:Response length is only 0 bytes
  • github多个账号配置多个SSH秘钥
  • 在分类内用最大最小值筛选(每个分类找出一个)
  • 2011年国赛高教杯数学建模D题天然肠衣搭配问题解题全过程文档及程序
  • Python GUI 编程:tkinter 初学者入门指南——复选框
  • 归一化——5种方法详细分类说明
  • 重庆大学软件工程考研,难度如何?
  • Linux -- 进程间通信、初识匿名管道
  • Java项目-基于springcloud框架的分布式架构网上商城系统项目实战(附源码+文档)
  • OceanBase 的写盘与传统数据库有什么不同?
  • 一个检测work是否被包含在训练数据集中的工具
  • Spring-aop介绍