용어집 / 주소와 키
압축 공개 키
- 압축 공개 키란 무엇입니까?
- 압축 공개 키는 곡선 위 점의 x 좌표와 1바이트의 패리티 플래그만 저장하여, 완전한 공개 키를 65바이트 대신 33바이트에 담습니다.
secp256k1의 모든 점은 주어진 x에 대해 가능한 y 값이 두 개이므로, 그중 어느 것인지 기록하는 데는 32바이트가 아니라 1바이트만 들며, 지갑은 2012년 3월에 공개된 Bitcoin Core 0.6부터 기본적으로 압축 키를 생성해 왔고, 절약된 바이트는 나중에 지출하는 모든 입력의 크기에서 빠집니다. 지출 비용이 낮아지는 것이 이득의 전부이며, 이 형식은 일상적인 사용에서는 보이지 않습니다.
작동 방식
공개 키 압축은 데이터 압축이 아니라 대수학입니다. 곡선 방정식, 즉 y의 제곱은 x의 세제곱 더하기 7과 같다는 식은 주어진 x에서 y에 대한 해가 최대 두 개이며, 그 두 해는 항상 하나는 짝수이고 하나는 홀수입니다. 따라서 x와 어느 해가 해당하는지에 대한 1비트의 정보를 저장하면, 누구든지 방정식을 풀고 패리티가 맞는 근을 선택하여 그 점을 정확히 복원할 수 있습니다.
인코딩은 그 비트를 선행 바이트에 넣습니다. 접두사 0x02는 y 값이 짝수임을, 0x03은 홀수임을 뜻하며, 뒤따르는 32바이트가 x 좌표입니다. 전체 길이는 33바이트입니다. 예전 형식은 0x04 접두사로 자신을 알리고 두 좌표를 모두 그대로 담아 65바이트입니다. 키를 읽는 소프트웨어는 첫 바이트만으로 둘을 구별할 수 있으며, 지갑이 전환 기간에 호환성을 유지한 방식이 바로 이것입니다.
절약되는 32바이트는 출력 유형에 따라 서로 다른 곳에 반영됩니다. 레거시 입력에서는 키가 잠금 해제 스크립트에 들어가 전체 가중치로 계산되므로, 32바이트는 32v바이트의 비용이 들며, 20 sat/vB의 수수료율에서 약 640사토시입니다. SegWit 입력에서는 키가 위트니스에 들어가 4분의 1로 할인되므로, 같은 32바이트의 비용은 8v바이트입니다. 어느 수치도 그 자체로는 큰 차이가 아니며, 둘 다 앞으로 서명하는 모든 트랜잭션의 모든 입력마다 반복됩니다.
확인할 수 있는 곳
압축 키는 원시 트랜잭션 데이터에서 만납니다. 블록 탐색기에서 최근의 지출을 아무거나 열면 위트니스나 스크립트의 공개 키가 02 또는 03으로 시작하고 그 뒤에 64개의 16진수 문자가 이어집니다. 04로 시작하는 키는 유물입니다.
이 형식은 주소의 모양도 결정합니다. 압축 키를 해시하면 같은 키의 압축되지 않은 버전을 해시한 결과와 다르므로, 하나의 개인 키가 잔액이 따로 있는 완전히 별개의 레거시 주소 두 개에 대응할 수 있습니다. 지갑은 이를 요령이 아니라 관례로 처리합니다. BIP-32를 통해 파생되는 모든 것, 즉 통상 사용되는 모든 시드 문구 지갑을 포괄하는 것은 처음부터 끝까지 압축되어 있으며, K 또는 L로 시작하는 Wallet Import Format 문자열은 그 키가 그 분기의 압축된 쪽에 속함을 알립니다.
SegWit은 그 모호함을 완전히 없앴습니다. BIP-143은 버전 0 위트니스 프로그램 안에서 압축되지 않은 키를 금지하므로, 모든 bc1q 주소는 규칙상 압축되어 있으며, Taproot는 패리티 바이트를 아예 없앤 x 전용 32바이트 키를 정의하여 한 걸음 더 나아갔습니다.
압축 공개 키 vs 압축되지 않은 공개 키
압축 형식과 압축되지 않은 형식은 같은 점을 인코딩하며, 차이는 무엇을 기록해야 하는지뿐입니다. 압축 형식은 x를 보관하고 필요할 때 y를 도출하므로, 몇 마이크로초의 연산이 들고 32바이트를 영구히 절약합니다. 압축되지 않은 형식은 y를 그대로 저장하므로 2009년의 하드웨어에서는 연산을 절약했지만 지금은 아무것도 얻지 못합니다. 두 바이트 문자열이 다르기 때문에 서로 다른 주소로 해시되며, 바이트 수보다는 이 불일치가 아주 오래된 지갑의 자금이 간혹 묶이게 되는 원인입니다.