dir : consensus/state.go
height, round, step의 일치 여부 확인 (불일치하면 리턴)
if cs.Height != height || round < cs.Round
|| (cs.Round == round && cstpyes.RoundStepPropose <= cs.Step) {
return
}
defer 함수 선언
// proposal 과정에서 문제가 있든 없든 다음 step으로 진행한다.
// 이는 텐더민트 알고리즘이 기본적으로 fault-tolerant 하도록 디자인되었기 문인데,
// 이 fault에는 proposal에 문제가 있는 경우도 포함이 됨.
// propose된 block이 유효하지 않으면 nil에 투표하면 되고,
// state를 업데이트해서 문제가 있든 없든 다른 노드들에게 알려주는게 중요함.
defer func() {
cs.updateRoundStep(round, cstypes.RoundStepPropose)
cs.newStep()
// Proposal이 완료되었다면 Prevote 단계로 진입
if cs.isProposalComplete() {
cs.enterPrevote(height, cs.Round)
}
}()
proposal은 못 받고, block parts만 다 받았을 경우 Prevote 단계로 강제로 넘기는 타임아웃 설정
cs.scheduleTimeout(cs.config.Propose(round), height, round, cstypes.RoundStepPropose)
검증자, 공개키, address 등 확인
if cs.privValidator == nil { ... return }
if cs.privValidatrPubKey == nil { ... return}
// address가 validator 목록에 있는지 확인
address := cs.privValidatorPubKey.Address()
if !cs.Validators.HasAddress(address) {... return}
조건을 만족하고, 이 round의 proposer 인 경우 검증자로서 proposal 시작
if cs.isProposer(address) {
cs.decideProposal(height, round)
// default tendermint node에서는 defaultDecideProposal 함수 호출
} else {
// do nothing put logging
}