용어집 / 트랜잭션과 수수료
PSBT
별칭은 Partially Signed Bitcoin Transaction, BIP174, 부분 서명 비트코인 트랜잭션입니다.
- PSBT란 무엇입니까?
- PSBT는 아직 완성되지 않은 트랜잭션 파일입니다. 이 파일은 입력, 출력, 그리고 서명자가 이를 검증하는 데 필요한 모든 정보를 담고 있으며, 네트워크를 거치지 않고 기기 사이를 오갑니다.
BIP-174에 명시되어 있습니다.
예전에는 비트코인에 서명한다는 것이 트랜잭션을 만든 프로그램에 개인 키를 넘기는 일이었습니다. BIP174는 2018년에 이를 분리했고 Bitcoin Core는 버전 0.17.0에서 지원을 내놓았으며, 그래서 키를 보관하는 기기와 인터넷에 연결된 기기가 서로 다른 기기일 수 있습니다. 이제 모든 하드웨어 지갑과 멀티시그 조정자는 이 형식을 지원합니다.
작동 방식
PSBT는 키-값 맵의 컨테이너입니다. 조립 중인 트랜잭션을 설명하는 전역 맵 하나, 그다음 각 입력마다 맵 하나, 각 출력마다 맵 하나가 있습니다.
파일은 다섯 개의 매직 바이트 70 73 62 74 ff로 시작하며, 이는 "psbt"와 구분자를 나열한 것입니다. 옮기는 일반적인 방법은 Base64이므로, 텍스트 상자에 붙여 넣은 PSBT는 항상 cHNidP8 문자로 시작합니다. 다른 방식으로 시작하는 문자열은 보낸 사람이 무엇이라고 말하든 PSBT가 아닙니다.
각 입력 맵에는 오프라인 서명자가 스스로 조회할 수 없는 정보가 담깁니다.
- 지출되는 출력, 그래서 기기가 자신이 승인하는 정확한 금액과 잠금 스크립트를 압니다
- 코인이 단일 키가 아니라 정책 뒤에 있을 때의 리딤 스크립트 또는 위트니스 스크립트
- 서명해야 하는 모든 키의 파생 경로와 마스터 키 지문, 그래서 올바른 시드를 가진 기기가 올바른 하위 키를 찾을 수 있습니다
- 지금까지 모인 부분 서명, 서명자마다 하나씩
출력 맵에도 파생 정보가 담기며, 이것이 서명자가 잔돈 출력이 정말로 자신이 보호하는 지갑에 속하는지 확인할 수 있게 합니다.
BIP174는 작업을 프로그램이 아니라 역할로 나눕니다. 생성자는 뼈대를 만들고, 갱신자는 입력 세부 정보를 채우며, 서명자는 부분 서명을 추가하고, 결합자는 따로 서명된 파일을 병합하며, 완결자는 부분 서명을 유효한 스크립트 또는 위트니스로 바꾸고, 추출자는 브로드캐스트할 준비가 된 원시 트랜잭션을 만듭니다. 소프트웨어 하나가 여러 역할을 동시에 맡는 경우가 많지만, 다른 업체의 파일이 서로 호환되는 이유는 바로 이 분리입니다.
이 형식은 무지를 견디도록 설계되었습니다. 모든 필드에는 유형 바이트가 붙고, 필드를 이해하지 못하는 서명자는 그것을 버리지 않고 그대로 통과시켜야 하며, 2018년에 작성된 지갑이 Taproot용으로 작성된 지갑에 파일을 건넬 수 있는 것도 이 때문입니다. BIP371은 Taproot 필드를 추가했고, BIP370은 생성 후에도 입력과 출력을 추가할 수 있는 버전 2를 정의하며, 이는 협력 트랜잭션에 필요한 속성입니다.
비트코인을 구매할 때 이것이 중요한 이유
거래소에서 코인을 자신의 하드웨어 지갑으로 옮기는 순간, 화면에 그렇게 표시되든 아니든 PSBT 형식을 쓰고 있습니다.
키를 컴퓨터 밖에 둡니다. 노트북이 지출을 만들고 PSBT를 생성하며, Trezor나 Ledger가 그것을 읽고 내용을 보여 주고 서명한 뒤 돌려줍니다. 어떤 비밀도 케이블을 건너지 않습니다. 그것이 침해된 노트북, 즉 견딜 수 있는 상황과 침해된 시드 문구, 즉 견딜 수 없는 상황의 차이입니다.
잔돈 주소 바꿔치기를 막습니다. 컴퓨터를 장악한 악성코드는 정직한 결제 화면을 띄우면서 잔돈을 자신이 보유한 주소로 조용히 돌릴 수 있고, 잔돈은 보통 더 큰 금액입니다. 파일이 모든 출력의 파생 경로를 명시하므로, 서명 기기는 잔돈이 자신의 시드에서 파생되었는지 확인하고 그렇지 않을 때 경고할 수 있습니다. 브라우저 탭이 아니라 기기 화면을 읽으십시오.
엔지니어가 아닌 사람도 멀티시그를 쓸 수 있게 합니다. 하드웨어 지갑 두 개와 다른 건물의 백업에 나눠 둔 2-of-3 구성은 서명되지 않은 트랜잭션이 아무것도 유출하지 않고 SD 카드, QR 코드, 또는 이메일로 이동할 수 있을 때만 작동합니다. PSBT에는 개인 키가 없으므로, 이동 중에 하나를 잃어도 손실은 전혀 없습니다.
상속인이 필요로 할 조각입니다. 시드 단어가 든 봉투는 단일 키 지갑보다 복잡한 무엇에도 복구 계획이 아닙니다. 시드와 함께 지갑의 출력 디스크립터, 그리고 PSBT를 읽는 소프트웨어를 명시한 메모를 두면 그 계획은 사용자보다 오래갑니다. 나머지 설정은 이 사이트의 보안 가이드에서 다룹니다.
2-of-3 출금에 서명하는 단계별 과정
거래소에서 0.4 BTC를 구매하고 세 개의 키로 제어되며 그중 어느 두 키로든 지출할 수 있는 보관소로 출금한다고 가정합니다.
몇 달 뒤 그중 일부를 옮기려 합니다. 보관소의 디스크립터로 채워지고 키는 전혀 없는 노트북의 조회 전용 지갑이 트랜잭션을 만듭니다. 입력 하나, 결제 출력 하나, 잔돈 출력 하나입니다. 2-of-3 네이티브 segwit 입력은 약 105 가상 바이트이고 두 출력은 약 62 가상 바이트가 더 들므로, 오버헤드를 포함하면 전체는 177 가상 바이트에 가까워지고, 8 sat/vB에서 수수료는 대략 1,400 사토시가 됩니다.
노트북이 PSBT를 작성합니다. 첫 번째 하드웨어 지갑을 연결하면 파일을 읽고 수취인, 금액, 수수료를 표시한 뒤 입력 맵에 서명 하나를 기록합니다. 그다음 파일을 microSD 카드에 담아 네트워크에 한 번도 접속한 적 없는 두 번째 기기로 옮기면, 그 기기가 두 번째 서명을 추가합니다.
다시 노트북에서 결합자가 두 파일을 병합하고, 완결자가 서명을 스크립트가 기대하는 순서대로 위트니스로 조립하며, 추출자가 원시 트랜잭션을 만듭니다. 그제야 무언가가 네트워크에 도달합니다. 그 순간까지 어떤 키도 기기를 떠나지 않았고, 사용자가 한 어떤 것도 누구에게도 보이지 않았습니다.
PSBT vs 직렬화된 트랜잭션
직렬화된 트랜잭션은 완성되어 있고, PSBT는 작업 공간입니다. PSBT를 브로드캐스트하면 모든 노드가 거부합니다. 피어 투 피어 프로토콜이 전달하는 형식이 아니기 때문입니다. 차이는 반대 방향으로도 있습니다. PSBT에는 완성된 트랜잭션이 버리는 맥락, 예컨대 지출되는 각 입력의 값과 각 주소를 파생한 키가 담기며, 이것이 바로 하드웨어 지갑이 필요로 하고 블록은 필요로 하지 않는 정보입니다.
PSBT vs 출력 디스크립터
출력 디스크립터는 지갑을 설명하고, PSBT는 지출 하나를 설명합니다. 디스크립터는 스크립트 유형, 키, 파생 경로를 명시한 한 줄이며 해가 바뀌어도 변하지 않습니다. PSBT는 일회용으로, 트랜잭션마다 하나입니다. 단일 키 지갑에서는 시드 문구만으로 모든 것을 복구하지만, 멀티시그에서는 둘 다 필요합니다. 어떤 주소가 자신의 것인지 알아내는 디스크립터와, 그 주소에서 무언가를 옮기는 PSBT입니다.