Skip to content

Commit 5f0b170

Browse files
authored
add metadata to common block (#300)
* add metadata to common block Signed-off-by: Hagar Meir <hagar.meir@ibm.com> * verify common block metadata in proposal Signed-off-by: Hagar Meir <hagar.meir@ibm.com> * AvailableBlocks --> AvailableCommonBlocks Signed-off-by: Hagar Meir <hagar.meir@ibm.com> * use protoutil.InitBlockMetadata Signed-off-by: Hagar Meir <hagar.meir@ibm.com> * address review comments Signed-off-by: Hagar Meir <hagar.meir@ibm.com> --------- Signed-off-by: Hagar Meir <hagar.meir@ibm.com>
1 parent b3f78fa commit 5f0b170

File tree

7 files changed

+71
-23
lines changed

7 files changed

+71
-23
lines changed

node/assembler/oba_utils_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/hyperledger/fabric-x-orderer/common/types"
1313
"github.com/hyperledger/fabric-x-orderer/common/utils"
1414
"github.com/hyperledger/fabric-x-orderer/node/consensus/state"
15+
"github.com/hyperledger/fabric-x-orderer/node/ledger"
1516

1617
"github.com/hyperledger/fabric-protos-go-apiv2/common"
1718
"github.com/hyperledger/fabric/protoutil"
@@ -65,6 +66,12 @@ func (obac *OrderedBatchAttestationCreator) Append(batchId types.BatchID, decisi
6566
BatchCount: batchCount,
6667
},
6768
}
69+
blockMetadata, err := ledger.AssemblerBlockMetadataToBytes(batchId, &state.OrderingInformation{DecisionNum: decisionNum, BatchCount: batchCount, BatchIndex: batchIndex}, 0)
70+
if err != nil {
71+
panic("Failed to invoke AssemblerBlockMetadataToBytes")
72+
}
73+
protoutil.InitBlockMetadata(ba.OrderingInformation.CommonBlock)
74+
ba.OrderingInformation.CommonBlock.Metadata.Metadata[common.BlockMetadataIndex_ORDERER] = blockMetadata
6875
obac.headerHash = protoutil.BlockHeaderHash(ba.OrderingInformation.CommonBlock.Header)
6976
obac.prevBa = ba
7077
return ba

node/consensus/consensus.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/hyperledger/fabric-x-orderer/node/consensus/badb"
2929
"github.com/hyperledger/fabric-x-orderer/node/consensus/state"
3030
"github.com/hyperledger/fabric-x-orderer/node/delivery"
31+
"github.com/hyperledger/fabric-x-orderer/node/ledger"
3132
protos "github.com/hyperledger/fabric-x-orderer/node/protos/comm"
3233
"github.com/hyperledger/fabric/protoutil"
3334
"github.com/pkg/errors"
@@ -244,6 +245,19 @@ func (c *Consensus) VerifyProposal(proposal smartbft_types.Proposal) ([]smartbft
244245
return nil, fmt.Errorf("proposed common block header number %d in index %d isn't equal to computed number %d", hdr.AvailableCommonBlocks[i].Header.Number, i, lastBlockNumber)
245246
}
246247

248+
blockMetadata, err := ledger.AssemblerBlockMetadataToBytes(ba[0], &state.OrderingInformation{DecisionNum: arma_types.DecisionNum(md.LatestSequence), BatchCount: len(attestations), BatchIndex: i}, 0)
249+
if err != nil {
250+
c.Logger.Panicf("Failed to invoke AssemblerBlockMetadataToBytes: %s", err)
251+
}
252+
253+
if hdr.AvailableCommonBlocks[i].Metadata == nil || hdr.AvailableCommonBlocks[i].Metadata.Metadata == nil {
254+
return nil, fmt.Errorf("proposed common block metadata in index %d is nil", i)
255+
}
256+
257+
if !bytes.Equal(blockMetadata, hdr.AvailableCommonBlocks[i].Metadata.Metadata[common.BlockMetadataIndex_ORDERER]) {
258+
return nil, fmt.Errorf("proposed common block metadata in index %d isn't equal to computed metadata", i)
259+
}
260+
247261
}
248262

