github.com/true-sqn/fabric@v2.1.1+incompatible/orderer/consensus/etcdraft/blockcreator.go (about)

     1  /*
     2  Copyright IBM Corp. 2017 All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package etcdraft
     8  
     9  import (
    10  	"github.com/golang/protobuf/proto"
    11  	cb "github.com/hyperledger/fabric-protos-go/common"
    12  	"github.com/hyperledger/fabric/common/flogging"
    13  	"github.com/hyperledger/fabric/protoutil"
    14  )
    15  
    16  // blockCreator holds number and hash of latest block
    17  // so that next block will be created based on it.
    18  type blockCreator struct {
    19  	hash   []byte
    20  	number uint64
    21  
    22  	logger *flogging.FabricLogger
    23  }
    24  
    25  func (bc *blockCreator) createNextBlock(envs []*cb.Envelope) *cb.Block {
    26  	data := &cb.BlockData{
    27  		Data: make([][]byte, len(envs)),
    28  	}
    29  
    30  	var err error
    31  	for i, env := range envs {
    32  		data.Data[i], err = proto.Marshal(env)
    33  		if err != nil {
    34  			bc.logger.Panicf("Could not marshal envelope: %s", err)
    35  		}
    36  	}
    37  
    38  	bc.number++
    39  
    40  	block := protoutil.NewBlock(bc.number, bc.hash)
    41  	block.Header.DataHash = protoutil.BlockDataHash(data)
    42  	block.Data = data
    43  
    44  	bc.hash = protoutil.BlockHeaderHash(block.Header)
    45  	return block
    46  }