블록체인에서의 서명 알고리즘
공개키와 비밀키로 이루어진 비대칭키 서명 알고리즘은 블록체인의 기반이 되는 기술입니다. 지갑의 주소는 공개키로부터 만들어지고, 지갑에 들어있는 재화의 소유권은 비밀키를 사용하여 증명합니다. 블록체인 네트워크에서 유저가 만드는 트랜잭션에는 항상 서명이 포함되어 있으며, 트랜잭션을 검증하기 위하여 사용됩니다.
많은 블록체인 프로젝트가 서명 알고리즘으로 ECDSA를 사용합니다. 그 이유는 RSA에 알고리즘에 비하여, 비슷한 안전성을 더 적은 bit으로 달성할 수 있기 때문입니다. RSA에서 1024bit을 사용했을때의 안전성을 ECDSA에서는 192bit만 사용하면 충분하고, RSA에서 2048bit을 사용할 때의 안전성은 ECDSA에서는 256bit으로 달성할 수 있습니다[link]. 블록의 대부분의 내용은 공개키와 서명으로 이루어져있기 때문에, 작은 크기의 서명과 키는 적은 네트워크 비용과 디스크 비용을 의미합니다.
Schnorr 서명 방식은 블록체인 업계에서 ECDSA에 대한 대안으로 떠오르고 있는 서명 방식입니다. 서명 방식이 더 간단하며, 서명의 용량이 작고, 여러 서명을 하나로 합칠 수 있는 기능을 제공해줍니다. 자세한 설명은 코드박스 정현식님이 작성하신 이 글을 확인해주세요.
코드체인과 텐더민트 컨센서스 알고리즘
코드체인의 메인넷은 텐더민트 합의 알고리즘을 사용합니다. 텐더민트는 BFT계열의 합의 알고리즘으로, 정해져있는 노드들이(위원회라고 부릅니다) 서로 메시지를 주고 받으며, 블록을 합의해나가는 컨센서스 알고리즘입니다. 이 과정에서 Propose, Prevote, Precommit 종류의 메시지들을 주고 받으며, 이 메시지들에는 메시지를 만든 노드의 서명이 포함됩니다. 합의의 결과로 확정된 블록은 해당 블록에 동의한 노드들의 Precommit 서명을 포함합니다.
위원회의 크기가 클수록 비정상적으로 행동하는 노드가 많아도 안전하기 때문에, BFT계열의 합의 알고리즘은 위원회의 크기가 중요합니다. 하지만 위원회의 크기가 클수록 주고 받는 메시지의 양과, 저장해야하는 메시지, 검증해야하는 메시지가 늘어나기 때문에 블록을 처리하는 속도도 느려지고 네트워크 및 디스크의 부하도 커집니다.
현재 코드체인 메인넷은 30개의 노드들로 위원회가 구성되어 블록을 생성합니다. 블록마다 29~30개의 Precommit들이 포함되고 있으며, 30개의 서명을 합치면 약 2KB가 됩니다. 블록에 들어있는 트랜잭션 갯수가 많든 적든 항상 2KB의 부하가 추가되고 있으며, 네트워크의 초기인 현재 주고받는 데이터의 대부분을 Precommit 메시지가 차지하고 있습니다.
Schnorr 서명의 도입 계획과 예상 효과
Schnorr 서명에서는 앞서 언급했던 바와 같이, 여러 서명을 모아서 하나의 서명으로 합칠 수 있습니다. 코드체인 팀은 블록에 저장되는 Precommit들을 하나의 서명으로 합쳐서 저장할 계획을 가지고 있습니다. 이 기능이 구현되면 디스크의 사용량은 최대 수십배 줄어들 수 있으며, 네트워크의 사용량 역시 상당 부분을 줄일 수 있습니다. 또한 3개의 서명을 합친 것과, 30개의 서명을 합친 것, 300개의 서명을 합친 것의 크기가 동일하기 때문에, 더 적은 비용으로 위원회의 크기를 키울 수 있습니다.
새로운 서명 알고리즘 도입의 어려운 점
암호화 라이브러리의 작은 버그가 치명적인 보안적 이슈가 될 수 있으므로, 해당 라이브러리가 많이 사용되고 있어서 충분히 구현이 안정되었는지를 주의 깊게 확인해야합니다. Schnorr 서명 방식은 아직 널리 쓰이고 있지 않은 서명 방식이기 때문에, 다른 프로젝트들보다 먼저 이를 사용하는 건 큰 부담이 됩니다. 하지만 적용했을 때의 효과가 충분히 매력적인 만큼, 직접 라이브러리의 코드를 검토해보고 도입해볼 만한 가치가 충분합니다.
결론
서명 알고리즘은 블록체인의 기반 기술 중 하나이며, 모든 행동에 서명이 포함되기 때문에 네트워크 전체의 처리 속도와 서명의 처리 속도에, 네트워크 및 디스크의 부하는 키와 서명의 크기에 비례합니다. 코드체인 팀은 비용의 절감과 네트워크 안전성을 위하여 여러 고민들을 하고 있으며, 그 중 한 방안으로 Schnorr 서명을 모으는 기능을 테스트하고 있습니다.