249263
for i, availableBlock := range hdr.AvailableBlocks {
@@ -325,7 +339,7 @@ func (c *Consensus) VerifySignature(signature smartbft_types.Signature) error {
325339
// VerificationSequence returns the current verification sequence
326340
// (from SmartBFT API)
327341
func (c *Consensus) VerificationSequence() uint64 {
328-
return 0
342+
return 0 // TODO save current verification sequence and return it here
329343
}
330344

331345
// RequestsFromProposal returns from the given proposal the included requests' info
@@ -448,6 +462,11 @@ func (c *Consensus) AssembleProposal(metadata []byte, requests [][]byte) smartbf
448462
lastBlockNumber := lastCommonBlockHeader.Number
449463
prevHash := protoutil.BlockHeaderHash(lastCommonBlockHeader)
450464

465+
md := &smartbftprotos.ViewMetadata{}
466+
if err := proto.Unmarshal(metadata, md); err != nil {
467+
panic(err)
468+
}
469+
451470
c.Logger.Infof("Creating proposal with %d attestations", len(attestations))
452471

453472
availableBlocks := make([]state.AvailableBlock, len(attestations))
@@ -463,6 +482,12 @@ func (c *Consensus) AssembleProposal(metadata []byte, requests [][]byte) smartbf
463482
lastBlockNumber++
464483
availableCommonBlocks[i] = protoutil.NewBlock(lastBlockNumber, prevHash)
465484
availableCommonBlocks[i].Header.DataHash = ba[0].Digest()
485+
blockMetadata, err := ledger.AssemblerBlockMetadataToBytes(ba[0], &state.OrderingInformation{DecisionNum: arma_types.DecisionNum(md.LatestSequence), BatchCount: len(attestations), BatchIndex: i}, 0)
486+
if err != nil {
487+
c.Logger.Panicf("Failed to invoke AssemblerBlockMetadataToBytes: %s", err)
488+
}
489+
protoutil.InitBlockMetadata(availableCommonBlocks[i])
490+
availableCommonBlocks[i].Metadata.Metadata[common.BlockMetadataIndex_ORDERER] = blockMetadata
466491
hdr.Number = lastBlockNumber
467492
hdr.PrevHash = prevHash
468493
prevHash = protoutil.BlockHeaderHash(availableCommonBlocks[i].Header)
@@ -473,11 +498,6 @@ func (c *Consensus) AssembleProposal(metadata []byte, requests [][]byte) smartbf
473498
newState.AppContext = protoutil.MarshalOrPanic(availableCommonBlocks[len(attestations)-1].Header)
474499
}
475500

476-
md := &smartbftprotos.ViewMetadata{}
477-
if err := proto.Unmarshal(metadata, md); err != nil {
478-
panic(err)
479-
}
480-
481501
reqs := arma_types.BatchedRequests(requests)
482502

483503
return smartbft_types.Proposal{

node/consensus/consensus_builder.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ func initialStateFromConfig(config *config.ConsenterNodeConfig) *state.State {
261261
return &initState
262262
}
263263

264-
func appendGenesisBlock(genesisBlock *common.Block, initState *state.State, ledger *ledger.ConsensusLedger) {
264+
func appendGenesisBlock(genesisBlock *common.Block, initState *state.State, consensusLedger *ledger.ConsensusLedger) {
265265
genesisBlocks := make([]state.AvailableBlock, 1)
266266
genesisDigest := protoutil.ComputeBlockDataHash(genesisBlock.GetData())
267267

@@ -283,18 +283,29 @@ func appendGenesisBlock(genesisBlock *common.Block, initState *state.State, ledg
283283

284284
initState.AppContext = protoutil.MarshalOrPanic(lastCommonBlockHeader)
285285

286+
availableCommonBlocks := []*common.Block{genesisBlock}
287+
288+
protoutil.InitBlockMetadata(availableCommonBlocks[0])
289+
290+
blockMetadata, err := ledger.AssemblerBlockMetadataToBytes(state.NewAvailableBatch(0, arma_types.ShardIDConsensus, 0, genesisDigest), &state.OrderingInformation{DecisionNum: 0, BatchCount: 1, BatchIndex: 0}, 1)
291+
if err != nil {
292+
panic("failed to invoke AssemblerBlockMetadataToBytes")
293+
}
294+
295+
availableCommonBlocks[0].Metadata.Metadata[common.BlockMetadataIndex_ORDERER] = blockMetadata
296+
286297
genesisProposal := smartbft_types.Proposal{
287298
Payload: protoutil.MarshalOrPanic(genesisBlock),
288299
Header: (&state.Header{
289-
AvailableCommonBlocks: []*common.Block{genesisBlock},
300+
AvailableCommonBlocks: availableCommonBlocks,
290301
AvailableBlocks: genesisBlocks,
291302
State: initState,
292303
Num: 0,
293304
}).Serialize(),
294305
Metadata: nil,
295306
}
296307

297-
ledger.Append(state.DecisionToBytes(genesisProposal, nil))
308+
consensusLedger.Append(state.DecisionToBytes(genesisProposal, nil))
298309
}
299310

300311
func (c *Consensus) clientConfig() comm.ClientConfig {

node/consensus/consensus_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,16 @@ func TestVerifyProposal(t *testing.T) {
717717
latestBlockHeader.DataHash = baf123id1p1s1.Digest()
718718
latestBlockHeader.PreviousHash = protoutil.BlockHeaderHash(initialAppContext)
719719

720-
header.AvailableBlocks = []state.AvailableBlock{{Header: &state.BlockHeader{Number: latestBlockHeader.Number, PrevHash: latestBlockHeader.PreviousHash, Digest: latestBlockHeader.DataHash}, Batch: state.NewAvailableBatch(baf123id1p1s1.Primary(), baf123id1p1s1.Shard(), baf123id1p1s1.Seq(), baf123id1p1s1.Digest())}}
720+
ab := state.NewAvailableBatch(baf123id1p1s1.Primary(), baf123id1p1s1.Shard(), baf123id1p1s1.Seq(), baf123id1p1s1.Digest())
721+
722+
header.AvailableBlocks = []state.AvailableBlock{{Header: &state.BlockHeader{Number: latestBlockHeader.Number, PrevHash: latestBlockHeader.PreviousHash, Digest: latestBlockHeader.DataHash}, Batch: ab}}
721723
header.AvailableCommonBlocks = []*common.Block{{Header: latestBlockHeader}}
722724

725+
protoutil.InitBlockMetadata(header.AvailableCommonBlocks[0])
726+
blockMetadata, err := ledger.AssemblerBlockMetadataToBytes(ab, &state.OrderingInformation{DecisionNum: 0, BatchCount: 1, BatchIndex: 0}, 0)
727+
require.Nil(t, err)
728+
header.AvailableCommonBlocks[0].Metadata.Metadata[common.BlockMetadataIndex_ORDERER] = blockMetadata
729+
723730
newState := initialState
724731
newState.AppContext = protoutil.MarshalOrPanic(latestBlockHeader)
725732

node/delivery/consensus_ba_deliver_client.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,19 +111,26 @@ func (cr *ConsensusBAReplicator) Replicate() <-chan types.OrderedBatchAttestatio
111111
cr.logger.Panicf("Failed extracting ordered batch attestation from decision: %s", err2)
112112
}
113113

114-
cr.logger.Infof("Decision %d, with %d AvailableBlocks", block.GetHeader().GetNumber(), len(header.AvailableBlocks))
115-
for index, ab := range header.AvailableBlocks {
116-
cr.logger.Infof("BA index: %d; BatchID: %s; BA block header: %s; BA block signers: %+v", index, types.BatchIDToString(ab.Batch), ab.Header.String(), signersFromSigs(sigs[index]))
114+
cr.logger.Infof("Decision %d, with %d AvailableCommonBlocks", block.GetHeader().GetNumber(), len(header.AvailableCommonBlocks))
115+
for index, acb := range header.AvailableCommonBlocks {
116+
117+
primary, shard, seq, _, _, _, _, err := ledger.AssemblerBlockMetadataFromBytes(acb.Metadata.Metadata[common.BlockMetadataIndex_ORDERER])
118+
if err != nil {
119+
cr.logger.Panicf("Failed extracting info from metadata: %s", err)
120+
}
121+
122+
acbBatch := state.NewAvailableBatch(primary, shard, seq, acb.Header.DataHash)
123+
124+
cr.logger.Infof("BA index: %d; BatchID: %s; Common Block: %s; BA block signers: %+v", index, types.BatchIDToString(acbBatch), types.CommonBlockToString(acb), signersFromSigs(sigs[index]))
117125

118126
abo := &state.AvailableBatchOrdered{
119-
AvailableBatch: ab.Batch,
127+
AvailableBatch: acbBatch,
120128
OrderingInformation: &state.OrderingInformation{
121129
CommonBlock: header.AvailableCommonBlocks[index],
122-
BlockHeader: ab.Header,
123130
Signatures: sigs[index],
124131
DecisionNum: header.Num,
125132
BatchIndex: index,
126-
BatchCount: len(header.AvailableBlocks),
133+
BatchCount: len(header.AvailableCommonBlocks),
127134
},
128135
}
129136

node/delivery/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func extractHeaderAndSigsFromBlock(block *common.Block) (*state.Header, [][]smar
5555
return stateHeader, sigs, nil
5656
}
5757

58-
sigs, err := state.UnpackBlockHeaderSigs(compoundSigs, len(stateHeader.AvailableBlocks))
58+
sigs, err := state.UnpackBlockHeaderSigs(compoundSigs, len(stateHeader.AvailableCommonBlocks))
5959
if err != nil {
6060
return nil, nil, errors.Wrapf(err, "failed to extract header signatures from compound signature, block %d", block.GetHeader().GetNumber())
6161
}

node/ledger/assembler_ledger.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func (l *AssemblerLedger) Append(batch types.Batch, orderingInfo types.OrderingI
137137
t1 := time.Now()
138138
defer func() {
139139
l.Logger.Infof("Appended block %d of %d requests to ledger in %v",
140-
ordInfo.BlockHeader.Number, len(batch.Requests()), time.Since(t1))
140+
ordInfo.CommonBlock.Header.Number, len(batch.Requests()), time.Since(t1))
141141
}()
142142

143143
block := &common.Block{
@@ -147,11 +147,7 @@ func (l *AssemblerLedger) Append(batch types.Batch, orderingInfo types.OrderingI
147147
},
148148
}
149149

150-
var metadataContents [][]byte
151-
for i := 0; i < len(common.BlockMetadataIndex_name); i++ {
152-
metadataContents = append(metadataContents, []byte{})
153-
}
154-
block.Metadata = &common.BlockMetadata{Metadata: metadataContents}
150+
protoutil.InitBlockMetadata(block)
155151

156152
var sigs []*common.MetadataSignature
157153
var signers []uint64

0 commit comments

Comments
 (0)