[consensus] Remove unnecessary usage of bandwidth in network messages… (#2226)
* [consensus] Remove unnecessary usage of bandwidth in network messages, small adjustments after consensus code review * [consensus] Factor out behavior of when quorum prepare reached * [consensus] Push code from another scratch branch * [consensus] Still do need to accept higher than blocknum messagepull/2240/head
parent
a8d1185823
commit
59859250f1
@ -0,0 +1,75 @@ |
|||||||
|
package consensus |
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/binary" |
||||||
|
|
||||||
|
msg_pb "github.com/harmony-one/harmony/api/proto/message" |
||||||
|
"github.com/harmony-one/harmony/consensus/quorum" |
||||||
|
nodeconfig "github.com/harmony-one/harmony/internal/configs/node" |
||||||
|
"github.com/harmony-one/harmony/internal/utils" |
||||||
|
"github.com/harmony-one/harmony/p2p/host" |
||||||
|
) |
||||||
|
|
||||||
|
func (consensus *Consensus) didReachPrepareQuorum() error { |
||||||
|
logger := utils.Logger() |
||||||
|
logger.Debug().Msg("[OnPrepare] Received Enough Prepare Signatures") |
||||||
|
// Construct and broadcast prepared message
|
||||||
|
network, err := consensus.construct(msg_pb.MessageType_PREPARED, nil) |
||||||
|
if err != nil { |
||||||
|
consensus.getLogger().Err(err). |
||||||
|
Str("message-type", msg_pb.MessageType_PREPARED.String()). |
||||||
|
Msg("failed constructing message") |
||||||
|
return err |
||||||
|
} |
||||||
|
msgToSend, FBFTMsg, aggSig := |
||||||
|
network.Bytes, |
||||||
|
network.FBFTMsg, |
||||||
|
network.OptionalAggregateSignature |
||||||
|
|
||||||
|
consensus.aggregatedPrepareSig = aggSig |
||||||
|
consensus.FBFTLog.AddMessage(FBFTMsg) |
||||||
|
// Leader add commit phase signature
|
||||||
|
blockNumHash := make([]byte, 8) |
||||||
|
binary.LittleEndian.PutUint64(blockNumHash, consensus.blockNum) |
||||||
|
commitPayload := append(blockNumHash, consensus.blockHash[:]...) |
||||||
|
|
||||||
|
// so by this point, everyone has committed to the blockhash of this block
|
||||||
|
// in prepare and so this is the actual block.
|
||||||
|
|
||||||
|
consensus.Decider.SubmitVote( |
||||||
|
quorum.Commit, |
||||||
|
consensus.PubKey, |
||||||
|
consensus.priKey.SignHash(commitPayload), |
||||||
|
consensus.block[:], |
||||||
|
) |
||||||
|
|
||||||
|
if err := consensus.commitBitmap.SetKey(consensus.PubKey, true); err != nil { |
||||||
|
consensus.getLogger().Debug().Msg("[OnPrepare] Leader commit bitmap set failed") |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
if err := consensus.msgSender.SendWithRetry( |
||||||
|
consensus.blockNum, |
||||||
|
msg_pb.MessageType_PREPARED, []nodeconfig.GroupID{ |
||||||
|
nodeconfig.NewGroupIDByShardID(nodeconfig.ShardID(consensus.ShardID)), |
||||||
|
}, |
||||||
|
host.ConstructP2pMessage(byte(17), msgToSend), |
||||||
|
); err != nil { |
||||||
|
consensus.getLogger().Warn().Msg("[OnPrepare] Cannot send prepared message") |
||||||
|
} else { |
||||||
|
consensus.getLogger().Debug(). |
||||||
|
Hex("blockHash", consensus.blockHash[:]). |
||||||
|
Uint64("blockNum", consensus.blockNum). |
||||||
|
Msg("[OnPrepare] Sent Prepared Message!!") |
||||||
|
} |
||||||
|
consensus.msgSender.StopRetry(msg_pb.MessageType_ANNOUNCE) |
||||||
|
// Stop retry committed msg of last consensus
|
||||||
|
consensus.msgSender.StopRetry(msg_pb.MessageType_COMMITTED) |
||||||
|
|
||||||
|
consensus.getLogger().Debug(). |
||||||
|
Str("From", consensus.phase.String()). |
||||||
|
Str("To", FBFTCommit.String()). |
||||||
|
Msg("[OnPrepare] Switching phase") |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
Loading…
Reference in new issue