핵심 쟁점: 비트코인 ​​암호화의 핵심, libsecp256k1

이 기사는 기계로 번역되었습니다
원문 표시

비트코인 매거진

핵심 쟁점: 비트코인 ​​암호화의 핵심, libsecp256k1

A timeline of major milestones in libsecp256k1's history.

비트코인 사용자들 사이에서 흔히 들리는 말 중에는 "신뢰하지 말고 검증하라", "내 키가 아니면 코인도 없다"와 같은 말이 있으며, 심지어 "수학에 기반한다"고 주장하는 사람들도 있습니다. 하지만 이러한 격언들은 궁극적으로 무엇을 의미하며, 복잡한 수학은 실제로 어떻게 적용되는 것일까요? 대부분의 독자들은 비트코인 ​​설계의 핵심 요소 중 하나가 공개키 암호화 , 특히 중앙 기관 없이 소유권을 증명하는 데 필수적인 디지털 서명 이라는 것을 알고 있을 것입니다. 하지만 타원 곡선 계산을 구현하는 내부 소프트웨어가 무엇인지, 그리고 이를 가장 안전하고 효율적인 방식으로 구현하기 위해 어떤 노력이 기울여지고 지속적인 개선이 이루어지고 있는지는 잘 알려져 있지 않을 것입니다. 이제 작은 취미 프로젝트로 시작하여 수조 달러 규모의 자산을 보호하는 합의 규칙의 핵심 요소로 발전한 라이브러리 "libsecp256k1"의 흥미로운 역사와 진화를 살펴보겠습니다.

창세기

정확한 이유는 알 수 없지만, 사토시(SATS) 비트코인에서 디지털 서명을 생성하고 검증하기 위해 "secp256k1"이라는 타원 곡선을 선택했습니다. 초기 비트코인 ​​클라이언트는 널리 사용되는 OpenSSL 라이브러리를 사용하여 거래 서명 및 검증을 수행했습니다. 타사 라이브러리를 사용하는 것은 소프트웨어 엔지니어링 관점에서 합리적인 접근 방식처럼 보입니다(특히 타원 곡선처럼 특정 분야에 특화되고 복잡한 경우에는 더욱 그렇습니다).

암호화 기술에 기반한 OpenSSL을 선택했지만, 서명 파싱 코드의 불일치로 인해 나중에 문제가 발생했습니다. 최악의 경우, 이는 의도치 않은 체인 분할로 이어질 수도 있었습니다. 당시의 교훈 중 하나는 OpenSSL이 비트코인처럼 합의가 중요한 시스템에 적합한 라이브러리가 아니라는 것이었습니다. 이 문제는 이후 BIP66에서 ECDSA 서명의 엄격한 인코딩을 보장함으로써 해결되었습니다. 그 후, 2016년 초에 출시된 비트코인 ​​코어 v0.12 에서는 OpenSSL 의존성이 libsecp256k1로 대체되었습니다.

하지만 한 발짝 물러서서 생각해 보면, libsecp256k1 프로젝트를 시작하게 된 초기 동기는 주로 속도 향상 가능성에 대한 호기심이었습니다. 2012년 어느 날, 비트코인 ​​코어 개발자인 피터 윌레(Pieter Wuille), 일명 "sipa"는 할 피니(Hal Finney, 2009년 사토시(SATS) 로부터 최초의 비트코인 ​​거래를 받은 인물로 알려짐) 비트코인톡 토크(bitcointalk)에 올린 글을 우연히 보게 되었습니다.

"서명 검증 속도 향상"이라는 제목의 게시물에서는 소위 "자기동형사상"(더 정확히는 GLV, 즉 Gallant-Lambert-Vanstone 방식)을 활용하는 최적화 방안을 논의했습니다. 이는 특정 타원 곡선에서만 가능한데, secp256k1이 그 예입니다. Hal Finney는 OpenSSL 기본 요소를 사용하여 이를 직접 구현했으며, 나중에는 Bitcoin Core에 PR로 제출되기도 했습니다. 2 비록 견고한 성능을 보여주었지만

약 20%의 속도 향상이 있었지만, 코드 복잡성 증가 및 관련 암호화의 안전성에 대한 보장 부족에 대한 우려 때문에 결국 병합되지 않았습니다.

피터 윌레는 처음부터 새로운 라이브러리를 개발하기로 결정했고, "secp256k1" 저장소의 첫 번째 커밋은 2013년 3월 5일로 거슬러 올라갑니다. 단 일주일 만에 이 라이브러리는 전체 블록체인(당시 블록 높이 약 225,000)을 검증할 수 있었고, 또 일주일 만에 서명 기능이 구현되었습니다. 이후 라이브러리가 OpenSSL을 대체하여 Bitcoin Core에서 사용될 수 있을 때까지는 추가적인 시간과 테스트가 필요했으며, 처음에는 서명 기능에 사용되었습니다.

지갑(버전 0.10, 2015년 출시)과 마지막으로 합의 에서 ECDSA 서명 검증(버전 0.12, 2016년 출시)에 libsecp256k1을 적용했습니다. 이러한 노력은 확실히 가치가 있었습니다. 코어의 PR 설명에 따르면, 서명 검증에 libsecp256k1을 사용하면 "2.5배에서 5.5배 사이" 더 빨라졌습니다. 아이러니하게도, 이는 앞서 언급한 자기동형 최적화가 포함되지 않은 결과였습니다. 특허 침해 우려 때문에 기본적으로 활성화되지 않았기 때문입니다. 이 최적화는 특허가 만료된 후인 2020년(버전 0.20 출시)에야 활성화되었고, 그 결과 약 16%의 추가적인 속도 향상이 이루어졌습니다.

시간이 흐르면서 이 프로젝트에는 여러 다른 기여자들이 참여하게 되었습니다. 자연스럽게 블록스트림에서 처음부터 피터와 긴밀히 협력했던 사람들, 즉 당시 CTO였던 그레고리 맥스웰과 연구원 앤드류 포엘스트라가 포함되었습니다. 2015년에는 요나스 닉이 합류했고, 몇 년 후에는 팀 러핑이 합류했는데, 두 사람 모두 블록스트림의 연구원이었으며 현재 수년 동안 libsecp256k1의 유지 관리자 역할을 맡고 있습니다. 이들은 새로운 암호화 방식을 정의하는 책임을 맡고 있습니다.

(상세한 보안 증명을 포함한) 프로토콜을 설계하고 구현 및 검토를 통해 실제로 적용하는 이들을 팀 러핑이 스스로를 묘사하는 것처럼 "풀스택 암호학자"라고 부르는 것은 매우 적절합니다.

때때로 비트코인 ​​분야 외부의 암호학자들도 기여하기도 합니다.

libsecp256k1. 주목할 만한 예로는 C#/Java 암호화 라이브러리 BouncyCastle의 유지 관리자 중 한 명으로 알려진 Peter Dettman이 있습니다. 그는 오늘날까지도 종종 다양한 성능 개선 제안을 내놓고 있습니다. 그의 주요 공헌 중 하나는 Daniel J. Bernstein과 Bo-Yin Yang의 논문을 기반으로 2021년에 "safegcd" 알고리즘을 사용하여 모듈러 역변환을 구현하여 안전하게 성능을 향상시킨 것입니다.

왜 굳이 바퀴를 새로 발명해야 할까요?

libsecp256k1의 목표는 secp256k1 곡선에 대한 암호화 연산을 위한 최고 품질의 라이브러리를 제공하는 것이며, 주된 목적은 더 넓은 비트코인 ​​생태계에서 유용하게 사용되는 것입니다. 비트코인 ​​코어는 단지 이 라이브러리를 사용하는 주요 클라이언트일 뿐입니다. libsecp256k1의 API는 견고하고 오용하기 어렵도록 설계되어 사용자가 안전하지 않은 연산(예: 자체 암호화 방식 개발)을 수행하여 최악의 경우 자금 손실을 초래하는 것을 방지합니다. 이를 위해 하나의 타원 곡선에만 집중하고 기능을 특정 연산으로 제한함으로써 보안을 강화했습니다.

비트코인 관련 기능(주로 거래 서명 및 검증)에 특화된 libsecp256k1은 다른 구현체에 비해 코드가 더 빠르고 검토가 간편하여 유지보수 부담이 적고 전반적인 품질이 향상됩니다. 또한 C 언어로 작성되었으며 다른 라이브러리에 대한 의존성이 없어 프로젝트 전용으로 작성된 내부 코드 사용합니다. 따라서 하드웨어 지갑에 흔히 사용되는 마이크로컨트롤러와 같은 제약이 있는 장치에서도 원활하게 작동하도록 설계되었습니다.

두 번 재고 한 번 자르세요

libsecp256k1은 아주 초기부터 품질 보증에 중점을 두었으며, 수년에 걸쳐 지속적으로 개선하고 다듬어 왔습니다. 현재 테스트 코드 커버리지가 거의 100%에 달하며, 새로운 모듈은 이 기준을 충족하는 경우에만 병합될 수 있습니다. 또한 "전면 테스트"라는 특별한 형태의 품질 보증도 시행하고 있습니다. 이 테스트는 곡선 상의 가능한 모든 값에 대해 라이브러리의 기능을 실행하는 것을 기본 아이디어로 합니다. 실제 secp256k1 곡선은 약 2^256개의 점으로 구성되어 있어 전체 곡선을 테스트하는 것이 불가능하기 때문에, 훨씬 작지만 매우 유사한 곡선을 사용합니다. 이 곡선은 차수가 두 자릿수 또는 세 자릿수 범위에 불과하여 합리적인 시간 내에 쉽게 실행할 수 있습니다. 테스트의 또 다른 중요한 부분은 상수 시간 동작을 보장하는 것입니다. 이는 아래에서 살펴보겠지만 서명과 관련하여 특히 중요합니다.

슈노르: 완전히 새로운 세상

QA에서 새로운 기능으로 초점을 옮겨보면, 지난 10년간 libsecp256k1과 비트코인 ​​프로토콜 전반에서 가장 중요한 이정표 중 하나는 Schnorr 서명의 도입이었습니다. 2021년 말에 활성화된 Schnorr/Taproot 소프트 포크의 핵심 요소인 Schnorr 서명은 ECDSA 서명에 비해 여러 가지 장점을 제공합니다. 예를 들어, 표준적인 가정 하에서 보안성이 입증 가능 하고, 더 간결하며, 키 및 서명 통합을 통한 효율적인 다중 서명 체계 구축 등 다양한 기능을 제공합니다. BIP340에 명시된 Schnorr 서명 사양과 구현은 현재 libsecp256k1의 세 명의 관리자인 Pieter Wuille, Jonas Nick, Tim Ruffing이 담당했습니다.

libsecp256k1은 노드와 네트워크에 좋습니다.

디지털 서명 검증은 비트 합의 엔진에서 가장 중요하고 보안에 필수적인 코드 경로 중 하나라는 것은 두말할 나위 없습니다. 복잡한 스크립트 경로와 추가적인 지출 조건이 포함된 잠금 스크립트라 할지라도, 결국에는 거래가 실제로 해당 코인의 소유자에 의해 생성되었는지 확인하기 위해 최소한 하나의 서명 검증이 필요합니다. 이처럼 필수적인 작업에 있어서는 코드가 최대한 견고하고, 충분히 테스트되었으며, 성능이 뛰어나야 합니다. 빠른 서명 검증은 빠른 거래 및 블록 전파는 물론, 네트워크에 새로 참여하는 사용자를 위한 초기 블록 다운로드(IBD) 속도 향상에도 매우 중요합니다. 앞서 언급했듯이, 약 10년 전 libsecp256k1이 OpenSSL을 처음으로 대체했을 때 약 5배의 속도 향상이 있었습니다. 시간이 지남에 따라 추가적인 성능 개선 이루어졌고, 최근 조사에 따르면 libsecp256k1은 최신 버전을 사용했을 때 ECDSA 서명 검증에서 OpenSSL보다 약 8배 빠른 것으로 나타났습니다.

서명은 위험할 수 있으니 제대로 하세요.

지금까지 우리는 노드 운영자와 채굴자 의 성능에 가장 중요한 libsecp256k1의 검증 기능에 초점을 맞췄습니다. 하지만 (농담이 아니라) 또 다른 중요한 측면은 서명 , 즉 자금을 사용하기 위한 거래에 디지털 서명을 생성하는 과정입니다. 이 과정이 민감한 이유는 비밀 키 자료가 관련되어 있기 때문입니다. 이 자료가 어떤 식으로든 유출될 경우 최악의 경우 막대한 자금 손실로 이어질 수 있으므로 구현 단계에서 특별한 주의를 기울여야 합니다. libsecp256k1은 데이터 종속 분기, 즉 입력되는 데이터에 따라 다른 코드가 실행되는 경우를 방지함으로써 소위 "사이드 채널 공격"에 대응하려고 합니다. 이는 간단한 작업이 아니며, 최신 컴파일러의 경우 때때로 코드를 최적화하려고 시도하면서 명시적으로 원하지 않는 리소스 절약 분기를 생성하는 등 "지나치게 똑똑한" 경향이 있어 추가적인 노력이 필요합니다. 이는 단순히 이론적인 문제가 아니라 실제로 여러 차례 발생하여 패치를 배포해야 했던 사안입니다(예: 0.3.1 및 0.3.2 릴리스). 중요한 상수 시간 속성은 원래 메모리 문제 디버깅을 위해 개발된 "valgrind"라는 도구를 사용하여 테스트됩니다. 이 도구를 사용하여 비밀 데이터를 처리하는 코드의 분기를 찾아 잠재적인 사이드 채널 위험이 존재하는지 감지할 수 있습니다.

기밀 자료가 유출될 수 있는 또 다른 방법은 의도치 않게 메모리에 자료를 남겨두는 것입니다. 메모리 영역을 덮어쓰기하여 완전히 지우는 것은 간단해 보이지만, 컴파일 과정에서 코드 최적화로 인해 컴파일러가 이를 방해하지 않도록 주의해야 합니다. 이러한 문제가 발생하지 않도록 세심한 주의를 기울입니다.

몇 가지 즐거운 우연

라이브러리 개발 과정에서 예상치 못한 흥미로운 일들이 여러 번 발생했습니다. 2014년, Pieter Wuille와 Gregory Maxwell은 이미 라이브러리를 위한 광범위한 테스트 스위트를 개발하고 있었습니다. 더 높은 수준의 안정성을 확보하기 위한 전략 중 하나는 특수한 난수 입력을 사용하여 라이브러리 내부 함수의 동작을 다른 구현체와 비교 검증하는 것이었습니다. 이 과정에서 OpenSSL이 제곱 연산 시 잘못된 결과를 반환하는 경우가 발견되었는데, 이는 심각한 보안 관련 버그로 CVE-2014-3570("큰 수의 제곱 연산 시 잘못된 결과가 나올 수 있음")으로 보고되었습니다.

몇 년 후, 피터 윌레는 앞서 언급한 모듈러 역행렬 계산 알고리즘인 "safegcd"에 필요한 반복 횟수에 대한 상한(또는 한계)을 계산하는 새로운 방법을 제안했습니다. 이 방법을 통해 해당 상한을 줄여 계산 속도를 향상시킬 수 있었습니다. 하지만 여기서 멈추지 않았습니다. 그레고리 맥스웰은 우연히 번스타인-양 알고리즘의 변형을 발견했는데, 이 변형은 상한이 훨씬 더 낮아 서명과 검증 모두에서 상당한 속도 향상을 가져왔습니다.

