dir : consensus/state.go
i) locked block이 있다면 거기 prevote 한다.
if cs.LockedBlock != nil {
cs.signAddVote(tmproto.PrevoteType, cs.LockedBlock.Hash(), cs.LockedBlockParts.Header())
return
}
ii) Proposal block이 없다면 nil에 prevote
if cs.ProposalBlock == nil {
cs.signAddvote(tmproto.PrevoteType, nil, types.PartSetHeader{})
return
}
iii) locked block (이미 검증된)은 없고, proposed block은 있다면 검증을 해야함.
err := cs.blockExec.ValidateBlock(cs.state, cs.ProposalBlock)
// 문제가 있다면 nil에 vote, 없다면 proposal block에 vote
if err != nil {
cs.signAddVote(tmproto.PrevoteType, nil, types.PartSetHeader{})
return
}
proposal block이 valid 하다면 이 block에 vote 해준다.
cs.signAddVote(tmproto.PrevoteType, cs.ProposalBlock.Hash(), cs.ProposalBlockparts.Header())