Fabric-sdk-go client.Query возвращает ошибку: не удалось создать транзакцию: Channel_Cfg_Cache - кэш закрыт - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь сделать простую демонстрацию, используя fabric-sdk-go.Интересно, кто-нибудь знает, почему приведенный ниже код («client.Query») возвращает ошибку «не удалось создать транзакцию: Channel_Cfg_Cache - кэш закрыт»?


func initSdkClient() (*channel.Client){
    sdk, err := fabsdk.New(config.FromFile("config.yaml"))
    if err != nil {
        logger.Fatalf("Failed to create new SDK: %s", err)
    }
    defer sdk.Close()

    //prepare channel client context using client context
    clientChannelContext := sdk.ChannelContext(channelID, fabsdk.WithUser("User1"), fabsdk.WithOrg(orgName))
    // Channel client is used to query and execute transactions (Org1 is default org)
    client, err := channel.New(clientChannelContext)
    if err != nil {
        logger.Fatalf("Failed to create new channel client: %s", err)
    }
    return client
}

func queryCC(client *channel.Client, targetEndpoints ...string) []byte {
    response, err := client.Query(channel.Request{ChaincodeID: ccID, Fcn: "invoke", Args: defaultQueryArgs},
        channel.WithRetry(retry.DefaultChannelOpts),
        channel.WithTargetEndpoints(targetEndpoints...),
    )
    if err != nil {
        ***logger.Fatalf("Failed to query funds: %s", err)*** // error: failed to create transactor: Channel_Cfg_Cache - cache is closed
    }
    return response.Payload
}

func main() {
    client := initSdkClient()

    existingValue := queryCC(client)
    logger.Info(existingValue)


    logger.Info("hello, world\n")
}

1 Ответ

0 голосов
/ 18 февраля 2019

Возможно, потому что вы закрываете экземпляр SDK в конце функции initSdkClient.Скорее закройте SDK в конце функции main.

Сделайте что-то вроде

type Setup struct {
    sdk    *fabsdk.FabricSDK
    client *channel.Client
}

func (setup *Setup) initSdkClient() *channel.Client {
    sdk, err := fabsdk.New(config.FromFile("config.yaml"))
    if err != nil {
        fmt.Errorf("Failed to create new SDK: %s", err)
    }
    setup.sdk = sdk
    //prepare channel client context using client context
    clientChannelContext := setup.sdk.ChannelContext(channelID, fabsdk.WithUser("User1"), fabsdk.WithOrg(orgName))
    // Channel client is used to query and execute transactions (Org1 is default org)
    client, err := channel.New(clientChannelContext)
    if err != nil {
        fmt.Errorf("Failed to create new channel client: %s", err)
    }
    setup.client = client
    return client
}

func (setup *Setup) queryCC(client *channel.Client, targetEndpoints ...string) []byte {
    response, err := setup.client.Query(channel.Request{ChaincodeID: ccID, Fcn: "invoke", Args: defaultQueryArgs},
        channel.WithRetry(retry.DefaultChannelOpts),
        channel.WithTargetEndpoints(targetEndpoints...),
    )
    if err != nil {
        fmt.Errorf("Failed to query funds: %s", err)
    }
    return response.Payload
}

func main() {
    var setup Setup
    client := setup.initSdkClient()
    defer setup.sdk.Close()

    existingValue := setup.queryCC(client)

}
...