PBFT 논문을 읽고 있습니다.
안녕하세요 이더리움 코드보는 Sigmoid입니다.
PBFT에 대해서 개념적으로는 알고 있었지만 논문을 읽어본적은 없어서,
이번 기회에 제대로 보다보니, 저도 모르게 번역을 하고 있네요.
(해두면 좋을 만한 논문인것 같네요.)
논문을 읽으면서, 몇가지 눈에 띄는 포인트를 정리해 봅니다.
PBFT는 합의냐?
비동기 네트워크의 비잔틴 장애에도 정확하게 생존 가능한 최초의 상태 머신 응답 프로토콜이다. (합의가 아닙니다만 합의로 쓸수도 있죠)PBFT가 3f+1에서 장애 허용성을 띄는 이유.
f개의 응답자가 악의적이거나 무응답이기 때문에, n-f개의 응답자와 통신한 이후에 메시지를 처리하게 되는데, 하필 응답하지 않은 f개가 악의적 노드가 아닌 정상이고 모든 악의적인 노드는 응답했을때, 정상적으로 동작하기 위해서는 n-2f > f 이여야 합니다. 그러므로 n > 3f 인상태에서는 원본데이터가 유지되는 즉, 장애가 허용되는것입니다.
아래 그림에 각 상태에서 노드들이 전송하게되는 메시지를 요약해 보았습니다.
클라이언트는 p2p로 primary 노드에게 요청을 전달합니다. 논문상에는 primary노드라고 예측되는 애한테 보냈다가, 특정시간 동안 응답이 없으면 브로드캐스팅을하고, 노드들은 그 응답으로 primary에게 해당 요청을 릴레이하게 되는데, 요즘은 처음부터 클라이언트가 브로드캐스팅하는 형태로 구현되었다고 하죠? (1스텝 줄인거네요)
2f개의 메시지, 2f+1개의 메시지
commit 메시지를 2f개 이상 받게되면 요청된 액션을 실행한후 reply를 클라이언트로 전달하게 됩니다.
클라이언트는 2f+1 개의 reply를 받으면, 자신이 요청한 액션이 실행되었다고 판단할수 있는 것이죠. (commited)요약본이라고 하는 digest는 이전에 수신한 message의 hash값입니다.
각 노드들은 수신한 모든 메시지를 저장하고, 발신한 모든 메시지도 저장하고 있습니다. 그래야만 재요청이 발생했을경우 추가적으로 액션을 취하지 않고, 결과만 리턴하는것이 가능해 집니다.
논문상에서 primary를 지정하는 공식은 p = v mod R 입니다. 라운드 로빈이네요.
backup간에는 주로 multicast를 사용합니다. 서로 주소/public키를 알고 있다는 뜻입니다
우선 완성본은 아니지만 한글 번역본은 아래 링크에서 확인하시면 됩니다. (업데이트중)
http://bit.ly/pbft_korean
논문을 읽었으면 코드를 짜야하는 법(업데이트중)
https://github.com/NAKsir-melody/simple_pbft.git
우와 좋은 자료 공유해주셔서 감사합니다! 잘 보겠습니다!
좋은 자료는 아니고, 좋아지려고 하는중인 자료 ㅋㅋㅋ