Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 0 additions & 51 deletions node/consensus/state/available_block.go

This file was deleted.

47 changes: 0 additions & 47 deletions node/consensus/state/available_block_test.go

This file was deleted.

47 changes: 7 additions & 40 deletions node/consensus/state/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,12 @@ import (

"github.com/hyperledger/fabric-protos-go-apiv2/common"
"github.com/hyperledger/fabric-x-orderer/common/types"
"google.golang.org/protobuf/proto"

"github.com/pkg/errors"
"google.golang.org/protobuf/proto"
)

type Header struct {
Num types.DecisionNum
AvailableBlocks []AvailableBlock
AvailableCommonBlocks []*common.Block
State *State
DecisionNumOfLastConfigBlock types.DecisionNum
Expand All @@ -29,30 +27,13 @@ func (h *Header) Deserialize(bytes []byte) error {
if bytes == nil {
return errors.Errorf("nil bytes")
}
if len(bytes) < 8+8+4+4 { // at least header number (uint64) and config num (uint64) and number of available blocks (uint32) and number of available common blocks (uint32)
return errors.Errorf("len of bytes is just %d; expected at least 24", len(bytes))
if len(bytes) < 8+8+4 { // at least header number (uint64) and config num (uint64) and number of available common blocks (uint32)
return errors.Errorf("len of bytes is just %d; expected at least 20", len(bytes))
}
h.Num = types.DecisionNum(binary.BigEndian.Uint64(bytes[0:8]))
h.DecisionNumOfLastConfigBlock = types.DecisionNum(binary.BigEndian.Uint64(bytes[8:16]))
availableBlockCount := int(binary.BigEndian.Uint32(bytes[16:20]))
availableCommonBlockCount := int(binary.BigEndian.Uint32(bytes[16:20]))
pos := 20
h.AvailableBlocks = nil
if availableBlockCount > 0 {
h.AvailableBlocks = make([]AvailableBlock, availableBlockCount)
}
if len(bytes) < pos+availableBlockSerializedSize*availableBlockCount {
return errors.Errorf("len of bytes is just %d which is not enough to read the available blocks; expected at least %d", len(bytes), pos+availableBlockSerializedSize*availableBlockCount)
}
for i := 0; i < availableBlockCount; i++ {
var ab AvailableBlock
if err := ab.Deserialize(bytes[pos : pos+availableBlockSerializedSize]); err != nil {
return errors.Errorf("failed deserializing available block; index: %d", i)
}
pos += availableBlockSerializedSize
h.AvailableBlocks[i] = ab
}
availableCommonBlockCount := int(binary.BigEndian.Uint32(bytes[pos : pos+4]))
pos += 4
h.AvailableCommonBlocks = nil
if availableCommonBlockCount > 0 {
h.AvailableCommonBlocks = make([]*common.Block, availableCommonBlockCount)
Expand Down Expand Up @@ -80,36 +61,22 @@ func (h *Header) Deserialize(bytes []byte) error {
}

func (h *Header) Serialize() []byte {
availableBlocksBytes := availableBlocksToBytes(h.AvailableBlocks)
availableCommonBlocksBytes := availableCommonBlocksToBytes(h.AvailableCommonBlocks)
rawState := []byte{}
if h.State != nil {
rawState = h.State.Serialize()
}

buff := make([]byte, 8+8+len(availableBlocksBytes)+len(availableCommonBlocksBytes)+len(rawState))
buff := make([]byte, 8+8+len(availableCommonBlocksBytes)+len(rawState))

binary.BigEndian.PutUint64(buff, uint64(h.Num))
binary.BigEndian.PutUint64(buff[8:16], uint64(h.DecisionNumOfLastConfigBlock))
copy(buff[16:], availableBlocksBytes)
copy(buff[16+len(availableBlocksBytes):], availableCommonBlocksBytes)
copy(buff[16+len(availableBlocksBytes)+len(availableCommonBlocksBytes):], rawState)
copy(buff[16:], availableCommonBlocksBytes)
copy(buff[16+len(availableCommonBlocksBytes):], rawState)

return buff
}

func availableBlocksToBytes(availableBlocks []AvailableBlock) []byte {
buff := make([]byte, 4+len(availableBlocks)*availableBlockSerializedSize)
binary.BigEndian.PutUint32(buff[0:4], uint32(len(availableBlocks)))
pos := 4
for _, ab := range availableBlocks {
bytes := ab.Serialize()
copy(buff[pos:], bytes)
pos += len(bytes)
}
return buff
}

func availableCommonBlocksToBytes(blocks []*common.Block) []byte {
blockBuff := bytes.Buffer{}
for _, b := range blocks {
Expand Down
24 changes: 9 additions & 15 deletions node/consensus/state/header_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,8 @@ import (

func TestHeaderBytes(t *testing.T) {
hdr := Header{
State: &State{AppContext: []byte{}},
Num: 100,
AvailableBlocks: []AvailableBlock{
{Header: &BlockHeader{10, make([]byte, 32), make([]byte, 32)}, Batch: NewAvailableBatch(3, 2, 1, make([]byte, 32))},
{Header: &BlockHeader{11, make([]byte, 32), make([]byte, 32)}, Batch: NewAvailableBatch(6, 5, 4, make([]byte, 32))},
},
State: &State{AppContext: []byte{}},
Num: 100,
DecisionNumOfLastConfigBlock: 10,
}

Expand Down Expand Up @@ -73,15 +69,14 @@ func TestHeaderBytes(t *testing.T) {

require.Equal(t, hdr.Num, hdr2.Num)
require.Equal(t, hdr.State, hdr2.State)
require.Equal(t, hdr.AvailableBlocks, hdr2.AvailableBlocks)
require.Equal(t, hdr.AvailableCommonBlocks[0].Header.Number, hdr2.AvailableCommonBlocks[0].Header.Number)
require.Equal(t, hdr.AvailableCommonBlocks[1].Header.Number, hdr2.AvailableCommonBlocks[1].Header.Number)
require.True(t, bytes.Equal(protoutil.MarshalOrPanic(hdr.AvailableCommonBlocks[0]), protoutil.MarshalOrPanic(hdr2.AvailableCommonBlocks[0])))
require.True(t, bytes.Equal(protoutil.MarshalOrPanic(hdr.AvailableCommonBlocks[1]), protoutil.MarshalOrPanic(hdr2.AvailableCommonBlocks[1])))

require.Equal(t, hdr.Serialize(), hdr2.Serialize())

err = hdr.Deserialize([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7})
err = hdr.Deserialize([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7})
require.Error(t, err)
t.Log(err)

Expand All @@ -92,23 +87,22 @@ func TestHeaderBytes(t *testing.T) {
require.Error(t, err)
t.Log(err)

// len of bytes is just 24 which is not enough to read the available blocks
bytes = make([]byte, 24)
// len of bytes is just 18 which is not enough to read the available blocks
bytes = make([]byte, 18)
binary.BigEndian.PutUint64(bytes, 100)
binary.BigEndian.PutUint64(bytes[8:16], 10)
binary.BigEndian.PutUint32(bytes[16:], 1)
binary.BigEndian.PutUint16(bytes[16:], 1)
err = hdr.Deserialize(bytes)
require.Error(t, err)
t.Log(err)

// no error (nil state)
bytes = make([]byte, 8+8+4+availableBlockSerializedSize+4)
bytes = make([]byte, 8+8+4+4+len(m1))
binary.BigEndian.PutUint64(bytes, 100)
binary.BigEndian.PutUint64(bytes[8:16], 10)
binary.BigEndian.PutUint32(bytes[16:], 1)
ab := AvailableBlock{Header: &BlockHeader{10, make([]byte, 32), make([]byte, 32)}, Batch: NewAvailableBatch(3, 2, 1, make([]byte, 32))}
copy(bytes[20:], ab.Serialize())
binary.BigEndian.PutUint32(bytes[20+availableBlockSerializedSize:], 0)
binary.BigEndian.PutUint32(bytes[20:], uint32(len(m1)))
copy(bytes[24:], m1)
err = hdr.Deserialize(bytes)
require.NoError(t, err)
require.Nil(t, hdr.State)
Expand Down
Loading