“safegcd” 구현의 정확성(즉, 안전성)은 “Rocq”(이전에는 “Coq”라고 불림)라는 특수 정리 증명 소프트웨어와 “Verifiable C” 프로그램 논리를 사용하여 공식적으로 검증되었다는 점을 언급할 가치가 있습니다. 4 이 놀라운 작업은 Russell O'Connor와 Andrew Poelstra가 수행했으며, 그들은 libsecp256k1 전체를 같은 방식으로 검증할 수 있다고 말합니다.

A chart showing libsecp256k1's performance increase against OpenSSL over the years.

암호학은 여전히 ​​진화하고 있습니다.

이제 우리는 libsecp256k1이 비트코인 ​​거래에서 디지털 서명을 생성하고 검증하는 데 주로 사용되며, 가능한 한 가장 안전하고 효율적인 방식으로 이를 수행하도록 세심하게 설계되었음을 보여주었습니다. 하지만 여기서 멈추지 않습니다. secp256k1 곡선에서 암호화 연산을 포함하는 다른 제안(이상적으로는 비트코인 개선 제안 로 공식화됨)이 제시되고 비트코인 ​​생태계 전반에 유익하다고 판단될 경우, 필요한 코드가 라이브러리 범위에 포함될 가능성이 높습니다. 이러한 경우, 구현 및 검토에 충분한 개발 시간이 주어진다면 libsecp256k1 릴리스에 포함될 가능성이 큽니다. 이는 노드 간 P2P 통신 암호화를 활성화하는 데 필수적인 ElligatorSwift 모듈에서 이미 발생한 바 있습니다[BIP324 참조]. [ 여기 에서 자세히 논의됨], 그리고 가장 최근에는 슈노르 서명 기반의 키 집계 방식인 MuSig2를 위한 모듈이 개발되었습니다. MuSig2는 공간 효율적이고 개인정보를 보호하는 방식으로 n-on-n 다중 서명을 생성할 수 있도록 합니다. 또한, 송신자와 수신자 간의 결제 전 상호 작용이 필요 없는 개인정보 보호형 정적 재사용 주소 제안인 Silent Payments를 위한 새로운 모듈 추가 작업도 진행 중입니다. 앞으로 슈노르 서명 일괄 검증, DLEQ 증명, FROST 이더리움 클래식(ETC) 더 많은 기능이 추가될 예정입니다. libsecp256k1의 향후 10년 개발이 어떤 결과를 가져올지 기대해 봅시다!

libsecp256k1에 관심 있는 독자는 프로토타이핑 및 실험을 위해 개발된 secp256k1 곡선의 파이썬 구현체인 secp256k1lab을 살펴보고 사용해 보시기 바랍니다. 5

지금 바로 The Core Issue를 구매하세요!

Core 개발자들이 직접 참여하는 프로젝트를 설명하는 글이 실린 특별 호를 놓치지 마세요 !

이 글은 비트코인 ​​매거진 최신 인쇄판 '핵심 이슈'에 실린 편집자의 편지입니다. 이번 호 전체에서 다루는 아이디어들을 미리 엿볼 수 있도록 공유합니다.

[1] https://gnusha.org/pi/bitcoindev/55B79146.70309@gmail.com/

[2] (#2061, https://github.com/bitcoin/bitcoin/pull/2061 )

[3] https://delvingbitcoin.org/t/comparing-the-performance-of-ecdsa-signature-validation-in-openssl-vs-libsecp256k1-over-the-last-decade/2087?u=thestack

[4] [ https://www.arxiv.org/abs/2507.17956 ]

[5] https://github.com/secp256k1lab/secp256k1lab/

이 글 "핵심 문제: libsecp256k1, 비트코인의 암호화 핵심"은 비트코인 ​​매거진 에 처음 게재되었으며 세바스티안 팔베소너가 작성했습니다.

출처
면책조항: 상기 내용은 작자의 개인적인 의견입니다. 따라서 이는 Followin의 입장과 무관하며 Followin과 관련된 어떠한 투자 제안도 구성하지 않습니다.
라이크
즐겨찾기에 추가
코멘트