区块链 Go 超级账本Gateway SDK - Hyperledger Fabric Gateway SDK

郑琦
2023-12-01

Hyperledger Fabric Gateway SDK for Golang

超级账本的Go版本SDK

介绍:

网关SDK是根据超级账本的基础SDK开发出来的一个高级SDK,为我们开发部署省去很多的麻烦。
网关SDK是应用程序与区块链网络交互的一个工具,提供了一些简单的API向账本提交交易或者查询。

使用方法

这里我们使用超级账本中的fabric-sample作为操作环境。
进入到fabric-sample中的asset-transfer-basic目录下,这里有为我们提供的模板(不仅仅只是Golang的),我们照着模板修改写出我们自己的程序即可。

创建一个mian.go使用GO MOD初始化一下

go mod init
在main.go文件中导入以下包

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"

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

创建一个钱包

wallet, err := gateway.NewFileSystemWallet("wallet")
	if err != nil {
		log.Fatalf("Failed to create wallet: %v", err)
	}

向钱包中添加用户的证书,生成目录等

if !wallet.Exists("appUser") {
		err = populateWallet(wallet)  // 方法写在最下面
		if err != nil {
			log.Fatalf("Failed to populate wallet contents: %v", err)
		}
	}

获取链接配置文件

ccpPath := filepath.Join(
		"..",
		"..",
		"test-network",
		"organizations",
		"peerOrganizations",
		"org1.example.com",
		"connection-org1.yaml",
	)

从钱包中获取身份,创立链接

	gw, err := gateway.Connect(
		gateway.WithConfig(config.FromFile(filepath.Clean(ccpPath))),
		gateway.WithIdentity(wallet, "appUser"),
	)
	if err != nil {
		log.Fatalf("Failed to connect to gateway: %v", err)
	}
	defer gw.Close()

连接到通道

network, err := gw.GetNetwork("mychannel")
	if err != nil {
		log.Fatalf("Failed to get network: %v", err)
	}

获取链上代码(智能合约)名称

contract := network.GetContract("basic")

进行交易

result, err := contract.SubmitTransaction("InitLedger")
	if err != nil {
		log.Fatalf("Failed to Submit transaction: %v", err)
	}

提交查询

result, err = contract.EvaluateTransaction("ReadAsset", "asset13")
// 返回结果[]byte,进行类型强制转换
log.Println(string(result))

构造钱包内部的方法populateWallet

func populateWallet(wallet *gateway.Wallet) error {
	log.Println("============ Populating wallet ============")
	credPath := filepath.Join(
		"..",
		"..",
		"test-network",
		"organizations",
		"peerOrganizations",
		"org1.example.com",
		"users",
		"User1@org1.example.com",
		"msp",
	)

	certPath := filepath.Join(credPath, "signcerts", "cert.pem")
	// 证书文件
	cert, err := ioutil.ReadFile(filepath.Clean(certPath))
	if err != nil {
		return err
	}

	keyDir := filepath.Join(credPath, "keystore")
	// 私钥文件
	files, err := ioutil.ReadDir(keyDir)
	if err != nil {
		return err
	}
	if len(files) != 1 {
		return fmt.Errorf("keystore folder should have contain one file")
	}
	keyPath := filepath.Join(keyDir, files[0].Name())
	key, err := ioutil.ReadFile(filepath.Clean(keyPath))
	if err != nil {
		return err
	}

	identity := gateway.NewX509Identity("Org1MSP", string(cert), string(key))

	return wallet.Put("appUser", identity)
}

可以根据自己的需求修改这份模板

 类似资料: