지금까지 암호학적 원시가 필요한 모든 비트코인 개선 제안(BIP)은 바퀴를 다시 발명해야 했습니다. 각 제안은 secp256k1 타원 곡선 및 관련 알고리즘의 자체 사용자 정의 Python 구현과 함께 제공되었으며, 각기 미세하게 다릅니다. 이러한 불일치는 조용한 책임을 초래하고 BIP 검토를 불필요하게 복잡하게 만들었습니다. 이 문제는 최근 비트코인 옵테크 뉴스레터 #348에서 강조되었으며, 비트코인 개발 커뮤니티의 적어도 일부 개발자들이 오랫동안 느껴온 문제입니다: 암호학적 BIP 참조 secp256k1 코드에 대한 통합되고 재사용 가능한 표준이 있어야 합니다.
지난주, 블록스트림 연구의 요나스 닉과 팀 루핑, 그리고 세바스티안 팔베소너가 이 방향으로 큰 진전을 이루었습니다. 그들의 기존 ChillDKG 제안의 일환으로, 팀은 secp256k1lab을 출시했습니다. 프로토타입, 실험 및 BIP 사양을 위한 새로운, 의도적으로 안전하지 않은 Python 라이브러리입니다. 이는 생산 사용을 위한 것이 아니며(상수 시간이 아니기 때문에 사이드 채널 공격에 취약합니다), 그러나 중요한 격차를 메웁니다: BIP-340 스타일의 Schnorr 서명, ECDH 및 저수준 필드/그룹 산술을 포함한 secp256k1 기능에 대한 깔끔하고 일관된 참조를 제공합니다. 목표는 간단합니다: 중복되고 일회성 구현을 피하여 향후 BIP를 작성하는 것을 더 쉽고 안전하게 만드는 것입니다. BIP 저자에게는: 사용자 정의 코드가 줄어들고, 사양 문제도 줄어들며, 프로토타입에서 제안으로 가는 경로가 더 명확해집니다.
> 왜 실제 secp256k1 라이브러리를 사용하지 않나요?
비트코인 코어는 이미 secp256k1 암호화용으로 빠르고 상수 시간의 C 라이브러리를 포함하고 있습니다. 그렇다면 BIP 저자들은 왜 그것을 사용하지 않을까요?
BIP 저자가 제안을 제출할 때, 그들은 아이디어가 어떻게 작동하는지를 설명하기 위해 참조 구현을 포함해야 합니다. 이러한 구현은 Python으로 작성할 필요는 없지만, C는 종종 프로토타입에는 너무 저수준입니다. Python은 읽기 쉽고 수정하기 쉬우며, 저자가 무엇을 표현하려고 하는지 더 명확하게 만듭니다. 이러한 특성은 사양 작성을 위해 특히 적합합니다.
새로운 암호학적 아이디어를 도입할 때, 실험하기에 명확하고 간결하며 안전한 것이 도움이 됩니다. 원칙적으로 hacspec과 같은 도구는 공식 사양을 위한 좋은 옵션입니다. hacspec 코드는 유효한 Rust이기도 하므로요. 그러나 실제로 hacspec은 Rust에 익숙하지 않은 BIP 독자들에게는 작업하기 어렵고 읽기 힘들 수 있습니다.
Python의 가독성은 여전히 많은 저자들이 무언가가 어떻게 작동하는지를 설명할 때 돌아오는 언어로 남아 있습니다.
BIP 저자들이 secp256k1을 계속 다시 구현하는 이유
이것은 BIP 340 Schnorr 서명에서 시작되었습니다. BIP 저자들은 수학을 쉽게 따라갈 수 있도록 Python으로 원래 참조 코드를 작성했습니다. 그들은 secp256k1의 곡선 매개변수를 사용하여 Schnorr 스타일 서명 및 검증을 수행하는 방법을 정확히 정의했습니다. 그들은 모든 것을 처음부터 구축해야 했습니다: 필드 산술, 그룹 연산, 결정론적 nonce 생성 및 인코딩 규칙. Python 코드는 명확하고 교육적이었습니다. 그러나 이는 이 단일 BIP에 맞춰져 있었고, 향후 BIP에서 재사용할 수 있도록 설계되지 않았습니다.
유사하게, BIP 324 암호화된 P2P 전송은 비트코인 노드가 서로 통신하는 방법에 암호화를 추가했으며, 키 교환, 공유 비밀 및 대칭 암호화에 의존하는 Noise라는 프로토콜을 사용했습니다. 이는 BIP 340에서 사용된 동일한 secp256k1 곡선을 기반으로 하지만, 실제 구현 코드를 재사용하지 않았습니다. ECDH, 직렬화 및 핸드셰이크 패턴과 같은 모든 암호학적 논리는 Python으로 처음부터 다시 구현되었습니다. 기본 수학은 동일하지만, 각 BIP는 논리의 자체 버전을 작성하게 됩니다. 이는 중복된 노력을 초래하고 미세한 불일치의 가능성을 도입합니다.
secp256k1lab이 실제로 무엇인지
secp256k1lab는 비트코인에 대한 암호학적 사양을 작성하고 테스트하는 것을 더 쉽게 만들기 위해 구축된 Python 라이브러리입니다. Python은 이미 BIP에서 참조 구현 및 테스트 벡터를 위한 가장 인기 있고 널리 사용되는 언어이므로, 공유되고 재사용 가능한 라이브러리를 갖는 것은 이치에 맞습니다. 이는 생산 사용을 위해 설계되지 않았습니다. 성능이 아닌 프로토타입을 위해 구축되었습니다. 읽기 쉬운 코드와 최소한의 설정으로 core secp256k1 기능에 대한 깔끔하고 통합된 인터페이스를 제공합니다. 아이디어를 테스트하거나 무언가가 어떻게 작동해야 하는지를 보여주고 싶을 때마다 매번 직접 구현할 필요가 없습니다.
실제 사용 사례: ChillDKG
secp256k1lab는 분산 키 생성을 위한 새로운 BIP 제안인 ChillDKG 작업의 일환으로 처음 개발되었습니다. 이 하나의 사양을 위해 secp256k1의 또 다른 사용자 정의 Python 구현을 작성하는 대신, 저자들은 secp256k1lab을 사용하여 다른 사람들이 활용할 수 있는 방식으로 모든 암호학적 구성 요소를 처리했습니다. 공유되고 읽기 쉬운 코드베이스를 재사용함으로써, 그들은 향후 암호학적 BIP가 처음부터 시작할 필요가 없기를 희망합니다. secp256k1lab을 통해 새로운 제안이 함께 구축하고 개선할 수 있는 기초가 드디어 마련되었습니다.
어디로 갈 수 있을까
여전히 열려 있는 질문이 있습니다: secp256k1lab이 BIP 리포지토리에 있어야 할까요? 이는 암호학적 제안에 대한 공유 참조로 유용성을 입증하고 있지만, 더 넓은 비트코인 개발 프로세스 내에서 진정으로 어디에 속하는지에 대한 논의가 진행 중입니다. 독립형 라이브러리로 남을지, BIP 워크플로우와 더 긴밀하게 통합될지는 분명하지 않지만, 한 가지는 분명합니다—이는 수년간 존재해온 격차를 메웁니다. BIP 저자, 사양 검토자이거나 비트코인 주변의 암호학적 도구 개선에 대해 궁금하다면, 여러분의 의견을 듣고 싶습니다. 비트코인-개발 메일링 리스트에서 논의에 참여하거나 secp256k1lab GitHub 리포지토리에 직접 기여할 수 있습니다.
이는 키아라 비커스의 게스트 포스트입니다. 표현된 의견은 전적으로 그들의 것이며, BTC Inc 또는 비트코인 매거진의 의견을 반드시 반영하지는 않습니다.