github.com/kaituanwang/hyperledger@v2.0.1+incompatible/discovery/support/chaincode/support.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package chaincode
     8  
     9  import (
    10  	"github.com/golang/protobuf/proto"
    11  	common2 "github.com/hyperledger/fabric-protos-go/common"
    12  	"github.com/hyperledger/fabric/common/chaincode"
    13  	"github.com/hyperledger/fabric/common/flogging"
    14  	"github.com/hyperledger/fabric/common/policies"
    15  	"github.com/hyperledger/fabric/common/policies/inquire"
    16  )
    17  
    18  var logger = flogging.MustGetLogger("discovery.DiscoverySupport")
    19  
    20  type MetadataRetriever interface {
    21  	Metadata(channel string, cc string, loadCollections bool) *chaincode.Metadata
    22  }
    23  
    24  // DiscoverySupport implements support that is used for service discovery
    25  // that is related to chaincode
    26  type DiscoverySupport struct {
    27  	ci MetadataRetriever
    28  }
    29  
    30  // NewDiscoverySupport creates a new DiscoverySupport
    31  func NewDiscoverySupport(ci MetadataRetriever) *DiscoverySupport {
    32  	s := &DiscoverySupport{
    33  		ci: ci,
    34  	}
    35  	return s
    36  }
    37  
    38  func (s *DiscoverySupport) PoliciesByChaincode(channel string, cc string, _ ...string) []policies.InquireablePolicy {
    39  	chaincodeData := s.ci.Metadata(channel, cc, false)
    40  	if chaincodeData == nil {
    41  		logger.Info("Chaincode", cc, "wasn't found")
    42  		return nil
    43  	}
    44  	pol := &common2.SignaturePolicyEnvelope{}
    45  	if err := proto.Unmarshal(chaincodeData.Policy, pol); err != nil {
    46  		logger.Warning("Failed unmarshaling policy for chaincode", cc, ":", err)
    47  		return nil
    48  	}
    49  	if len(pol.Identities) == 0 || pol.Rule == nil {
    50  		logger.Warningf("Invalid policy, either Identities(%v) or Rule(%v) are empty:", pol.Identities, pol.Rule)
    51  		return nil
    52  	}
    53  	return []policies.InquireablePolicy{inquire.NewInquireableSignaturePolicy(pol)}
    54  }