本文介绍了如何在CLI容器之外查询Hyperledger Fabric区块链数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Fabric-sample中的./byfn.sh脚本来启动我的区块链.我想从区块链的PHP网站调用和查询数据.

I am using the ./byfn.sh script from the fabric-sample to start my blockchain.I would like to invoke and query data from a PHP website from the blockchain.

我确实知道我只能使用CLI容器中的API调用或使用JavaSDK/NodeSDK,RESTapi.

I do know that I can only use the API call from CLI container or use a JavaSDK/NodeSDK, RESTapi.

如何以最简单的方式从区块链查询数据?我正在查看NodeSDK和RestApi,但没有太多指南可以帮助我,因此是这个问题.很抱歉出现新手问题.

How can I query data from the blockchain the easiest way?I am looking at NodeSDK and RestApi but I don't see much guides out there to help me, hence this question.Sorry for the newbie questions.

谢谢!

推荐答案

调用Hyperledger Fabric对等方并与之交互的正确方法是通过SDK,这是可用的SDK的列表:

The proper way to call and interact with Hyperledger Fabric peers is via SDK, here is the list of available SDK's:

  1. Java SDK
  2. GoLang SDK
  3. NodeJS SDK
  4. Python SDK


更新

如@ christo4ferris所建议,还有一个附加项目:

As suggested by @christo4ferris there is an additional project:

  1. REST SDK

(您可能对此感兴趣的人)

(Which might be the one you are interested in)

例如,您可以使用golang SDK并执行以下操作:

For example you can use golang SDK and do following:

  1. 读取配置文件

  1. Read configuration file

var err errorconf, err := config.InitConfig("config.yaml")if err != nil { fmt.Println(err) return}

var err errorconf, err := config.InitConfig("config.yaml")if err != nil { fmt.Println(err) return}

初始化结构客户端

cl := fabricclient.NewClient(conf)bccspFactory.InitFactories(conf.CSPConfig())cl.SetCryptoSuite(bccspFactory.GetDefault())

cl := fabricclient.NewClient(conf)bccspFactory.InitFactories(conf.CSPConfig())cl.SetCryptoSuite(bccspFactory.GetDefault())

加载客户端证书和密钥

privKey := filepath.Join(conf.CryptoConfigPath(), "path to key")pubKey := filepath.Join(conf.CryptoConfigPath(), "path to cert")

privKey := filepath.Join(conf.CryptoConfigPath(), "path to key")pubKey := filepath.Join(conf.CryptoConfigPath(), "path to cert")

读取并设置MSP ID

Read and setup MSP ID

mspID, err := conf.MspID("org1")if err != nil { fmt.Println(err) return}

mspID, err := conf.MspID("org1")if err != nil { fmt.Println(err) return}

将客户端用户设置为上下文

Setup client user into the context

user, err := fabapi.NewPreEnrolledUser(conf, privKey, pubKey, "user1", mspID, cl.GetCryptoSuite())if err != nil { fmt.Println(err) return}cl.SetUserContext(user)

user, err := fabapi.NewPreEnrolledUser(conf, privKey, pubKey, "user1", mspID, cl.GetCryptoSuite())if err != nil { fmt.Println(err) return}cl.SetUserContext(user)

设置订购节点

ordererConf, err := conf.OrdererConfig("orderer0")if err != nil { fmt.Println(err) return}

ordererConf, err := conf.OrdererConfig("orderer0")if err != nil { fmt.Println(err) return}

o, err := orderer.NewOrderer(fmt.Sprintf("%s:%d", ordererConf.Host, ordererConf.Port), filepath.Join(conf.CryptoConfigPath(), "path to orderer cert"), "orderer.example.com", conf)if err != nil { fmt.Println(err) return}

o, err := orderer.NewOrderer(fmt.Sprintf("%s:%d", ordererConf.Host, ordererConf.Port), filepath.Join(conf.CryptoConfigPath(), "path to orderer cert"), "orderer.example.com", conf)if err != nil { fmt.Println(err) return}

设置和初始化频道以及认可的对等方

Setup and initialize channel and the endorsing peer

peers, err := conf.PeersConfig("org1")if err != nil { fmt.Println(err) return}

peers, err := conf.PeersConfig("org1")if err != nil { fmt.Println(err) return}

p, err := peer.NewPeer(fmt.Sprintf("%s:%d", peers[0].Host, peers[0].Port), conf)if err != nil { fmt.Println(err)}

p, err := peer.NewPeer(fmt.Sprintf("%s:%d", peers[0].Host, peers[0].Port), conf)if err != nil { fmt.Println(err)}

ch, err := cl.NewChannel("mychannel")if err != nil { fmt.Println(err) return}

ch, err := cl.NewChannel("mychannel")if err != nil { fmt.Println(err) return}

ch.AddOrderer(o)ch.AddPeer(p)ch.SetPrimaryPeer(p)cl.SaveUserToStateStore(user, true)

ch.AddOrderer(o)ch.AddPeer(p)ch.SetPrimaryPeer(p)cl.SaveUserToStateStore(user, true)

准备交易建议请求并发送并提交订购

Prepare transaction proposal request send it and submit for ordering

txRequest := apitxn.ChaincodeInvokeRequest{ Targets: []apitxn.ProposalProcessor{p}, Fcn: "myFCN", Args: []string{"myargs"}, TransientMap: map[string][]byte{}, ChaincodeID: "helloworld",}

txRequest := apitxn.ChaincodeInvokeRequest{ Targets: []apitxn.ProposalProcessor{p}, Fcn: "myFCN", Args: []string{"myargs"}, TransientMap: map[string][]byte{}, ChaincodeID: "helloworld",}

proposalResponse, _, err := ch.SendTransactionProposal(txRequest)if err != nil { fmt.Println(err) return}

proposalResponse, _, err := ch.SendTransactionProposal(txRequest)if err != nil { fmt.Println(err) return}

fmt.Printf("%v\n", proposalResponse[0].ProposalResponse)

tx, err := ch.CreateTransaction(proposalResponse)if err != nil { fmt.Println(err) return}

tx, err := ch.CreateTransaction(proposalResponse)if err != nil { fmt.Println(err) return}

txResponse, err := ch.SendTransaction(tx)if err != nil { fmt.Println(err) return}

txResponse, err := ch.SendTransaction(tx)if err != nil { fmt.Println(err) return}

fmt.Println(txResponse[0])

在所有SDK上都可以使用相同的方法.

Pretty same way this will work across all SDK's.

这篇关于如何在CLI容器之外查询Hyperledger Fabric区块链数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-15 00:02