Skip to content

Commit 92116de

Browse files
committed
implement trycreateproposal
1 parent e8a90b5 commit 92116de

File tree

8 files changed

+1962
-1730
lines changed

8 files changed

+1962
-1730
lines changed

internal/consensus/reactor.go

+20-20
Original file line numberDiff line numberDiff line change
@@ -540,29 +540,29 @@ OUTER_LOOP:
540540
rs := r.getRoundState()
541541
prs := ps.GetRoundState()
542542
// Send proposal Block parts?
543-
logger.Info("PSULOG - OUTERLOOP - sending block parts?", "rs.ProposalBlockParts", rs.ProposalBlockParts, "prs.ProposalPartSetHeader", prs.ProposalBlockPartSetHeader, "cond", rs.ProposalBlockParts.HasHeader(prs.ProposalBlockPartSetHeader), "rs header", rs.ProposalBlockParts.Header(), "prs header", prs.ProposalBlockPartSetHeader)
543+
//logger.Info("PSULOG - OUTERLOOP - sending block parts?", "rs.ProposalBlockParts", rs.ProposalBlockParts, "prs.ProposalPartSetHeader", prs.ProposalBlockPartSetHeader, "cond", rs.ProposalBlockParts.HasHeader(prs.ProposalBlockPartSetHeader), "rs header", rs.ProposalBlockParts.Header(), "prs header", prs.ProposalBlockPartSetHeader)
544544
if rs.ProposalBlockParts.HasHeader(prs.ProposalBlockPartSetHeader) {
545545
//logger.Info("PSULOG - OUTERLOOP - sending block parts!", "rs bit array", rs.ProposalBlockParts.BitArray())
546546
if index, ok := rs.ProposalBlockParts.BitArray().Sub(prs.ProposalBlockParts.Copy()).PickRandom(); ok {
547-
logger.Info("PSULOG - OUTERLOOP - sending block part !!", "index", index)
548-
part := rs.ProposalBlockParts.GetPart(index)
549-
partProto, err := part.ToProto()
550-
if err != nil {
551-
logger.Error("failed to convert block part to proto", "err", err)
552-
return
553-
}
554-
555-
logger.Info("sending block part", "height", prs.Height, "round", prs.Round)
556-
if err := dataCh.Send(ctx, p2p.Envelope{
557-
To: ps.peerID,
558-
Message: &tmcons.BlockPart{
559-
Height: rs.Height, // this tells peer that this part applies to us
560-
Round: rs.Round, // this tells peer that this part applies to us
561-
Part: *partProto,
562-
},
563-
}); err != nil {
564-
return
565-
}
547+
//logger.Info("PSULOG - OUTERLOOP - sending block part !!", "index", index)
548+
//part := rs.ProposalBlockParts.GetPart(index)
549+
//partProto, err := part.ToProto()
550+
//if err != nil {
551+
// logger.Error("failed to convert block part to proto", "err", err)
552+
// return
553+
//}
554+
555+
//logger.Info("sending block part", "height", prs.Height, "round", prs.Round, "partProto", partProto)
556+
//if err := dataCh.Send(ctx, p2p.Envelope{
557+
// To: ps.peerID,
558+
// Message: &tmcons.BlockPart{
559+
// Height: rs.Height, // this tells peer that this part applies to us
560+
// Round: rs.Round, // this tells peer that this part applies to us
561+
// Part: *partProto,
562+
// },
563+
//}); err != nil {
564+
// return
565+
//}
566566

567567
ps.SetHasProposalBlockPart(prs.Height, prs.Round, index)
568568
//logger.Info("PSULOG - OUTERLOOP - finished sending block parts, continuing back to OUTERLOOP")

internal/consensus/state.go

+54-1
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,18 @@ func (cs *State) handleMsg(ctx context.Context, mi msgInfo, fsyncUponCompletion
10271027
// will not cause transition.
10281028
// once proposal is set, we can receive block parts
10291029
err = cs.setProposal(msg.Proposal, mi.ReceiveTime)
1030+
if cs.config.GossipTransactionHashOnly && !cs.isProposer(cs.privValidatorPubKey.Address()) {
1031+
created := cs.tryCreateProposalBlock(msg.Proposal.Height, msg.Proposal.Round, msg.Proposal.Header, msg.Proposal.LastCommit, msg.Proposal.Evidence, msg.Proposal.ProposerAddress)
1032+
if created {
1033+
if fsyncUponCompletion {
1034+
if err := cs.wal.FlushAndSync(); err != nil { // fsync
1035+
panic("error flushing wal after receiving all block parts")
1036+
}
1037+
}
1038+
cs.handleCompleteProposal(ctx, msg.Proposal.Height, span)
1039+
1040+
}
1041+
}
10301042

10311043
case *BlockPartMessage:
10321044
spanCtx, span := cs.tracer.Start(cs.getTracingCtx(ctx), "cs.state.handleBlockPartMsg")
@@ -1482,7 +1494,7 @@ func (cs *State) defaultDecideProposal(ctx context.Context, height int64, round
14821494

14831495
// Make proposal
14841496
propBlockID := types.BlockID{Hash: block.Hash(), PartSetHeader: blockParts.Header()}
1485-
proposal := types.NewProposal(height, round, cs.ValidRound, propBlockID, block.Header.Time, block.Data.TxKeys)
1497+
proposal := types.NewProposal(height, round, cs.ValidRound, propBlockID, block.Header.Time, block.Data.TxKeys, block.Header, block.LastCommit, block.Evidence, cs.privValidatorPubKey.Address())
14861498
p := proposal.ToProto()
14871499
cs.logger.Info("PSULOG - converted proposal to proto", "txkeys", p.TxKeys, "height", p.Height, "round", p.Round)
14881500

@@ -1835,6 +1847,7 @@ func (cs *State) enterPrecommit(ctx context.Context, height int64, round int32,
18351847
"entering precommit step with invalid args",
18361848
"current", fmt.Sprintf("%v/%v/%v", cs.Height, cs.Round, cs.Step),
18371849
"time", time.Now().UnixMilli(),
1850+
"expected", fmt.Sprintf("#%v/%v", height, round),
18381851
)
18391852
return
18401853
}
@@ -2444,6 +2457,46 @@ func (cs *State) addProposalBlockPart(
24442457

24452458
return added, nil
24462459
}
2460+
2461+
func (cs *State) tryCreateProposalBlock(height int64, round int32, header types.Header, lastCommit *types.Commit, evidence []types.Evidence, proposerAddress types.Address) bool {
2462+
cs.logger.Info("PSULOG - trying to create proposal block")
2463+
2464+
// Blocks might be reused, so round mismatch is OK
2465+
if cs.Height != height {
2466+
cs.logger.Info("received block part from wrong height", "height", height, "round", round)
2467+
cs.metrics.BlockGossipPartsReceived.With("matches_current", "false").Add(1)
2468+
return false
2469+
}
2470+
2471+
if cs.Proposal == nil || len(cs.blockExec.GetMissingTxs(cs.Proposal.TxKeys)) != 0 {
2472+
cs.logger.Info("PSULOG - cannot create block, either proposal is missing or we have missing keys", "proposal", cs.Proposal)
2473+
return false
2474+
} else {
2475+
txKeys := cs.Proposal.TxKeys
2476+
//block := types.MakeBlock(height, cs.blockExec.GetTxsForKeys(txKeys), lastCommit, evidence, false)
2477+
block := cs.state.MakeBlock(height, cs.blockExec.GetTxsForKeys(txKeys), lastCommit, evidence, proposerAddress, false)
2478+
// We have full proposal block. Set txs in proposal block from mempool
2479+
cs.logger.Info("PSULOG - populating txs with keys", "keys", txKeys)
2480+
cs.logger.Info("PSULOG - recreating proposal block", "block", block)
2481+
txs := cs.blockExec.GetTxsForKeys(txKeys)
2482+
block.Version = header.Version
2483+
block.Data.Txs = txs
2484+
block.DataHash = block.Data.Hash()
2485+
block.Header.Time = header.Time
2486+
block.Header.ProposerAddress = header.ProposerAddress
2487+
cs.ProposalBlock = block
2488+
cs.logger.Info("PSULOG - setting proposal block", "block", block)
2489+
partSet, err := block.MakePartSet(types.BlockPartSizeBytes)
2490+
if err != nil {
2491+
return false
2492+
}
2493+
cs.ProposalBlockParts = partSet
2494+
// NOTE: it's possible to receive complete proposal blocks for future rounds without having the proposal
2495+
cs.logger.Info("Successfully recreated proposal block", "block", block)
2496+
return true
2497+
}
2498+
}
2499+
24472500
func (cs *State) handleCompleteProposal(ctx context.Context, height int64, handleBlockPartSpan otrace.Span) {
24482501
cs.logger.Info("PSULOG - handle complete proposal", "height", height, "proposal block parts", cs.ProposalBlockParts)
24492502
// Update Valid* if we can.

proto/tendermint/consensus/types.pb.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)