피드로 돌아가기
Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain
Dev.toDev.to
Security

의존성 최소화로 구현한 60라인 규모의 BIP340 Schnorr 서명 시스템

Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain

Sai2026년 4월 17일13intermediate

Context

기존 Nostr SDK들의 과도한 의존성(40MB+)과 플랫폼별 빌드 호환성 문제로 인한 배포 복잡성 발생. BIP340 표준의 특수성으로 인해 일반적인 ECDSA 라이브러리를 사용할 수 없는 기술적 제약 존재.

Technical Solution

  • libsecp256k1의 C 구현체를 직접 래핑한 coincurve 채택을 통한 constant-time BIP340 서명 보장
  • compressed public key에서 0x02/0x03 접두사를 제거한 x-only 32-byte 포인트 추출 구조 설계
  • BIP340의 even-y normalization 로직을 내장한 PrivateKey.sign_schnorr 활용으로 서명 유효성 확보
  • NIP-01 명세에 따른 공백 제거 및 UTF-8 인코딩 기반의 Canonical Serialization 프로세스 구현
  • SDK 없이 SHA-256 해시와 websocket-client만으로 구성된 초경량 Publisher 루프 구축

Impact

  • 과도한 전이 의존성(transitive dependencies)을 제거하여 40MB 규모의 SDK를 60라인의 순수 Python 코드로 대체

Key Takeaway

표준 명세(NIP-01, BIP340)가 명확한 경우, 무거운 SDK보다 핵심 원칙에 기반한 Minimal Implementation이 시스템 안정성과 유지보수성에 유리함.


- BIP340 적용 시 일반 ECDSA 라이브러리 대신 libsecp256k1 기반 래퍼 사용 여부 확인 - x-only public key 추출 시 compressed form의 첫 바이트 제거 방식을 통한 일관성 유지 - JSON 직렬화 시 ensure_ascii=False 설정 및 구분자 공백 제거를 통한 Canonical form 준수 확인

원문 읽기