Section2.8 prePrepare、prepare-and-commit
待完善。。。。。。
事件来源
// RecvMsg is called by the stack when a new message is received
func (eer *externalEventReceiver) RecvMsg(ocMsg *pb.Message, senderHandle *pb.PeerID) error {
eer.manager.Queue() <- batchMessageEvent{
msg: ocMsg,
sender: senderHandle,
}
return nil
}事件处理
case batchMessageEvent: ocMsg := et return op.processMessage(ocMsg.msg, ocMsg.sender)func (op *obcBatch) processMessage(ocMsg *pb.Message, senderHandle *pb.PeerID) events.Event { if ocMsg.Type == pb.Message_CHAIN_TRANSACTION { req := op.txToReq(ocMsg.Payload) return op.submitToLeader(req) } if ocMsg.Type != pb.Message_CONSENSUS { logger.Errorf("Unexpected message type: %s", ocMsg.Type) return nil } batchMsg := &BatchMessage{} ... if req := batchMsg.GetRequest(); req != nil { ... if (op.pbft.primary(op.pbft.view) == op.pbft.id) && op.pbft.activeView { return op.leaderProcReq(req) } op.startTimerIfOutstandingRequests() return nil } else if pbftMsg := batchMsg.GetPbftMessage(); pbftMsg != nil { senderID, err := getValidatorID(senderHandle) // who sent this? if err != nil { panic("Cannot map sender's PeerID to a valid replica ID") } msg := &Message{} err = proto.Unmarshal(pbftMsg, msg) if err != nil { logger.Errorf("Error unpacking payload from message: %s", err) return nil } return pbftMessageEvent{ msg: msg, sender: senderID, } } logger.Errorf("Unknown request: %+v", batchMsg) return nil }
2、default,会执行pbft.ProcessEvent(event)
pbft.ProcessEvent(event)2.1 pbftMessageEvent
2.2、RequestBatch
2.3、PrePrepare
2.4、Prepare
2.5、Commit
committed的后续操作尚未研究
Last updated