합의 프로토콜을 2가지 속성을 만족시켜야 합니다.
문제 없는 두 노드가 서로 다른 값으로 합의하면 안 됩니다. 다른 값이 합의됐다는 것은 같은 높이의 서로 다른 블록이 생성됐다는 뜻입니다.
문제 없는 모든 노드들은 무한 루프에 빠지지 않고 상태 변경이 종료되는 합의가 반드시 이루어져야 합니다.
(cf) finality
블록체인에 커밋되면 잘 구성된 모든 블록이 취소되지 않는다.
비트코인이 사용하는 합의 알고리즘은 언제나 더 어려운 문제를 푼 체인이 잇으면, 그 체인을 유효한 체인으로 판단합니다. 즉, 지금 있는 체인보다 더 긴 체인을 만들 해시 파워가 있으면, 언제든지 현재 합의된 블록을 다른 블록으로 대체할 수 있다는 것입니다.
Finality가 보장되지 않는다 = safety를 포기했다.(FLP Impossibility)
전통적인 분산 시스템에서 연구되던 PBFT에 기반한 BFT 계열의 합의 알고리즘이 safety over liveness에 해당합니다.
(ex) Tendermint
하나의 라운드가 Propose, Prevote, Precommit의 3단계로 이뤄집니다. Prevote와 Precommit 단계에서 합의는 2/3이상의 동의가 필요합니다. 따라서 safety가 항상 보장됩니다. 하지만, 전송한 메시지가 시간 안에 도달하는 것을 보장하지 못 하는 비동기 네트워크에서는 합의가 이루어지지 않아서 블록이 생성되지 않을 수 있습니다. (liveness가 보장되지 않습니다.)
그래서 Tendermint는 정해진 시간 안에 메시지가 도달하는 것이 보장되지만, 그 정해진 시간은 알 수 없는 Partial Synchronous Network Model을 사용합니다. 그러나 최악의 경우에는 몇번의 라운드 동안 새 블록이 생성되지 않으면서 TPS 저하를 일으킬 수 있습니다.
합의 프로토콜에서는 크게 3가지를 고려해야 합니다.