이미 cs에 Proposal 값이 있거나 조건에 맞지 않으면 리텅
if cs.Proposal != nil { return nil }
if proposal.Height != cs.height || proposal.Round != cs.Round { return nil }
// ...
proposal의 서명을 검증 후, cs에 추가
p := proposal.ToProto()
// verify signature
if !cs.Validator.GetProposer().PubKey.VerifySignature(
types.ProposalSignBytes(cs.state.ChainID, p), proposal.Signature) {
return err
}
proposal.Siganture = p.Signature
cs.Proposal = proposal
// 이게 첫 번째 라운드가 아니라 이미 ProposalBlockParts를
// 다 받았다면 다시 받을 필요는 없고, block parts가 없는 경우에만 이를 cs에 추가한다.
if cs.ProposalBlockParts == nil {
cs.ProposalBlockParts = types.NewPartSetFromHeader(proposal.BlockID.PartSetHeader)
}
에러가 없다면 proposal 수신을 로깅 후 리턴
cs.Logger.Info(...)
return nil