Skip to content

Commit

Permalink
[FAB-8525] Refactor scc chaincode invocation
Browse files Browse the repository at this point in the history
This change extracts invocation request creation
for qscc, cscc and lscc to their own funcs and files.

Change-Id: I8f2f78df19b5ecb48b2c70cb31b9b31acb4c548b
Signed-off-by: Troy Ronda <troy@troyronda.com>
  • Loading branch information
troyronda committed Feb 26, 2018
1 parent 5affde5 commit 5e51983
Show file tree
Hide file tree
Showing 13 changed files with 322 additions and 228 deletions.
2 changes: 1 addition & 1 deletion pkg/fab/channel/channel.go
Expand Up @@ -445,7 +445,7 @@ func (c *Channel) QueryBySystemChaincode(request fab.ChaincodeInvokeRequest) ([]
return nil, err
}

resps, err := queryChaincode(c.clientContext, systemChannel, request, targets)
resps, err := queryChaincode(c.clientContext, fab.SystemChannel, request, targets)
return collectProposalResponses(resps), err
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/fab/channel/channel_test.go
Expand Up @@ -158,7 +158,7 @@ func TestPrimaryPeer(t *testing.T) {
}

func TestQueryOnSystemChannel(t *testing.T) {
channel, _ := setupChannel(systemChannel)
channel, _ := setupChannel(fab.SystemChannel)
peer := mocks.MockPeer{MockName: "Peer1", MockURL: "http://peer1.com", MockRoles: []string{}, MockCert: nil, Status: 200}
err := channel.AddPeer(&peer)
if err != nil {
Expand Down
25 changes: 25 additions & 0 deletions pkg/fab/channel/cscc.go
@@ -0,0 +1,25 @@
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package channel

import (
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
)

const (
cscc = "cscc"
csccConfigBlock = "GetConfigBlock"
)

func createConfigBlockInvokeRequest(channelID string) fab.ChaincodeInvokeRequest {
cir := fab.ChaincodeInvokeRequest{
ChaincodeID: cscc,
Fcn: csccConfigBlock,
Args: [][]byte{[]byte(channelID)},
}
return cir
}
74 changes: 12 additions & 62 deletions pkg/fab/channel/ledger.go
Expand Up @@ -8,7 +8,6 @@ package channel

import (
"net/http"
"strconv"

"github.com/golang/protobuf/proto"
"github.com/pkg/errors"
Expand All @@ -21,10 +20,6 @@ import (
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
)

const (
systemChannel = ""
)

// Ledger is a client that provides access to the underlying ledger of a channel.
type Ledger struct {
ctx context.Context
Expand All @@ -45,16 +40,8 @@ func NewLedger(ctx context.Context, chName string) (*Ledger, error) {
func (c *Ledger) QueryInfo(targets []fab.ProposalProcessor) ([]*common.BlockchainInfo, error) {
logger.Debug("queryInfo - start")

// prepare arguments to call qscc GetChainInfo function
var args [][]byte
args = append(args, []byte(c.chName))

request := fab.ChaincodeInvokeRequest{
ChaincodeID: "qscc",
Fcn: "GetChainInfo",
Args: args,
}
tprs, errs := queryChaincode(c.ctx, systemChannel, request, targets)
cir := createChannelInfoInvokeRequest(c.chName)
tprs, errs := queryChaincode(c.ctx, fab.SystemChannel, cir, targets)

responses := []*common.BlockchainInfo{}
for _, tpr := range tprs {
Expand Down Expand Up @@ -86,17 +73,8 @@ func (c *Ledger) QueryBlockByHash(blockHash []byte, targets []fab.ProposalProces
return nil, errors.New("blockHash is required")
}

// prepare arguments to call qscc GetBlockByNumber function
var args [][]byte
args = append(args, []byte(c.chName))
args = append(args, blockHash[:len(blockHash)])

request := fab.ChaincodeInvokeRequest{
ChaincodeID: "qscc",
Fcn: "GetBlockByHash",
Args: args,
}
tprs, errs := queryChaincode(c.ctx, systemChannel, request, targets)
cir := createBlockByHashInvokeRequest(c.chName, blockHash)
tprs, errs := queryChaincode(c.ctx, fab.SystemChannel, cir, targets)

responses := []*common.Block{}
for _, tpr := range tprs {
Expand All @@ -120,18 +98,8 @@ func (c *Ledger) QueryBlock(blockNumber int, targets []fab.ProposalProcessor) ([
return nil, errors.New("blockNumber must be a positive integer")
}

// prepare arguments to call qscc GetBlockByNumber function
var args [][]byte
args = append(args, []byte(c.chName))
args = append(args, []byte(strconv.Itoa(blockNumber)))

request := fab.ChaincodeInvokeRequest{
ChaincodeID: "qscc",
Fcn: "GetBlockByNumber",
Args: args,
}

tprs, errs := queryChaincode(c.ctx, systemChannel, request, targets)
cir := createBlockByNumberInvokeRequest(c.chName, blockNumber)
tprs, errs := queryChaincode(c.ctx, fab.SystemChannel, cir, targets)

responses := []*common.Block{}
for _, tpr := range tprs {
Expand Down Expand Up @@ -159,18 +127,8 @@ func createCommonBlock(tpr *fab.TransactionProposalResponse) (*common.Block, err
// Returns the ProcessedTransaction information containing the transaction.
func (c *Ledger) QueryTransaction(transactionID fab.TransactionID, targets []fab.ProposalProcessor) ([]*pb.ProcessedTransaction, error) {

// prepare arguments to call qscc GetTransactionByID function
var args [][]byte
args = append(args, []byte(c.chName))
args = append(args, []byte(transactionID))

request := fab.ChaincodeInvokeRequest{
ChaincodeID: "qscc",
Fcn: "GetTransactionByID",
Args: args,
}

tprs, errs := queryChaincode(c.ctx, systemChannel, request, targets)
cir := createTransactionByIDInvokeRequest(c.chName, transactionID)
tprs, errs := queryChaincode(c.ctx, fab.SystemChannel, cir, targets)

responses := []*pb.ProcessedTransaction{}
for _, tpr := range tprs {
Expand All @@ -197,12 +155,8 @@ func createProcessedTransaction(tpr *fab.TransactionProposalResponse) (*pb.Proce
// QueryInstantiatedChaincodes queries the instantiated chaincodes on this channel.
// This query will be made to specified targets.
func (c *Ledger) QueryInstantiatedChaincodes(targets []fab.ProposalProcessor) ([]*pb.ChaincodeQueryResponse, error) {
request := fab.ChaincodeInvokeRequest{
ChaincodeID: "lscc",
Fcn: "getchaincodes",
}

tprs, errs := queryChaincode(c.ctx, c.chName, request, targets)
cir := createChaincodesInvokeRequest()
tprs, errs := queryChaincode(c.ctx, c.chName, cir, targets)

responses := []*pb.ChaincodeQueryResponse{}
for _, tpr := range tprs {
Expand Down Expand Up @@ -237,12 +191,8 @@ func (c *Ledger) QueryConfigBlock(targets []fab.ProposalProcessor, minResponses
return nil, errors.New("Minimum endorser has to be greater than zero")
}

request := fab.ChaincodeInvokeRequest{
ChaincodeID: "cscc",
Fcn: "GetConfigBlock",
Args: [][]byte{[]byte(c.chName)},
}
tprs, err := queryChaincode(c.ctx, c.chName, request, targets)
cir := createConfigBlockInvokeRequest(c.chName)
tprs, err := queryChaincode(c.ctx, c.chName, cir, targets)
if err != nil && len(tprs) == 0 {
return nil, errors.WithMessage(err, "queryChaincode failed")
}
Expand Down
27 changes: 22 additions & 5 deletions pkg/fab/channel/proposal.go → pkg/fab/channel/lscc.go
Expand Up @@ -17,6 +17,15 @@ import (
protos_utils "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/utils"
)

const (
lscc = "lscc"
lsccDeploy = "deploy"
lsccUpgrade = "upgrade"
lsccChaincodes = "getchaincodes"
escc = "escc"
vscc = "vscc"
)

// ChaincodeProposalType reflects transitions in the chaincode lifecycle
type ChaincodeProposalType int

Expand Down Expand Up @@ -58,8 +67,8 @@ func CreateChaincodeDeployProposal(txh fab.TransactionHeader, deploy ChaincodePr
}
args = append(args, chaincodePolicyBytes)

args = append(args, []byte("escc"))
args = append(args, []byte("vscc"))
args = append(args, []byte(escc))
args = append(args, []byte(vscc))

if chaincode.CollConfig != nil {
var err error
Expand All @@ -74,18 +83,26 @@ func CreateChaincodeDeployProposal(txh fab.TransactionHeader, deploy ChaincodePr
fcn := ""
switch deploy {
case InstantiateChaincode:
fcn = "deploy"
fcn = lsccDeploy
case UpgradeChaincode:
fcn = "upgrade"
fcn = lsccUpgrade
default:
return nil, errors.WithMessage(err, "chaincode deployment type unknown")
}

cir := fab.ChaincodeInvokeRequest{
ChaincodeID: "lscc",
ChaincodeID: lscc,
Fcn: fcn,
Args: args,
}

return txn.CreateChaincodeInvokeProposal(txh, cir)
}

func createChaincodesInvokeRequest() fab.ChaincodeInvokeRequest {
cir := fab.ChaincodeInvokeRequest{
ChaincodeID: lscc,
Fcn: lsccChaincodes,
}
return cir
}
File renamed without changes.
74 changes: 74 additions & 0 deletions pkg/fab/channel/qscc.go
@@ -0,0 +1,74 @@
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package channel

import (
"strconv"

"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
)

const (
qscc = "qscc"
qsccTransactionByID = "GetTransactionByID"
qsccChannelInfo = "GetChainInfo"
qsccBlockByHash = "GetBlockByHash"
qsccBlockByNumber = "GetBlockByNumber"
)

func createTransactionByIDInvokeRequest(channelID string, transactionID fab.TransactionID) fab.ChaincodeInvokeRequest {
var args [][]byte
args = append(args, []byte(channelID))
args = append(args, []byte(transactionID))

cir := fab.ChaincodeInvokeRequest{
ChaincodeID: qscc,
Fcn: qsccTransactionByID,
Args: args,
}
return cir
}

func createChannelInfoInvokeRequest(channelID string) fab.ChaincodeInvokeRequest {
var args [][]byte
args = append(args, []byte(channelID))

cir := fab.ChaincodeInvokeRequest{
ChaincodeID: qscc,
Fcn: qsccChannelInfo,
Args: args,
}
return cir
}

func createBlockByHashInvokeRequest(channelID string, blockHash []byte) fab.ChaincodeInvokeRequest {

var args [][]byte
args = append(args, []byte(channelID))
args = append(args, blockHash)

cir := fab.ChaincodeInvokeRequest{
ChaincodeID: qscc,
Fcn: qsccBlockByHash,
Args: args,
}
return cir
}

func createBlockByNumberInvokeRequest(channelID string, blockNumber int) fab.ChaincodeInvokeRequest {

var args [][]byte
args = append(args, []byte(channelID))
args = append(args, []byte(strconv.Itoa(blockNumber)))

cir := fab.ChaincodeInvokeRequest{
ChaincodeID: qscc,
Fcn: qsccBlockByNumber,
Args: args,
}
return cir
}
51 changes: 0 additions & 51 deletions pkg/fab/resource/proposal.go → pkg/fab/resource/config.go
Expand Up @@ -7,65 +7,15 @@ SPDX-License-Identifier: Apache-2.0
package resource

import (
"time"

"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/ptypes"
"github.com/pkg/errors"

"github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/common/crypto"
fcutils "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/common/util"
"github.com/hyperledger/fabric-sdk-go/pkg/context"
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/txn"
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
protos_utils "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/utils"
)

// ChaincodeInstallRequest requests chaincode installation on the network
type ChaincodeInstallRequest struct {
Name string
Path string
Version string
Package *ChaincodePackage
}

// ChaincodePackage contains package type and bytes required to create CDS
type ChaincodePackage struct {
Type pb.ChaincodeSpec_Type
Code []byte
}

// CreateChaincodeInstallProposal creates an install chaincode proposal.
func CreateChaincodeInstallProposal(txh *txn.TransactionHeader, request ChaincodeInstallRequest) (*fab.TransactionProposal, error) {

// Generate arguments for install
args := [][]byte{}
timestamp := time.Now()
ts, err := ptypes.TimestampProto(timestamp)
if err != nil {
return nil, errors.Wrap(err, "failed to create timestamp in install proposal")
}

ccds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{
Type: request.Package.Type, ChaincodeId: &pb.ChaincodeID{Name: request.Name, Path: request.Path, Version: request.Version}},
CodePackage: request.Package.Code, EffectiveDate: ts}
ccdsBytes, err := protos_utils.Marshal(ccds)
if err != nil {
return nil, errors.WithMessage(err, "marshal of chaincode deployment spec failed")
}
args = append(args, ccdsBytes)

cir := fab.ChaincodeInvokeRequest{
ChaincodeID: "lscc",
Fcn: "install",
Args: args,
}

return txn.CreateChaincodeInvokeProposal(txh, cir)
}

// CreateConfigSignature creates a ConfigSignature for the current context.
func CreateConfigSignature(ctx context.Context, config []byte) (*common.ConfigSignature, error) {

Expand Down Expand Up @@ -108,7 +58,6 @@ func CreateConfigSignature(ctx context.Context, config []byte) (*common.ConfigSi

// ExtractChannelConfig extracts the protobuf 'ConfigUpdate' object out of the 'ConfigEnvelope'.
func ExtractChannelConfig(configEnvelope []byte) ([]byte, error) {
logger.Debug("extractConfigUpdate - start")

envelope := &common.Envelope{}
err := proto.Unmarshal(configEnvelope, envelope)
Expand Down

0 comments on commit 5e51983

Please sign in to comment.