Schnorr 서명이란?
Schnorr 서명은 ECDSA의 대안으로 부상한 타원 곡선 서명 방식으로 코드체인에서도 구현되어 있는 기술입니다. 이에 대해서는 비트코인의 Schnorr BIP(링크)에서 자세히 알아볼 수 있으며, 여러 글에서 Schnorr 서명의 개념과 응용 대해서 설명하고 있으니 (링크1, 링크2) 참고하시면 좋습니다.
우선 Schnorr signature의 가장 큰 장점 4가지를 설명 드리겠습니다.
Schnorr 서명은 ECDSA에 비해서 연산이 간단하고 약간 더 빠릅니다. ECDSA는 계산 과정에 modular inverse와 point multiplication과 같은 무거운 연산이 많이 들어가 있는 반면 Schnorr는 이런 무거운 연산이 ECDSA에 비해 상대적으로 적습니다.
Schnorr 서명은 ECDSA에 비해서 서명의 크기가 더 작습니다. ECDSA 서명은 일반적으로 공개 키 복구를 지원하기 위해 recovery parameter가 포함됩니다. Schnorr 서명에 함께 X 좌표 하나에 단일 Y 좌표를 가진다는 가정을 사용하면 recovery parameter 없이 공개 키 복구가 가능해집니다.
한 블록 내의 서명들을 동시에 검증하는 Batch validation을 수행할 수 있습니다. 이는 Schnorr 서명이 선형성을 가지기 때문으로, 여러 검증 식을 하나로 더해서 수행해도 아무런 문제가 없습니다. 이렇게 식들을 더한 뒤 서명들을 한 번에 검증하면 point multiplication의 횟수를 줄일 수 있습니다.
마지막으로, Schnorr 서명을 도입하면 Multisignature의 크기를 줄일 수 있습니다. 대부분의 블록체인은 여러 명이 multisignature에 참여하면 각자의 서명을 하나씩 저장합니다. 이렇게 하면 서명을 매우 빠르게 처리할 수 있지만, 검증이 느리며 참여자의 수에 비례해서 서명의 크기가 늘어난다는 단점이 있습니다. Schnorr 서명을 사용하게 되면 고정된 서명 크기를 가지는 여러 multisignature 방법을 사용할 수 있습니다. 이 중 대표적인 방법은 MuSig(링크)입니다.
코드체인의 Schnorr 서명 구현
코드체인에서는 비트코인의 libsecp256k1 (링크)에 실험적으로 들어갔던 Schnorr 서명 코드를 사용하고 있는데 이를 Rust에서 사용하기 위해 rust-secp256k1라는 Rust wrapper를 사용하고 있습니다. (링크)
그리고 코드체인의 JavaScript Primitives에 Schnorr 서명의 간단한 구현체를 제공하고 있고, 이를 바탕으로 Schnorr 버전의 JavaScript SDK와 Keystore가 작성되어 있습니다. Schnorr 버전의 코드체인과 SDK는 기존 코드의 변경 없이 ECDSA에서 Schnorr 서명으로 옮겼을 때 기존 테스트를 모두 통과하는 것을 확인한 상태입니다.
이를 확인하려면 각 Repository의 schnorr branch를 참고해주세요.
CodeChain schnorr branch: Link
Primitives: Link / SDK schnorr branch: Link / Keystore schnorr branch: Link
코드체인의 Schnorr 서명 기반 multisignature
앞서 설명한 MuSig는 m-of-m multisignature scheme으로, 서명 검증을 위해 별도의 구현 없이 단일 서명을 검증할 때와 동일하게 검증하면 된다는 장점이 있습니다. Schnorr 서명이 들어간 시점부터 MuSig의 사용이 가능하기 때문에 코드체인에서는 MuSig 서명 방법을 JavaScript SDK와 RPC를 통해서 지원할 예정입니다.
추가로, 코드체인에서는 m-of-n threshold signature를 지원하기 위해 MuSig를 사용한 트리 서명을 사용할 예정입니다. 트리 서명(Tree signature)은 추가 구현 없이 Lock script만으로 작성이 가능하며, 검증이 빠르다는 장점이 있습니다 (자세한 내용은 링크). 코드체인에서는 트리 서명의 lock script들을 standard script로 구현 중에 있으며, 서명 방법 역시 MuSig와 같이 SDK와 RPC를 통해서 지원할 예정입니다.