【问题标题】:How to query Hyperledger Fabric blockchain data outside CLI container?如何在 CLI 容器外查询 Hyperledger Fabric 区块链数据?
【发布时间】:2017-09-15 00:29:19
【问题描述】:

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

我知道我只能使用来自 CLI 容器的 API 调用或使用 JavaSDK/NodeSDK、RESTapi。

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

谢谢!

【问题讨论】:

    标签: hyperledger-fabric


    【解决方案1】:

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

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


    更新

    正如@christo4ferris 所建议的,还有一个额外的项目:

    1. REST SDK

    (可能是你感兴趣的那个)


    例如,您可以使用 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])

    这在所有 SDK 中都适用。

    【讨论】:

    • 谢谢!我一直在阅读并决定从 fabcar node sdk 查询教程开始:)
    • 有道理,让我们知道它是怎么回事:)
    • 我要补充说明,这里的 REST SDK 工作已经开始 github.com/hyperledger/fabric-sdk-rest
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多