【问题标题】:How to expose Chaincode API as REST with Hyperledger go SDK如何使用 Hyperledger go SDK 将 Chaincode API 公开为 REST
【发布时间】:2019-06-19 13:56:06
【问题描述】:

我们已经在 Amazon Managed Blockchain 网络上配置了超级账本 Fabric 1.2。我们已按照 8 步指南 managed-blockchain-get-started-tutorial 配置此设置。 我们已经配置了网络、成员和对等点,并且还设置了 VPC 服务端点。 Fabric Client VM 也在 AWS Linux 2 AMI 上配置,我们还能够安装/启动和调用示例链代码(如 Set 7: Install and Run chaincode 中所述)。 现在我们的障碍是如何将 API 公开为 REST,以便可以从 Fabric 客户端 VM 外部访问 API。我们一直在苦苦挣扎。

根据 AWS 教程(步骤 7.4:调用链码)我们正在使用以下命令调用链码。

docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem"  -e "CORE_PEER_ADDRESS=$PEER"  -e "CORE_PEER_LOCALMSPID=$MSP"  -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH"  cli peer chaincode invoke -C mychannel  -n mycc -c  '{"Args":["invoke","a","b","10"]}'  -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls

我尝试在 ($PEER) 上从邮递员发送发帖请求

https://nd-NDNDNDNDND.m-MMMMMMMMMM-n-NNNNNNNNNN.managedblockchain.us-east-1.amazonaws.com:30003/mycc

有效载荷:{"Args":["invoke","a","b","10"]} 但出现错误: 无法得到任何回应 连接到

时出错

nd-NDNDNDNDND.m-MMMMMMMMMM-n-NNNNNNNNNN.managedblockchain.us-east-1.amazonaws.com:30003/mycc

我们如何使用这些参数作为 REST 调用从该 VM 外部调用此 API?

默认安装了 Hyperledger 1.2 go SDK,您能告诉我们如何使用 go SDK 将 Chaincode API 公开为 REST 吗? 我们知道前端和 Hyperledger Fabric 层之间的通信,其中一种方式是 gRPC 调用,但不知道如何为 Go 配置和使用 grpc。

【问题讨论】:

    标签: amazon-web-services hyperledger-fabric hyperledger hyperledger-chaincode


    【解决方案1】:

    从您的解释看来,您已经正确设置了超级账本结构网络。因为您可以通过 CLI 安装、实例化和调用链代码。

    所以,让我们来回答您的问题,Hyperledger Fabric 为我们提供了两种类型的操作机制,即通过 CLI 和通过 RPC(使用 grpc)。您可以使用为 Hyperledger 网络提供实现 RPC 方法的库的 Hyperledger Fabric SDK(Node SDK、Java SDK、GO SDK 等)。

    因此,您可以使用任何受支持的语言构建 Web 应用程序(Rest/Soap)。以下是 SDK 的链接:-

    Hyperledger Fabric Node SDK

    Hyperledger Fabric Java SDK

    Hyperledger Fabric Go SDK

    以下是 Hyperledger Fabric 网络应用的示例:-

    Hyperledger Fabric samples

    我会推荐你​​通过余额转移示例。

    【讨论】:

    • 感谢 Ankit 发送链接,你有什么特别的例子(使用 grpc 和 GO)吗?
    【解决方案2】:

    您可以使用 Gorilla mux 使用fabric go sdk 将chaincode api 公开为rest。

    【讨论】:

      【解决方案3】:

      可以通过 CLI 或使用 SDK 来通过链代码调用函数。

      我关注了chainhero tutorial 在 Golang 中编写 SDK。

      本教程未公开 REST API。为了生成 REST API,我在我的一个项目中使用了 gorilla/mux。 Gorilla/mux 用在下面代码的底部:

      package main
      
      import (
          "encoding/json"
          "fmt"
          "github.com/chainHero/heroes-service/blockchain"
          "net/http"
          "github.com/gorilla/mux"
          "os"
          "log"
      )
      
      func main() {
          // Definition of the Fabric SDK properties
          fSetup := blockchain.FabricSetup{
              // Network parameters
              OrdererID: "orderer.hf.chainhero.io",
      
              // Channel parameters
              ChannelID:     "chainhero",
              ChannelConfig: os.Getenv("GOPATH") + "/src/github.com/chainHero/heroes-service/fixtures/artifacts/chainhero.channel.tx",
      
              // Chaincode parameters
              ChainCodeID:     "heroes-service",
              ChaincodeGoPath: os.Getenv("GOPATH"),
              ChaincodePath:   "github.com/chainHero/heroes-service/chaincode/",
              OrgAdmin:        "Admin",
              OrgName:         "org1",
              ConfigFile:      "config.yaml",
      
              // User parameters
              UserName: "User1",
          }
      
          // Initialization of the Fabric SDK from the previously set properties
          err := fSetup.Initialize()
          if err != nil {
              fmt.Printf("Unable to initialize the Fabric SDK: %v\n", err)
              return
          }
          // Close SDK
          defer fSetup.CloseSDK()
      
          // Install and instantiate the chaincode
          err = fSetup.InstallAndInstantiateCC()
          if err != nil {
              fmt.Printf("Unable to install and instantiate the chaincode: %v\n", err)
              return
          }
      
          router := mux.NewRouter()
      
          //GetPerson and CreatePerson are the functions implemented in the chaincode.
      
          router.HandleFunc("/api/{fcn}",fSetup.GetPerson).Methods("GET")
          router.HandleFunc("/api/{fcn}", fSetup.CreatePerson).Methods("POST")
      
          log.Fatal(http.ListenAndServe(":8000", router))
      
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 2012-08-19
        相关资源
        最近更新 更多