Hyperledger Fabric이나 Parity는 합의 알고리즘이 Pluggable하다. Pluggable한 구조란 같은 일을 하는 다른 구현체를 쉽게 추가할 수 있는 구조를 말한다. 덕분에 Hyperledger Fabric은 Solo, Kafka 그리고 추가 예정인 SBFT(Simplified Byzantine Fault Tolerance) 등 여러 합의 알고리즘을 지원하고, Parity도 퍼블릭망을 위한 PoW 외에 PoA Tendermint 등을 프라이빗 망에서 운영할 수 있다.
합의 알고리즘은 해당 플랫폼의 기술적 한계와 특징을 결정짓는다. 따라서 필요에 의해 바꿀 수 있어야 넓은 목적으로 사용할 수 있다. PoW 계열의 알고리즘은 비트코인을 통해 안정성이 어느 정도 검증이 되었다고 볼 수 있다. 하지만 전력 낭비 문제, Block Finality 보장이 확률적인 문제, 블록 생성 시간이 느린 문제 등이 존재한다. 특히 적은 수의 참여자로 운영되는 프라이빗망에서는 PoW는 선택지가 되기 어렵다. 따라서 PoW를 벗어나 PoS나 BFT 계열의 합의 알고리즘이 필요하다.
ICO 열풍 속에서 여러 팀들이 새로운 합의 알고리즘을 포함한 백서를 제시한 상태이고, 개선된 합의 알고리즘에 대한 연구 논문들도 나오고 있다. 아직까지는 정석이라고 할 만한 게 없는 상태이기 때문에 Pluggable한 구조에서 새로운 구현을 빠르게 시도해볼 수 있는 것은 중요한 장점이다. 이 장점은 단순히 합의 알고리즘에만 국한되지 않는다. 코드체인은 합의 알고리즘뿐 아니라 P2P 네트워크를 사용하는 모든 기능을 쉽게 추가할 수 있는 구조를 가진다.
Network for Blockchain
블록체인 클라이언트를 구현하는데 네트워크를 통해 해야할 일은 크게 세 가지이다. Node-discovery, Synchronization(Block propagation, Transaction propagation), 그리고 Consensus다. 똑같은 전파일지라도 블록과 트랜잭션, 합의 메시지는 성격이 다르기 때문에 같은 메커니즘으로만 전파하지 않는다.
하나의 기능을 위해 여러 구현이 존재하기도 한다.
Node-discovery의 경우 현재 Kademlia를 사용하고 있는데, Sybil Attack 등 Kademlia의 특성을 이용한 공격을 받을 가능성도 있다. 이를 방지하기 위해 Node-discovery 방법을 2개 이상 사용하고 각 방법으로 연결하는 피어 수를 일정 이상으로 유지하여 특정 Node-discovery의 취약점을 보완할 수 있다.
Block Synchronization을 할 때 Genesis 블록부터 시작하여 모든 히스토리를 받는 방법이 있고, fast sync나 warp sync처럼 최신 블록의 상태만 받아오는 방법이 있다.
Consensus의 경우 PoW, Tendermint, Hot-Stuff 등 합의 알고리즘에 따라 당연히 통신 방법이 바뀐다. PoW는 다른 노드와 합의하는 과정이 없고 Tendermint의 경우 블록 컨펌을 위해 두 번의 2/3 합의가 필요하다. 그리고 Hot-Stuff의 경우 한 번의 2/3 합의만 있어도 블록 컨펌이 가능하다.
CodeChain P2P Network
코드체인의 P2P 네트워크는 Connection 레이어와 Extension 레이어로 구분한다. 소켓 연결은 P2P 커넥션에서 담당하고 이 소켓의 애플리케이션 격인 Discovery, Synchronization/Propagation, Consensus 기능들은 독립된 Extension으로 구현되어 동작한다. 위에서 말한 전체 히스토리를 받는 방식과 최신 상태를 받는 방식이 별도의 Extension으로 구현된다. 합의 알고리즘에 따라 보내야 할 메시지가 다르기 때문에 합의 알고리즘 별로 Extension이 구현된다. Block Propagation과 Transaction Propagation 역시 각각의 Extension으로 구현되었다. 코드체인의 Synchronization/Propagation 메커니즘은 별도의 포스팅으로 소개할 기회가 있을 것이다.
P2P Connection에서 노드가 추가되면 Extension에 node_added 이벤트가 발생한다. Extension은 상대 노드를 식별하고 상대 노드의 Extension 버전 등을 보고 연결 여부를 결정할 수 있다. 이 과정이 끝나면 상대 Extension과 메시지를 주고받는 것만 신경 쓰면 된다.
메시지의 암호화나 타이머 이벤트 등 통신에서 고려해야 할 내용도 Extension 입장에서는 추상화되어 있다. 다른 Extension에 영향을 주지 않으면서 새로운 Extension을 추가하기 쉬운 구조이다. 코드체인이 오픈소스 프로젝트로 공개되었을 때, 오픈소스 기여를 하고 싶다면 Network Extension을 추가하는 작업을 시작점으로 잡아도 좋을 것이다.
Conclusion
합의 알고리즘과 P2P 네트워킹은 블록체인의 성능과 특징에 있어서 큰 부분을 차지한다. 코드체인은 두 부분을 모두 Pluggable하게 만들어 블록체인 네트워크 혹은 개별 노드를 운영하려는 사람이 쉽게 기능을 조합해서 사용할 수 있도록 설계되었다. 그리고 성능과 안정성을 높이기 위해 Network Extension을 더 많이 확보하는 목표를 가지고 있다. IBLT(Invertible Bloom Lookup Table)를 구현하여 블록 전파를 빠르게 하는 O(1) Block Propagation Extension, Eclipse Attack을 방어하기 위한 별도의 Node-discovery Extension 등이 있다. 코드체인은 Pluggable 구조를 통해 빠르게 여러 실험을 해보며 안정적으로 성능을 확보하는 것을 목표로 하고 있다.
CodeChain 소스코드는 github repo에서 확인 가능합니다. 개발자간 실시간 소통을 위해 gitter channel도 운영중이니 들어오셔서 자세한 문의도 하시면 됩니다.