深入解析fabric的peer命令(二)分析chaincode包

2023-06-01 10:40:46 浏览数 (2)

分析github.com/hyperledger/fabric/internal/peer/chaincode包

一,探索思路

这个目录的tree是这样的

代码语言:javascript复制
.
├── chaincode.go
├── common.go
├── common_test.go
├── flags_test.go
├── install.go
├── install_test.go
├── instantiate.go
├── instantiate_test.go
├── invoke.go
├── invoke_test.go
├── list.go
├── list_test.go
├── mock
│   ├── deliver_client.go
│   ├── deliver.go
│   └── signer_serializer.go
├── package.go
├── package_test.go
├── query.go
├── query_test.go
├── signpackage.go
├── signpackage_test.go
├── testdata
│   ├── connectionprofile-uneven.yaml
│   ├── connectionprofile.yaml
│   └── src
│       └── chaincodes
│           └── noop
│               └── chaincode.go
├── upgrade.go
└── upgrade_test.go

显而易见,我们要探索的命令:

代码语言:javascript复制
peer chaincode query -C winechannel -n mycontract -c '{"Args":["GetAllWines"]}'

query.go 是关键!

2,上query.go源码

代码语言:javascript复制
/*
Copyright IBM Corp. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/

package chaincode

import (
        "errors"
        "fmt"

        "github.com/hyperledger/fabric/bccsp"
        "github.com/spf13/cobra"
)

var chaincodeQueryCmd *cobra.Command

// queryCmd returns the cobra command for Chaincode Query
func queryCmd(cf *ChaincodeCmdFactory, cryptoProvider bccsp.BCCSP) *cobra.Command {
        chaincodeQueryCmd = &cobra.Command{
                Use:       "query",
                Short:     fmt.Sprintf("Query using the specified %s.", chainFuncName),
                Long:      fmt.Sprintf("Get endorsed result of %s function call and print it. It won't generate transaction.", chainFuncName),
                ValidArgs: []string{"1"},
                RunE: func(cmd *cobra.Command, args []string) error {
                        return chaincodeQuery(cmd, cf, cryptoProvider)
                },
        }
        flagList := []string{
                "ctor",
                "name",
                "channelID",
                "peerAddresses",
                "tlsRootCertFiles",
                "connectionProfile",
        }
        attachFlags(chaincodeQueryCmd, flagList)

        chaincodeQueryCmd.Flags().BoolVarP(&chaincodeQueryRaw, "raw", "r", false,
                "If true, output the query value as raw bytes, otherwise format as a printable string")
        chaincodeQueryCmd.Flags().BoolVarP(&chaincodeQueryHex, "hex", "x", false,
                "If true, output the query value byte array in hexadecimal. Incompatible with --raw")

        return chaincodeQueryCmd
}

func chaincodeQuery(cmd *cobra.Command, cf *ChaincodeCmdFactory, cryptoProvider bccsp.BCCSP) error {
        if channelID == "" {
                return errors.New("The required parameter 'channelID' is empty. Rerun the command with -C flag")
        }
        // Parsing of the command line is done so silence cmd usage
        cmd.SilenceUsage = true

        var err error
        if cf == nil {
                cf, err = InitCmdFactory(cmd.Name(), true, false, cryptoProvider)
                if err != nil {
                        return err
                }
        }

        return chaincodeInvokeOrQuery(cmd, false, cf)
}

0 人点赞