앞선 글에서 Tendermint의 consensus algorithm에 대한 대략적인 프로세스를 확인하였다. 해당 프로세스에 대해 조금 더 디테일하게 확인해보고 싶어 관련 안내 문서를 확인했다.
블록체인의 각 height에서 round-based 프로토콜은 다음 블록을 결정하기 위해 실행된다. 각 round는 3 step으로 이루어져 있으며(Propose, Prevote, Precommit) Commit과 NewHeight의 step도 존재한다.
최적의 시나리오는
NewHeight -> (Propose -> Prevote -> Precommit)+ -> Commit -> NewHeight ->...
위와 같으며, 가운데 propose부터 precommit을 한 round라 칭한다. 블록을 생성하기 위해 한번의 round를 진행하지만 블록이 생성되지 않을 시 여러번의 round를 진행한다. 다음과 같은 상황일 시 여러번의 round가 일어날 수 있다.
+-------------------------------------+
v |(Wait til `CommmitTime+timeoutCommit`)
+-----------+ +-----+-----+
+----------> | Propose +--------------+ | NewHeight |
| +-----------+ | +-----------+
| | ^
|(Else, after timeoutPrecommit) v |
+-----+-----+ +-----------+ |
| Precommit | <------------------------+ Prevote | |
+-----+-----+ +-----------+ |
|(When +2/3 Precommits for block found) |
v |
+--------------------------------------------------------------------+
| Commit |
| |
| * Set CommitTime = now; |
| * Wait for block, then stage/save/commit block; |
+--------------------------------------------------------------------+
어떤 노드에는 validator 역할을 위한 private key가 없을 수 있지만, meta-data, proposals, blocks 및 votes를 피어에게 중계함으로써 consensus protocol에서 적극적인 역할을 가진다. Active validator의 개인키가 있고 투표 서명에 참여하는 노드를 validator-nodes라고 한다. Validator node를 포함한 모든 노드는 state를 가지고 있으며(height, round, step) 다음 단계 진행을 위한 작업을 실시한다.
두 노드 사이에는 'connection'이 있으며 이 connection위에 다중화되어 정보의 'channel'이 제한된다. Channel 중 일부는 epidemic gossip protocol이 구현되어 주변 노드에게 가장 최근의 합의 상태를 알릴 수 있다.
For example,
Proposal은 각 라운드에 지정된 proposer가 서명하고 publish한다. Proposer는 voting power에 비례하여 라운드 로빈 선택 알고리즘에 의해 선택된다. (동작방식)
'(H,R)'의 proposal은 블록과 proposer가 알고있는 경우 포함되는 최신 'PoLC-Round < R'로 구성된다. 노드가 안전할 때 잠금을 해제할 수 있도록 네트워크에 암시하여 활성속성(liveness property)를 보장한다.
'Propose' 입력 시
'Propose'가 종료되는 조건
'Prevote'를 단계에서 각 validator들은 prevote 투표를 브로드캐스트 한다.
'Prevote'단계가 종료되는 조건
'Precommit' 단계에서 각 validator들은 precommit 투표를 브로드캐스트 한다.
이 nil에 대한 precommit은 "이 round에 대한 PoLC를 확인하지 못했지만 2/3이상 prevote를 얻었고 조금 기다렸다"를 의미한다.
'Precommit'단계가 종료되는 조건
Consensus process에 대해 조금 더 확인해보기 위하여 docs를 봤는데 아직까지 머리속에 명확하게 정립은 되지 않는것 같다. 다음번에는 Tendermint core 코드 상에서 돌아가는 방식을 보고 한번 더 확인해봐야겠다.
참고
https://github.com/tendermint/tendermint/blob/master/spec/consensus/consensus.md
공유 감사합니다. 밸리데이터 운영중에 많은 도움이 될 것 같습니다.