2

我们已经在 Amazon Managed Blockchain 网络上配置了超级账本 Fabric 1.2。我们已按照 8 步指南managed-blockchain-get-started-tutorial来配置此设置。我们已经配置了网络、成员和对等点,并且还设置了 VPC 服务端点。Fabric Client VM 也在 AWS Linux 2 AMI 上配置,我们还能够安装/启动和调用示例链代码(如第7 集:安装和运行链代码中所述)。现在我们的障碍是如何将 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

我们如何使用这些参数调用此 API 作为来自此 VM 外部的 REST 调用。?

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

4

3 回答 3

4

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

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

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

Hyperledger Fabric 节点 SDK

Hyperledger Fabric Java SDK

Hyperledger Fabric Go SDK

以下是 Hyperledger Fabric Web 应用程序的示例:-

Hyperledger Fabric 样本

我会建议您通过余额转移示例。

于 2019-01-29T07:32:55.213 回答
4

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

我按照这个chainhero教程在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))

}

于 2019-02-18T11:19:47.617 回答
1

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

于 2019-02-18T10:47:00.413 回答