github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/integration/raft/client.go (about)

     1  /*
     2  Copyright IBM Corp All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package raft
     8  
     9  import (
    10  	"github.com/hyperledger/fabric-protos-go/common"
    11  	"github.com/hyperledger/fabric-protos-go/orderer"
    12  	"github.com/hyperledger/fabric/cmd/common/signer"
    13  	"github.com/hyperledger/fabric/integration/nwo"
    14  	"github.com/hyperledger/fabric/protoutil"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  func FetchBlock(n *nwo.Network, o *nwo.Orderer, seq uint64, channel string) *common.Block {
    19  	denv := CreateDeliverEnvelope(n, o, seq, channel)
    20  	Expect(denv).NotTo(BeNil())
    21  
    22  	var blk *common.Block
    23  	Eventually(func() error {
    24  		var err error
    25  		blk, err = nwo.Deliver(n, o, denv)
    26  		return err
    27  	}, n.EventuallyTimeout).ShouldNot(HaveOccurred())
    28  
    29  	return blk
    30  }
    31  
    32  func CreateBroadcastEnvelope(n *nwo.Network, signer interface{}, channel string, data []byte) *common.Envelope {
    33  	env, err := protoutil.CreateSignedEnvelope(
    34  		common.HeaderType_MESSAGE,
    35  		channel,
    36  		nil,
    37  		&common.Envelope{Payload: data},
    38  		0,
    39  		0,
    40  	)
    41  	Expect(err).NotTo(HaveOccurred())
    42  
    43  	return signAsAdmin(n, signer, env)
    44  }
    45  
    46  // CreateDeliverEnvelope creates a deliver env to seek for specified block.
    47  func CreateDeliverEnvelope(n *nwo.Network, entity interface{}, blkNum uint64, channel string) *common.Envelope {
    48  	specified := &orderer.SeekPosition{
    49  		Type: &orderer.SeekPosition_Specified{
    50  			Specified: &orderer.SeekSpecified{Number: blkNum},
    51  		},
    52  	}
    53  	env, err := protoutil.CreateSignedEnvelope(
    54  		common.HeaderType_DELIVER_SEEK_INFO,
    55  		channel,
    56  		nil,
    57  		&orderer.SeekInfo{
    58  			Start:    specified,
    59  			Stop:     specified,
    60  			Behavior: orderer.SeekInfo_BLOCK_UNTIL_READY,
    61  		},
    62  		0,
    63  		0,
    64  	)
    65  	Expect(err).NotTo(HaveOccurred())
    66  
    67  	return signAsAdmin(n, entity, env)
    68  }
    69  
    70  func signAsAdmin(n *nwo.Network, entity interface{}, env *common.Envelope) *common.Envelope {
    71  	var conf signer.Config
    72  	switch t := entity.(type) {
    73  	case *nwo.Peer:
    74  		conf = signer.Config{
    75  			MSPID:        n.Organization(t.Organization).MSPID,
    76  			IdentityPath: n.PeerUserCert(t, "Admin"),
    77  			KeyPath:      n.PeerUserKey(t, "Admin"),
    78  		}
    79  	case *nwo.Orderer:
    80  		conf = signer.Config{
    81  			MSPID:        n.Organization(t.Organization).MSPID,
    82  			IdentityPath: n.OrdererUserCert(t, "Admin"),
    83  			KeyPath:      n.OrdererUserKey(t, "Admin"),
    84  		}
    85  	default:
    86  		panic("unsupported signing entity type")
    87  	}
    88  
    89  	signer, err := signer.NewSigner(conf)
    90  	Expect(err).NotTo(HaveOccurred())
    91  
    92  	payload, err := protoutil.UnmarshalPayload(env.Payload)
    93  	Expect(err).NotTo(HaveOccurred())
    94  	Expect(payload.Header).NotTo(BeNil())
    95  	Expect(payload.Header.ChannelHeader).NotTo(BeNil())
    96  
    97  	nonce, err := protoutil.CreateNonce()
    98  	Expect(err).NotTo(HaveOccurred())
    99  	sighdr := &common.SignatureHeader{
   100  		Creator: signer.Creator,
   101  		Nonce:   nonce,
   102  	}
   103  	payload.Header.SignatureHeader = protoutil.MarshalOrPanic(sighdr)
   104  	payloadBytes := protoutil.MarshalOrPanic(payload)
   105  
   106  	sig, err := signer.Sign(payloadBytes)
   107  	Expect(err).NotTo(HaveOccurred())
   108  
   109  	return &common.Envelope{Payload: payloadBytes, Signature: sig}
   110  }