如何在CLI容器外查询Hyperledger Fabric区块链数据?

时间:2017-09-06 10:19:48

标签: hyperledger-fabric

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

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

如何以最简单的方式查询区块链中的数据? 我正在看NodeSDK和RestApi,但我没有看到很多指南来帮助我,因此这个问题。 对不起新手问题。

谢谢!

1 个答案:

答案 0 :(得分:4)

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

  1. Java SDK
  2. GoLang SDK
  3. NodeJS SDK
  4. Python SDK
  5. <小时/> 的更新

    根据@ christo4ferris的建议,还有一个项目:

    1. REST SDK
    2. (可能是您感兴趣的那个)

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

      1. 读取配置文件

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

      2. 初始化结构客户端

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

      3. 加载客户端证书和密钥

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

      4. 读取并设置MSP ID

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

      5. 将客户端用户设置到上下文

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

      6. 设置订购节点

        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 }

      7. 设置并初始化频道和支持同伴

        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) }

        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)

      8. 准备交易提案请求发送并提交订购

        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 }

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

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

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

        fmt.Println(txResponse[0])

      9. 完全相同的方式,这将适用于所有SDK。