Output Descriptor는 어떤 키와 규칙으로 Bitcoin 출력을 만들지 설명하는 텍스트입니다. 출력은 금액과 나중에 그 자금을 쓰기 위한 조건이 담긴 기록을 뜻합니다. 올바른 주소를 다시 만들고 관련 지급 내역을 찾는 데 도움이 됩니다. 그 자체가 거래나 완전한 백업은 아니며, 공개 정보만 담을 수도 있고 비밀 키를 포함할 수도 있습니다.
안나는 하드웨어 지갑을 확인하는 앱을 바꾸려 합니다. 컴퓨터에 복구 단어를 입력하지 않고 자금을 조회하는 기능만 옮기고 싶습니다. 이 복구 단어들의 순서를 Seed Phrase라고 하며, 지갑의 키를 복구하는 데 쓰는 백업입니다. 공개 descriptor는 새 앱에 어떤 공개 키를 사용해 같은 주소를 만들면 되는지 알려 줍니다. 새로운 암호라기보다 주소를 만드는 정확한 설명서라고 생각하면 됩니다. 일반적인 지갑은 프로그램이 표준 설정을 알아서 찾는 경우도 많습니다. 하지만 특수한 구성이나 Multisig (여러 서명 키를 사용하는 지갑 구성)라면 추측에만 의존할 수 없습니다. Descriptor는 돈을 보내거나 이미 받은 지급 내역을 바꾸지 않습니다. 복구할 때 유지해야 할 규칙을 설명할 뿐입니다. [1] [8]
개인 키는 자금 사용을 승인하는 디지털 서명을 만들 수 있습니다. 공개 키는 그 서명을 검증할 수 있지만 만들 수는 없습니다. 공개 descriptor에는 서명할 수는 없지만 추가 공개 키를 파생할 수 있는 데이터인 xpub가 들어갈 수 있습니다. 지급 내역만 살펴보고 스스로 송금하지 못하는 Watch-only Wallet에 적합합니다. 그래도 개인정보 보호를 위해 잘 보관해야 합니다. 여러 주소와 그 이력을 서로 연결할 수 있기 때문입니다. 다른 descriptor에는 확장 개인 키인 xprv나 개별 개인 키의 인코딩인 WIF가 들어갈 수 있습니다. 이는 해당 조건이 충족되면 자금을 쓸 수 있게 하는 비밀 자료입니다. 온라인 검사 사이트에 보내거나 별것 아닌 메모처럼 저장하지 마세요. 공개 구성은 서명에 필요한 백업을 대신하지 않습니다. [1] [8]
가져오기가 끝나면 안나는 여러 수신 주소를 원래 지갑의 주소와 비교합니다. 하드웨어 지갑은 제조사 절차에 따라 신뢰할 수 있는 기기 화면에서 주소를 확인합니다. 결제 후 남은 금액을 돌려받는 잔돈 분기의 설정도 확인합니다. 계정 이름이 같다는 것만으로는 부족합니다. 새 백업을 믿고 사용하기 전에, 비밀 키를 불필요하게 노출하지 않는 방식으로 자신의 지갑에 맞는 전체 복구 절차를 점검합니다. 앱이 descriptor를 지원하지 않거나 다른 주소를 표시하면 먼저 호환성, 네트워크, 설정을 확인해야 합니다. 익숙하지 않은 표현식을 짐작으로 고치는 것은 안전한 해결책이 아닙니다. [5] [8]
세 키 중 두 개의 서명이 필요한 지갑에서는 복구 단어 두 묶음과 ‘셋 중 둘이었다’는 기억만으로 부족합니다. 올바른 사용 조건을 다시 만들려면 세 키 모두의 공개 데이터, 파생 규칙, 정확한 스크립트 유형이 필요합니다. 스크립트는 자금을 쓰려면 충족해야 하는 조건을 담고 있습니다. 기술 표기 multi(k,...)는 적힌 키 순서를 사용하며, k는 필요한 서명 수입니다. sortedmulti(k,...)는 스크립트를 만들 때마다 파생된 공개 키를 바이트 순서로 정렬합니다. 두 표기는 서로 다른 규칙이며 이름만 바꿔 쓸 수 없습니다. 따라서 서명에 필요한 키의 백업은 별도로 보호하면서 완전한 구성 내보내기도 보관해야 합니다. 기기 이름 목록만으로는 충분하지 않습니다. [2] [8]
# 뒤에는 BIP380에 정의된 checksum, 즉 체크섬 여덟 글자가 붙을 수 있습니다. 프로그램은 이를 이용해 많은 복사 오류를 찾아냅니다. 하지만 작성자의 서명도, 암호화도, descriptor가 내 것이라는 증명도 아닙니다. 의도적으로 자신의 키로 바꾼 사람은 새로운 올바른 체크섬도 계산할 수 있습니다. 따라서 문자열 검사와 함께 주소와 구성의 출처를 확인해야 합니다. 앱이 체크섬 오류를 알리면 먼저 원본 내보내기를 다시 확보하세요. 체크섬만 새로 만들면 이미 잘못된 텍스트에 맞는 검사값을 붙이는 데 그칠 수 있습니다. [1]
키 앞에는 [fingerprint/path]라는 key origin, 즉 키 출처 정보가 올 수 있습니다. Fingerprint는 출발점 키의 짧은 식별자이고, path는 뒤에 적힌 키까지 파생한 경로입니다. 서명 기기가 올바른 키를 찾는 데 도움이 됩니다. xpub 뒤에는 개별 주소를 파생하기 위한 다른 경로가 올 수도 있습니다. 두 부분의 역할은 다르며 단순한 계정 이름표가 아닙니다. 서로 다른 키가 우연히 같은 fingerprint를 가질 수 있으므로 이것만으로 기기를 인증할 수도 없습니다. 공개 내보내기는 개인 키 정보가 필요한 단계인 Hardened Derivation을 임의로 지나갈 수 없습니다. 내보내는 앱에서 적절한 단계의 키를 선택해야 합니다. [1]
/*의 별표는 0, 1, 2처럼 번호를 차례로 대입한다는 뜻입니다. 이런 ranged descriptor는 주소 하나만 설명하지 않습니다. 실제 작업에서는 프로그램이 처리할 인덱스 범위를 정합니다. 앱이 지원한다면 BIP389의 <0;1> 표기로 보통 수신과 잔돈에 쓰는 두 분기를 함께 나타낼 수 있습니다. 그러나 descriptor 자체는 이미 사용한 주소 목록이나 다음 빈 번호를 기록하지 않습니다. 한 번도 사용하지 않은 주소가 몇 개 연속 나오면 검색을 멈출지 정하는 gap limit도 표현식에 자동으로 포함되지 않습니다. 미사용은 거래 이력이 없다는 뜻입니다. 돈을 받았다가 나중에 모두 보낸 주소는 미사용 주소로 세지 않습니다. 따라서 복구할 때는 지갑 상태도 옮기고 충분히 넓은 범위를 검색해야 할 수 있습니다. [5] [6] [9]
거래 출력에는 나중에 그 출력을 쓰기 위한 조건을 정한 스크립트인 scriptPubKey가 들어 있습니다. Descriptor는 이것을 만드는 방법을 알려 줍니다. wpkh(KEY)는 키 하나를 쓰는 Native SegWit을 나타내며, 여기서 KEY는 실제 키가 아닌 자리 표시자입니다. 이를 sh(wpkh(KEY))로 감싸면 키가 그대로여도 출력 형식과 주소가 달라집니다. pk(), pkh(), wsh(), addr(), raw() 같은 표현식도 있지만 서로 바꿔 쓰는 선택지는 아닙니다. 예를 들어 addr()는 알려진 주소를 설명할 뿐, 자금을 쓰는 데 빠진 정보를 보충해 주지 않습니다. 이 절은 설정을 위한 참고 자료이지, 초보자가 descriptor를 직접 작성해야 한다는 뜻이 아닙니다. [1] [8]
Taproot 출력은 키 서명으로 사용할 수 있습니다. 스크립트 조건이 포함되어 있다면 그 조건에 따라 사용할 수도 있습니다. tr(KEY)는 사용 가능한 스크립트 분기 없이 내부 키를 지정하고, tr(KEY,TREE)는 스크립트 트리를 추가합니다. 따라서 보관할 것은 키 목록만이 아닙니다. 트리에서 스크립트를 어떻게 묶었는지도 중요합니다. 묶음을 바꾸면 개별 조건은 같아도 전체 해시인 Merkle root와 최종 주소가 달라질 수 있습니다. 다만 모든 분기 맞바꿈이 결과를 바꾸는 것은 아닙니다. Miniscript는 조건을 표현하고 분석하는 데 도움을 주며, multi_a는 Taproot의 스크립트 언어인 Tapscript에서 여러 서명을 표현합니다. 어느 쪽도 완전한 구성 내보내기를 그 자체로 대신하지 못합니다. [3] [8]
RPC는 다른 프로그램이나 명령줄에서 소프트웨어에 명령을 전달하는 인터페이스입니다. Bitcoin Core 29의 RPC 명령 getdescriptorinfo는 표현식을 분석합니다. 개인 키가 없는 공개 형태와 checksum, isrange, issolvable, hasprivatekeys 필드를 반환합니다. 마지막 필드는 입력에 개인 키가 들어 있었는지를 뜻합니다. issolvable은 서명에 필요한 비밀 키를 내가 갖고 있다는 뜻이 아닙니다. deriveaddresses로 파생 주소를 비교할 수 있습니다. 가져올 때 importdescriptors는 timestamp, active, internal, range, next_index도 받습니다. 차례로 이력 검색의 시작 시각, 구성의 활성 여부, 내부 잔돈용 여부, 범위, 다음 주소 번호를 뜻합니다. Rescan은 체인에서 거래를 다시 찾는 작업입니다. timestamp가 너무 늦으면 오래된 지급 내역을 놓칠 수 있지만 descriptor 변경만으로 그 자금이 이동하거나 사라지지는 않습니다. 가져오기 후에는 지갑을 새로 백업해야 합니다. 이 명령은 본인의 신뢰할 수 있는 설치 환경에서 사용해야 하며 다른 사람의 웹 입력란에 넣어서는 안 됩니다. [5] [7] [8]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 지갑, Watch-only Wallet, Multisig, PSBT, Miniscript, Bitcoin. 다음 항목에서도 이 글을 참조합니다 Watch-only Wallet, Extended Public Key (xpub), PSBT, 자기 수탁.