|
|
|
package consensus
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/harmony-one/harmony/api/proto"
|
|
|
|
msg_pb "github.com/harmony-one/harmony/api/proto/message"
|
|
|
|
"github.com/harmony-one/harmony/internal/utils"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Construct the prepare message to send to leader (assumption the consensus data is already verified)
|
|
|
|
func (consensus *Consensus) constructPrepareMessage() []byte {
|
|
|
|
message := &msg_pb.Message{
|
|
|
|
ReceiverType: msg_pb.ReceiverType_LEADER,
|
|
|
|
ServiceType: msg_pb.ServiceType_CONSENSUS,
|
|
|
|
Type: msg_pb.MessageType_PREPARE,
|
|
|
|
Request: &msg_pb.Message_Consensus{
|
|
|
|
Consensus: &msg_pb.ConsensusRequest{},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
consensusMsg := message.GetConsensus()
|
|
|
|
consensus.populateMessageFields(consensusMsg)
|
|
|
|
|
|
|
|
// 48 byte of bls signature
|
|
|
|
sign := consensus.priKey.SignHash(consensusMsg.BlockHash)
|
|
|
|
if sign != nil {
|
|
|
|
consensusMsg.Payload = sign.Serialize()
|
|
|
|
}
|
|
|
|
|
|
|
|
marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message)
|
|
|
|
if err != nil {
|
|
|
|
utils.GetLogInstance().Error("Failed to sign and marshal the Prepare message", "error", err)
|
|
|
|
}
|
|
|
|
return proto.ConstructConsensusMessage(marshaledMessage)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Construct the commit message which contains the signature on the multi-sig of prepare phase.
|
|
|
|
func (consensus *Consensus) constructCommitMessage(multiSigAndBitmap []byte) []byte {
|
|
|
|
message := &msg_pb.Message{
|
|
|
|
ReceiverType: msg_pb.ReceiverType_LEADER,
|
|
|
|
ServiceType: msg_pb.ServiceType_CONSENSUS,
|
|
|
|
Type: msg_pb.MessageType_COMMIT,
|
|
|
|
Request: &msg_pb.Message_Consensus{
|
|
|
|
Consensus: &msg_pb.ConsensusRequest{},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
consensusMsg := message.GetConsensus()
|
|
|
|
consensus.populateMessageFields(consensusMsg)
|
|
|
|
|
|
|
|
// 48 byte of bls signature
|
|
|
|
sign := consensus.priKey.SignHash(multiSigAndBitmap)
|
|
|
|
if sign != nil {
|
|
|
|
consensusMsg.Payload = sign.Serialize()
|
|
|
|
}
|
|
|
|
|
|
|
|
marshaledMessage, err := consensus.signAndMarshalConsensusMessage(message)
|
|
|
|
if err != nil {
|
|
|
|
utils.GetLogInstance().Error("Failed to sign and marshal the Commit message", "error", err)
|
|
|
|
}
|
|
|
|
return proto.ConstructConsensusMessage(marshaledMessage)
|
|
|
|
}
|