浅试Hyperledger Fabric go 小项目之应用应用代码

这篇具有很好参考价值的文章主要介绍了浅试Hyperledger Fabric go 小项目之应用应用代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

上一篇记录了如何利用Hyperledger Fabric官方test-network运行自己的Chaincode流程,
链接这里
本文记录一个,参考官方 go fabcar示例编写自己的应用代码,并与cc交互。

一、fabcar示例

官方地址
go 语言 fabcar 项目目录结构
浅试Hyperledger Fabric go 小项目之应用应用代码
fabcar.go 主要的应用代码,runfabcar.sh 一个shell脚本,主要设置环境变量以及启动应用代码。

fabcar.go

主要包含三个功能:

注册和登记应用程序用户

//这个程序使用一个 证书签名请求 (CSR)——现在本地生成公钥和私钥,然后把公钥发送到 CA ,CA 会发布会一个让应用程序使用的证书。这三个证书会保存在钱包中,以便于我们以管理员的身份使用 CA 。
os.Setenv("DISCOVERY_AS_LOCALHOST", "true")
	wallet, err := gateway.NewFileSystemWallet("wallet")
	if err != nil {
		fmt.Printf("Failed to create wallet: %s\n", err)
		os.Exit(1)
	}
// 创建一个新的应用程序用户,它将被用于与区块链交互。
// populateWallet 拿到用户的证书凭据
	if !wallet.Exists("appUser") {
		err = populateWallet(wallet)
		if err != nil {
			fmt.Printf("Failed to populate wallet contents: %s\n", err)
			os.Exit(1)
		}
	}
//代码中存在路径定义 要换成自己的路径
ccpPath := filepath.Join(
		"..",
		"..",
		"test-network",
		"organizations",
		"peerOrganizations",
		"org1.example.com",
		"connection-org1.yaml",
	)

连接通道和cc

gw, err := gateway.Connect(
//身份认证		gateway.WithConfig(config.FromFile(filepath.Clean(ccpPath))),
		gateway.WithIdentity(wallet, "appUser"),
	)
	if err != nil {
		fmt.Printf("Failed to connect to gateway: %s\n", err)
		os.Exit(1)
	}
	defer gw.Close()
// 连接通道
// 改成自己的名称
	network, err := gw.GetNetwork("mychannel")
	if err != nil {
		fmt.Printf("Failed to get network: %s\n", err)
		os.Exit(1)
	}
//连接智能合约
// 改成自己的名称
	contract := network.GetContract("fabcar")

测试与cc交互功能,也就是访问cc的函数

//测试创建
result, err = contract.SubmitTransaction("createCar", "CAR10", "VW", "Polo", "Grey", "Mary")
//查询
result, err = contract.EvaluateTransaction("queryCar", "CAR10")
//修改
_, err = contract.SubmitTransaction("changeCarOwner", "CAR10", "Archie")	

runfabcar.sh

ENV_DAL=`echo $DISCOVERY_AS_LOCALHOST`

echo "ENV_DAL:"$DISCOVERY_AS_LOCALHOST

if [ "$ENV_DAL" != "true" ]
then
	export DISCOVERY_AS_LOCALHOST=true
fi

echo "DISCOVERY_AS_LOCALHOST="$DISCOVERY_AS_LOCALHOST

echo "run fabcar..."
# 修改此处改为自己的启动代码名称即可
go run fabcar.go

二、我的示例

应用程序 项目 目录结构
浅试Hyperledger Fabric go 小项目之应用应用代码

1.连接

封装了一中功能,函数直接调用,标注修改处,需要改成自己的
代码如下:

func Getcontract1() *gateway.Contract {
	err := os.Setenv("DISCOVERY_AS_LOCALHOST", "flase")
	if err != nil {
		log.Fatalf("Error setting DISCOVERY_AS_LOCALHOST environemnt variable: %v", err)
	}
	wallet, err := gateway.NewFileSystemWallet("wallet")
	if err != nil {
		log.Fatalf("Failed to create wallet: %v", err)
	}
	if !wallet.Exists("appUser") {
		err = populateWallet1(wallet)
		if err != nil {
			log.Fatalf("Failed to populate wallet contents: %v", err)
		}
	}
//修改
	ccpPath := filepath.Join(
		"..",
		"github.com",
		"fabric-samples",
		"test-network",
		"organizations",
		"peerOrganizations",
		"org1.example.com",
		"connection-org1.yaml",
	)

	gw, err := gateway.Connect(
		// lyj:使用ccpath 的路径 以及 appuser 的身份认证 通过使用Gateway类连接网络
		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, err1 := gw.GetNetwork("channeltest")
	if err != nil {
		log.Fatalf("Failed to get network: %v", err1)
	}
//修改
	contract := network.GetContract("savelist")

	return contract
}
func populateWallet1(wallet *gateway.Wallet) error {
//修改
	credPath := filepath.Join(
		"..",
		// "src",
		"github.com",
		"fabric-samples",
		"test-network",
		"organizations",
		"peerOrganizations",
		"org1.example.com",
		"users",
		"User1@org1.example.com",
		"msp",
	)

	certPath := filepath.Join(credPath, "signcerts", "User1@org1.example.com-cert.pem")
	// read the certificate pem
	cert, err := ioutil.ReadFile(filepath.Clean(certPath))
	if err != nil {
		return err
	}

	keyDir := filepath.Join(credPath, "keystore")
	// there's a single file in this dir containing the private key
	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)
}

main 中调用

func main() {
	var contract *gateway.Contract
	contract = manufacture.Getcontract1()
	}

2.与CC交互

交互函数 一 中示例,注意传参,参数1 CC中函数名,其他参数对应 CC 中函数的参数,只是string类型。
代码如下:

func (c *Contract) SubmitTransaction(name string, args ...string) ([]byte, error) {
	txn, err := c.CreateTransaction(name)

	if err != nil {
		return nil, err
	}

	return txn.Submit(args...)
}

func (c *Contract) EvaluateTransaction(name string, args ...string) ([]byte, error) {
	txn, err := c.CreateTransaction(name)

	if err != nil {
		return nil, err
	}

	return txn.Evaluate(args...)
}

但是 数据结构,有数组类型

type SvcInfo struct {
	SvcID            string   `json:"SvcID"`
	ManufacturerName string   `json:"ManufacturerName"`
	SvcName          string   `json:"SvcName"`
	SaveSvc          []string `json:"SaveSvc"`
}

传参
浅试Hyperledger Fabric go 小项目之应用应用代码
cc 端接收
浅试Hyperledger Fabric go 小项目之应用应用代码
还可以,整个结构体对象整体json序列化,传递。cc端设置对应参数接收后 反序列化。两端参数要对应起来。

三 运行

将 runfabcar.sh 中 go run fabcar.go 换为自己的代码名称即可。

sh runfabcar.sh

运行后如下所示:
浅试Hyperledger Fabric go 小项目之应用应用代码

总结

第一次写go和使用Hyperledger Fabric交互的代码,供新手参考理解,自己摸索多有不足,请各位大佬包含指正。文章来源地址https://www.toymoban.com/news/detail-425949.html

到了这里,关于浅试Hyperledger Fabric go 小项目之应用应用代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 联盟链 Hyperledger Fabric 应用场景

    本文主要通过一个例子分享以 Hyperledger Fabric 为代表的联盟链应用场景。 关于 Fabric 的相关概念请先参考文章 《Hyperledger Fabric 核心概念》   我们看一个购物场景: 首先消费者在某个购物平台上购物例如淘宝。 然后使用第三方支付渠道进行支付例如支付宝。 最后在银行完成

    2024年01月25日
    浏览(37)
  • Hyperledger Fabric 应用实战(1)--前期准备

    1.1应用说明 本应用示例基于Hyperledger fabric2.4搭建一个自由房屋租赁区块链系统freerent, 用户可以自由在链上开展合同签订、执行和验真。freerent应用背景相对简单,当前应用搭建示例展示 fabric初级功能。后期将会不断探索 fabric应功能特性,也希望可以结合IPFS实现合同存储,

    2024年01月25日
    浏览(40)
  • Hyperledger Fabric 应用实战(2)--网络节点设置

    网络名称:rentnet 联盟组织:orderer排序组织+三个成员组织supervisor、rentalcrop、 agency 通道:rentsign 账本数据库: couchdb 物理节点 组织 容器节点 supervisor supervisor.freerent.cn peer0.supervisor.freerent.cn peer1.supervisor.freerent.cn peer2.supervisor.freerent.cn couchdb0.supervisor.freerent.cn couchdb1.supervisor

    2024年02月12日
    浏览(40)
  • Hyperledger Fabric 超级账本实战项目(十五-二十)

    弹珠资产管理系统 P15弹珠资产管理项目本地安装 然后进入fabric-sample的fabcar文件夹 $ cd fabric-sample/abcar $ npm install //安装相关依赖包 接上面: 然后进入到刚才安装的弹珠下面的目录下 安装apm $ npm install $cd ./scripts $node install_chaincode,js $node instantiate_chaincode.js 访问3001端口号的网址

    2024年02月06日
    浏览(46)
  • Hyperledger Fabric项目搭建区块链浏览器Hyperledger-blockchain-explorer

    区块链浏览器官网:https://github.com/hyperledger/blockchain-explorer 如果虚拟机没有联网,导致下载不下来,也可以前往Fabric-explorer附件下载进行下载,之后在本地根据需要修改,修改后上传到虚拟机 此时目录结构如下图所示 3.1修改test-network.json—— 网络配置文件,包含身份的指定

    2024年02月08日
    浏览(50)
  • Linux搭建Hyperledger Fabric区块链框架 - Hyperledger Fabric模型概念

    2015年,Linux基金会启动了Hyperledger项目,目标是发展跨行业的区块链技术。 Hyperledger Fabric是Hyperledger中的一个区块链项目,包含一个账本,使用智能合约并且是一个通过所有参与者管理交易的系统。 Hyperledger Fabric 是分布式账本解决方案的平台,以模块化架构为基础,支持不同

    2023年04月08日
    浏览(50)
  • 【Fabric学习】什么是HyperLedger Fabric?

    本文总结自 Fabric官方文档 ,描述了Fabric产生的背景、特性、主要组件。 区块链 是不可更改的交易账本,由同等节点(peer nodes)组成的分布式网络来维护。 比特币:第一个使用区块链的应用; 以太坊:引入 智能合约 来开发分布式应用。 二者都是 公有链 ( public / permissi

    2024年01月19日
    浏览(52)
  • Hyperledger Fabric 环境搭建

    以 fabric:2.2.0 ; ca:1.4.7 为例 官网下载go Downloads - The Go Programming Language (google.cn) 没有问题就完成啦 官方安装脚本(修改过了): 两个简单脚本直接开启/关闭测试区块链: 开启: 关闭:

    2024年02月11日
    浏览(43)
  • Hyperledger Fabric架构设计

    目录 1、逻辑架构 答疑:什么叫做背书策略? 2、运行时架构         答疑:什么是锚节点? Hyperledger Fabric从1.X开始,在扩展性及安全性方面有了很大的提升,且新增了诸多特性。 多通道:支持多通道,提高隔离安全性。 可插拔的组件:支持共识组件、权限管理组件等可

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包