용어집 / 주소와 키
NUMS 포인트
- NUMS 포인트란 무엇입니까?
- NUMS 포인트는 아무도 개인 키를 보유하지 않는 공개 키로, 협력적 지출 경로가 불가능하도록 의도한 경우 taproot 내부 키로 사용됩니다.
BIP-341에 명시되어 있습니다.
Nothing Up My Sleeve는 그 속성입니다. 즉, 이 포인트는 공개적이고 반복 가능한 절차로 만들어지므로 아무도 자신이 비밀 키를 안다고 주장할 수 없습니다. BIP-341은 그러한 포인트 하나를 공개하는데, x 좌표 0x50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0이며, 이는 secp256k1 기본점 G의 표준 비압축 인코딩을 해시하여 만들어집니다. 지갑의 경우, 이것이 taproot 출력이 스크립트 전용이 되는 방식입니다. 즉, 조건으로 이루어진 트리를 통해서만 지출할 수 있고 다른 방식으로는 지출할 수 없습니다.
작동 방식
NUMS 포인트는 키가 아니라 해시로 시작합니다.
일반적인 공개 키는 생성점 G에 비밀 숫자를 곱한 것이며, 그 숫자를 고른 사람은 서명할 수 있습니다. NUMS 포인트는 거꾸로 만들어집니다. 고정된 공개 문자열을 가져다 해시하고, 나온 32바이트 다이제스트를 x 좌표로 읽습니다. BIP-341의 예시는 G 자체의 표준 비압축 인코딩을 해시하므로 작성자가 입력값을 조작할 여지가 없습니다. 그 값을 곡선 위의 점으로 올리면 모든 면에서 유효한 공개 키가 되지만 한 가지 예외가 있습니다. 즉, 이에 대한 서명은 이산 로그 문제를 푸는 것을 의미하며, BIP-341은 설계의 보안 한계로 2의 128제곱분의 1을 명시합니다.
나머지는 taproot가 제공합니다. taproot 출력 키는 스크립트 트리의 머클 루트에 커밋하는 tweak에 의해 곡선을 따라 이동된 내부 키 P입니다. BIP-341은 t = hash_TapTweak(p || merkle_root)로 두고, 이어서 Q = P + int(t)G로 정의합니다. 키 경로에서 Q에 대해 서명하려면 P 뒤에 있는 개인 키가 필요하므로, P가 NUMS 포인트일 때 그 경로는 닫히고 스크립트 경로가 유일한 진입 방법이 됩니다. 이러한 지출은 리프 하나와 33 + 32m 바이트의 제어 블록을 드러내며, 여기서 m은 형제 해시의 수이고 BIP-341에 의해 128로 제한됩니다.
알아 둘 만한 누출이 하나 있습니다. 잘 알려진 NUMS 포인트는 보는 즉시 알아볼 수 있으므로, 제어 블록에 이를 그대로 공개하면 키 경로가 처음부터 죽어 있었음을 알리는 셈입니다. BIP-341은 이를 권장하지 않습니다. 즉, 0부터 n에서 1을 뺀 값까지의 범위에서 무작위로 새로운 정수 r을 균일하게 골라 H + rG를 대신 사용하라고 하며, 이는 일반적인 내부 키와 구별되지 않습니다. r을 보관하면, 이를 건네주어 다시 계산하게 함으로써 공동 서명자에게 그 포인트가 NUMS였음을 여전히 증명할 수 있습니다.
확인할 수 있는 곳
NUMS 포인트는 주소에는 결코 나타나지 않고, 스크립트 경로 지출의 증인(witness)에만 나타납니다.
온체인에서 출력은 34바이트이며, OP_1 뒤에 32바이트 푸시가 오는 형태로, 다른 어떤 taproot 출력과도 다르지 않습니다. 내부 키는 제어 블록의 첫 바이트 뒤에 오는 32바이트이므로, 누군가 트리를 통해 지출하는 첫 순간에 드러납니다. 자금이 들어왔지만 스크립트로 지출된 적이 없는 출력은 결코 이를 드러내지 않습니다.
디스크립터는 선택을 명시적으로 만듭니다. BIP-386은 tr() 아래의 모든 키 표현이 x-only일 것을 요구하고 내부 키를 tr(KEY, TREE)에서 맨 앞에 두므로, 그 자리에 있는 NUMS 포인트는 키 경로가 존재하지 않음을 디스크립터가 진술하는 방식입니다. 대칭적인 경우는 트리가 없는 tr(KEY)이며, 여기서 BIP-386은 스크립트 경로가 없는 출력도 지출 불가능한 경로에 여전히 커밋해야 한다는 BIP-341의 조언을 인용합니다.
NUMS 내부 키는 복구가 시드 문구만이 아니라 디스크립터 문자열에 의존하게 만듭니다. 시드는 리프 키를 재현하지만, 그 안에는 트리나 그 위의 포인트를 기록하는 것이 없습니다. Sparrow의 멀티시그 흐름은 디스크립터를 보관하라고 안내하며, 그 지시는 일반적인 키 경로 지갑에서보다 여기서 더 큰 비중을 가집니다.
NUMS 포인트 vs 널 데이터 트랜잭션
NUMS 포인트는 하나의 지출 경로를 닫는 반면, 널 데이터 트랜잭션은 출력을 완전히 지출 불가능하게 만듭니다. OP_RETURN 출력은 설계상 지출 불가능함이 증명됩니다. 즉, 노드는 이를 UTXO 집합에서 제거하고 여기에 배정된 모든 가치는 소각됩니다. NUMS 내부 키 뒤에 있는 코인은 소각되지 않습니다. 스크립트 트리의 모든 조건을 통한 지출은 여전히 정상적으로 이루어집니다. 두 경우가 공유하는 단어는 지출 불가능이라는 말이며, 한 경우에는 출력 전체를, 다른 경우에는 단일 분기를 가리킵니다.