hallen41 2021-05-26 14:47 采纳率: 33.3%
浏览 18

fabric-sdk-go 查询没问题,但是转账交易就报错

查询就没问题,转账交易提示WARN Event client has disconnected. Details: rpc error: code = Unimplemented desc = unknown service protos.Deliver

 

有大佬知道什么问题吗,不甚感激

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-06-08 14:19
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这个问题出现的原因是在进行转账交易时,客户端连接已经断开了。可能原因包括客户端网络异常或者转账交易处理时间过长导致客户端超时。同时,提示中还提到了“unknown service protos.Deliver”,这意味着可能是在使用 fabric-sdk-go 对 Hyperledger Fabric 进行操作时,没有正确配置或者加载所需的服务。 解决这个问题的具体方法需要根据具体情况进行调查,可能需要查看客户端日志以及 Hyperledger Fabric 的相关日志,然后进行排查。 示例代码: 以下是使用 fabric-sdk-go 进行转账交易的示例代码,其中包括连接到 Hyperledger Fabric,设置通道和链码,以及进行转账交易的步骤。如果在使用类似的代码时遇到了类似的问题,可能需要检查代码中的参数设置和通信方式是否正确。
    func transferMoney(channelID string, ccID string, args [][]byte) error {
        // 设置 fabric-sdk-go 的配置文件
        configBackend, err := config.FromFile("config.yaml")
        if err != nil {
            return fmt.Errorf("Unable to load SDK config: %v", err)
        }
        sdkOptions := fabsdk.WithConfig(configBackend)
        sdk, err := fabsdk.New(sdkOptions)
        if err != nil {
            return fmt.Errorf("Failed to create new SDK: %v", err)
        }
        defer sdk.Close()
        // 连接到指定的 Hyperledger Fabric 网络
        clientContext := sdk.Context()
        channelProvider := clientContext.ChannelProvider(
            client.ChannelCfg{
                NetworkConfig: client.NetworkConfig{
                    Timeout: client.WithTimeout(5 * time.Second),
                },
                ChannelID: channelID,
            },
        )
        channelContext := channelProvider.ChannelContext(channelID, fabsdk.WithTimeout(10*time.Second))
        // 设置链码
        ccProvider := channelContext.ChannelProvider()
        cc, err := ccProvider.GetChaincode(ccID)
        if err != nil {
            return fmt.Errorf("Failed to get chaincode: %v", err)
        }
        // 创建一个新的交易提案
        txnProposal, err := cc.CreateTransactionProposal(
            "transferMoney",
            args,
            client.WithRetry(retry.DefaultResMgmtOpts),
        )
        if err != nil {
            return fmt.Errorf("Failed to create transaction proposal: %v", err)
        }
        // 发送交易提案并等待响应
        response, err := channelContext.Channel().SendTransactionProposal(txnProposal)
        if err != nil {
            return fmt.Errorf("Failed to send transaction proposal: %v", err)
        }
        // 检查响应是否有效
        if len(response.Responses) == 0 {
            return fmt.Errorf("No responses received for transaction proposal")
        }
        if response.Responses[0].Response.Status != 200 {
            return fmt.Errorf("Received invalid response for transaction proposal: %v", response.Responses[0].Response.Message)
        }
        // 提交交易并等待确认
        tx, err := channelContext.Channel().CreateTransaction(response.Transaction)
        if err != nil {
            return fmt.Errorf("Failed to create transaction: %v", err)
        }
        if err := channelContext.Channel().SubmitTransaction(tx); err != nil {
            return fmt.Errorf("Failed to submit transaction: %v", err)
        }
        // 等待交易确认
        event, err := channelContext.Channel().WatchTxEvents(tx)
        if err != nil {
            return fmt.Errorf("Failed to watch transaction events: %v", err)
        }
        select {
        case _, ok := <-event:
            if !ok {
                return fmt.Errorf("Transaction event channel closed prematurely")
            }
        case <-time.After(30 * time.Second):
            return fmt.Errorf("Timed out waiting for transaction confirmation")
        }
        return nil
    }
    
    评论

报告相同问题?