github.com/kaituanwang/hyperledger@v2.0.1+incompatible/core/handlers/endorsement/plugin/plugin.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package main
     8  
     9  import (
    10  	"errors"
    11  	"fmt"
    12  
    13  	"github.com/hyperledger/fabric-protos-go/peer"
    14  	. "github.com/hyperledger/fabric/core/handlers/endorsement/api"
    15  	. "github.com/hyperledger/fabric/core/handlers/endorsement/api/identities"
    16  )
    17  
    18  // To build the plugin,
    19  // run:
    20  //    go build -buildmode=plugin -o escc.so plugin.go
    21  
    22  // DefaultEndorsementFactory returns an endorsement plugin factory which returns plugins
    23  // that behave as the default endorsement system chaincode
    24  type DefaultEndorsementFactory struct {
    25  }
    26  
    27  // New returns an endorsement plugin that behaves as the default endorsement system chaincode
    28  func (*DefaultEndorsementFactory) New() Plugin {
    29  	return &DefaultEndorsement{}
    30  }
    31  
    32  // DefaultEndorsement is an endorsement plugin that behaves as the default endorsement system chaincode
    33  type DefaultEndorsement struct {
    34  	SigningIdentityFetcher
    35  }
    36  
    37  // Endorse signs the given payload(ProposalResponsePayload bytes), and optionally mutates it.
    38  // Returns:
    39  // The Endorsement: A signature over the payload, and an identity that is used to verify the signature
    40  // The payload that was given as input (could be modified within this function)
    41  // Or error on failure
    42  func (e *DefaultEndorsement) Endorse(prpBytes []byte, sp *peer.SignedProposal) (*peer.Endorsement, []byte, error) {
    43  	signer, err := e.SigningIdentityForRequest(sp)
    44  	if err != nil {
    45  		return nil, nil, errors.New(fmt.Sprintf("failed fetching signing identity: %v", err))
    46  	}
    47  	// serialize the signing identity
    48  	identityBytes, err := signer.Serialize()
    49  	if err != nil {
    50  		return nil, nil, errors.New(fmt.Sprintf("could not serialize the signing identity: %v", err))
    51  	}
    52  
    53  	// sign the concatenation of the proposal response and the serialized endorser identity with this endorser's key
    54  	signature, err := signer.Sign(append(prpBytes, identityBytes...))
    55  	if err != nil {
    56  		return nil, nil, errors.New(fmt.Sprintf("could not sign the proposal response payload: %v", err))
    57  	}
    58  	endorsement := &peer.Endorsement{Signature: signature, Endorser: identityBytes}
    59  	return endorsement, prpBytes, nil
    60  }
    61  
    62  // Init injects dependencies into the instance of the Plugin
    63  func (e *DefaultEndorsement) Init(dependencies ...Dependency) error {
    64  	for _, dep := range dependencies {
    65  		sIDFetcher, isSigningIdentityFetcher := dep.(SigningIdentityFetcher)
    66  		if !isSigningIdentityFetcher {
    67  			continue
    68  		}
    69  		e.SigningIdentityFetcher = sIDFetcher
    70  		return nil
    71  	}
    72  	return errors.New("could not find SigningIdentityFetcher in dependencies")
    73  }
    74  
    75  // NewPluginFactory is the function ran by the plugin infrastructure to create an endorsement plugin factory.
    76  func NewPluginFactory() PluginFactory {
    77  	return &DefaultEndorsementFactory{}
    78  }