代码拉取完成,页面将自动刷新
/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package multichannel
import (
"github.com/hyperledger/fabric/common/channelconfig"
mockconfig "github.com/hyperledger/fabric/common/mocks/config"
"github.com/hyperledger/fabric/orderer/common/blockcutter"
"github.com/hyperledger/fabric/orderer/common/msgprocessor"
mockblockcutter "github.com/hyperledger/fabric/orderer/mocks/common/blockcutter"
cb "github.com/hyperledger/fabric/protos/common"
"github.com/hyperledger/fabric/protoutil"
)
// ConsenterSupport is used to mock the multichannel.ConsenterSupport interface
// Whenever a block is written, it writes to the Batches channel to allow for synchronization
type ConsenterSupport struct {
// SharedConfigVal is the value returned by SharedConfig()
SharedConfigVal *mockconfig.Orderer
// SharedConfigVal is the value returned by ChannelConfig()
ChannelConfigVal *mockconfig.Channel
// BlockCutterVal is the value returned by BlockCutter()
BlockCutterVal *mockblockcutter.Receiver
// BlockByIndex maps block numbers to retrieved values of these blocks
BlockByIndex map[uint64]*cb.Block
// Blocks is the channel where WriteBlock writes the most recently created block,
Blocks chan *cb.Block
// ChainIDVal is the value returned by ChainID()
ChainIDVal string
// HeightVal is the value returned by Height()
HeightVal uint64
// NextBlockVal stores the block created by the most recent CreateNextBlock() call
NextBlockVal *cb.Block
// ClassifyMsgVal is returned by ClassifyMsg
ClassifyMsgVal msgprocessor.Classification
// ConfigSeqVal is returned as the configSeq for Process*Msg
ConfigSeqVal uint64
// ProcessNormalMsgErr is returned as the error for ProcessNormalMsg
ProcessNormalMsgErr error
// ProcessConfigUpdateMsgVal is returned as the error for ProcessConfigUpdateMsg
ProcessConfigUpdateMsgVal *cb.Envelope
// ProcessConfigUpdateMsgErr is returned as the error for ProcessConfigUpdateMsg
ProcessConfigUpdateMsgErr error
// ProcessConfigMsgVal is returned as the error for ProcessConfigMsg
ProcessConfigMsgVal *cb.Envelope
// ProcessConfigMsgErr is returned by ProcessConfigMsg
ProcessConfigMsgErr error
// SequenceVal is returned by Sequence
SequenceVal uint64
// BlockVerificationErr is returned by VerifyBlockSignature
BlockVerificationErr error
SystemChannelVal bool
}
// Block returns the block with the given number or nil if not found
func (mcs *ConsenterSupport) Block(number uint64) *cb.Block {
return mcs.BlockByIndex[number]
}
// BlockCutter returns BlockCutterVal
func (mcs *ConsenterSupport) BlockCutter() blockcutter.Receiver {
return mcs.BlockCutterVal
}
// SharedConfig returns SharedConfigVal
func (mcs *ConsenterSupport) SharedConfig() channelconfig.Orderer {
return mcs.SharedConfigVal
}
// ChannelConfig returns ChannelConfigVal
func (mcs *ConsenterSupport) ChannelConfig() channelconfig.Channel {
return mcs.ChannelConfigVal
}
// CreateNextBlock creates a simple block structure with the given data
func (mcs *ConsenterSupport) CreateNextBlock(data []*cb.Envelope) *cb.Block {
block := protoutil.NewBlock(0, nil)
mtxs := make([][]byte, len(data))
for i := range data {
mtxs[i] = protoutil.MarshalOrPanic(data[i])
}
block.Data = &cb.BlockData{Data: mtxs}
mcs.NextBlockVal = block
return block
}
// WriteBlock writes data to the Blocks channel
func (mcs *ConsenterSupport) WriteBlock(block *cb.Block, encodedMetadataValue []byte) {
if encodedMetadataValue != nil {
block.Metadata.Metadata[cb.BlockMetadataIndex_ORDERER] = protoutil.MarshalOrPanic(&cb.Metadata{Value: encodedMetadataValue})
}
mcs.Append(block)
}
// WriteConfigBlock calls WriteBlock
func (mcs *ConsenterSupport) WriteConfigBlock(block *cb.Block, encodedMetadataValue []byte) {
mcs.WriteBlock(block, encodedMetadataValue)
}
// ChainID returns the chain ID this specific consenter instance is associated with
func (mcs *ConsenterSupport) ChainID() string {
return mcs.ChainIDVal
}
// Height returns the number of blocks of the chain this specific consenter instance is associated with
func (mcs *ConsenterSupport) Height() uint64 {
return mcs.HeightVal
}
// Sign returns the bytes passed in
func (mcs *ConsenterSupport) Sign(message []byte) ([]byte, error) {
return message, nil
}
// Serialize returns bytes
func (mcs *ConsenterSupport) Serialize() ([]byte, error) {
return []byte("creator"), nil
}
// NewSignatureHeader returns an empty signature header
func (mcs *ConsenterSupport) NewSignatureHeader() (*cb.SignatureHeader, error) {
return &cb.SignatureHeader{}, nil
}
// ClassifyMsg returns ClassifyMsgVal, ClassifyMsgErr
func (mcs *ConsenterSupport) ClassifyMsg(chdr *cb.ChannelHeader) msgprocessor.Classification {
return mcs.ClassifyMsgVal
}
// ProcessNormalMsg returns ConfigSeqVal, ProcessNormalMsgErr
func (mcs *ConsenterSupport) ProcessNormalMsg(env *cb.Envelope) (configSeq uint64, err error) {
return mcs.ConfigSeqVal, mcs.ProcessNormalMsgErr
}
// ProcessConfigUpdateMsg returns ProcessConfigUpdateMsgVal, ConfigSeqVal, ProcessConfigUpdateMsgErr
func (mcs *ConsenterSupport) ProcessConfigUpdateMsg(env *cb.Envelope) (config *cb.Envelope, configSeq uint64, err error) {
return mcs.ProcessConfigUpdateMsgVal, mcs.ConfigSeqVal, mcs.ProcessConfigUpdateMsgErr
}
// ProcessConfigMsg returns ProcessConfigMsgVal, ConfigSeqVal, ProcessConfigMsgErr
func (mcs *ConsenterSupport) ProcessConfigMsg(env *cb.Envelope) (*cb.Envelope, uint64, error) {
return mcs.ProcessConfigMsgVal, mcs.ConfigSeqVal, mcs.ProcessConfigMsgErr
}
// Sequence returns SequenceVal
func (mcs *ConsenterSupport) Sequence() uint64 {
return mcs.SequenceVal
}
// VerifyBlockSignature verifies a signature of a block
func (mcs *ConsenterSupport) VerifyBlockSignature(_ []*protoutil.SignedData, _ *cb.ConfigEnvelope) error {
return mcs.BlockVerificationErr
}
// IsSystemChannel returns true if this is the system channel
func (mcs *ConsenterSupport) IsSystemChannel() bool {
return mcs.SystemChannelVal
}
// Append appends a new block to the ledger in its raw form,
// unlike WriteBlock that also mutates its metadata.
func (mcs *ConsenterSupport) Append(block *cb.Block) error {
mcs.HeightVal++
mcs.Blocks <- block
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。