키스톤이 서명을 못 할 때
지갑에서 QR 을 띄웠는데 키스톤이 빨간 얼굴을 띄우거나, 아예 반응하지 않는 경우입니다. 원인은 대개 셋 중 하나이고, 오류 메시지만 보면 어느 쪽인지 갈립니다.
어느 쪽인지 고르세요
키스톤에서 서명이 막히는 경우는 겉보기엔 비슷해도 원인이 완전히 다릅니다. 화면에 뜬 문구로 갈라집니다.
“Incongruent Transaction”
Incongruent Transaction The transaction doesn't belong to the current wallet. Please check the transaction information.
기기가 실제로 하는 일
키스톤은 받은 PSBT 안의 입력을 하나씩 보면서 “이 중에 내가 서명할 수 있는 것이 있나” 를 찾습니다. 그 판단은 PSBT 의 BIP32_DERIVATION 필드로 합니다. 거기에는 입력마다 세 가지가 들어 있습니다.
- 마스터 지문 — 이 지갑의 씨드가 무엇인지 가리키는 4바이트
- 파생 경로 —
m/84'/0'/0'/0/5같은 위치 - 공개키 — 그 위치에서 나와야 할 값
셋 중 하나라도 자기 것과 어긋나면 기기는 그 입력을 남의 것으로 봅니다. 전부 남의 것이면 서명할 게 없으니 이 메시지를 띄웁니다. 그래서 이 오류는 “QR 을 잘못 읽었다”가 아닙니다. QR 은 제대로 읽혔고, 내용을 이해한 다음에 거절한 것입니다. 그 구분이 중요합니다 — 읽기 문제라면 애초에 파싱 오류가 떴을 겁니다.
확인 순서
위 셋을 순서대로 지워 나가는 것이 가장 빠릅니다.
- 계정 유형이 맞나. 지갑에서
m/84'(bc1q 로 시작) 계정을 골랐는데 키스톤에 등록된 것이m/49'(3 으로 시작)이면 경로가 어긋납니다. 가장 흔한 경우고, 확인이 제일 쉽습니다 — 지갑에 뜨는 첫 주소와 키스톤의 첫 주소가 같은지 보세요. - 패스프레이즈를 쓰고 있나. 패스프레이즈를 넣으면 완전히 다른 지갑이 됩니다. 연동할 때 넣었던 상태와 지금 기기 상태가 같아야 합니다.
- 기기에 씨드가 여러 개인가. 키스톤은 지갑을 여러 개 둘 수 있습니다. 화면 왼쪽 위에 지금 열린 지갑 이름이 뜹니다. 연동할 때 쓴 그 지갑인지 확인하세요.
- 지갑 소프트웨어가 지문을 잘못 넣고 있나. 위 셋이 다 맞는데도 계속 그렇다면 이쪽입니다. 아래에서 따로 다룹니다.
이 사이트에서 만든 PSBT 를 키스톤에 찍었더니 정확히 이 오류가 났습니다. 계정도 맞고 패스프레이즈도 없고 지갑도 하나뿐이었는데요. 원인은 PSBT 를 만드는 쪽의 버그였습니다.
지문의 바이트 순서 — 만드는 쪽이 틀리기 쉬운 자리
BIP174 는 파생 경로 원소를 32비트 리틀엔디언으로 쓰라고 명시합니다. 그런데 바로 앞에 붙는 마스터 지문은 그냥 “BIP32 가 정의한 마스터 키 지문” 이라고만 합니다. BIP32 의 지문은 숫자가 아니라 hash160 의 앞 4바이트 — 즉 바이트 순서 그대로입니다.
같은 필드 안에서 앞부분과 뒷부분의 규칙이 다릅니다. 공식 시험값을 보면 분명합니다.
… a5877110 | d90c6a4f | 00000080 | 00000080 | 04000080 …
공개키 끝 지문 경로 경로 경로
(그대로) (뒤집힘) (뒤집힘) (뒤집힘)지문 d90c6a4f 는 뒤집히지 않고, 경로 00000080 은0x80000000(= 하드닝된 0) 이 뒤집힌 것입니다.
지문까지 같이 뒤집으면 기기가 찾는 값과 달라집니다. 우리 경우 지갑 지문이 37b5eed4 였는데 d4eeb537 로 나갔습니다. 키스톤은 자기 지문을 못 찾았으니 “내 지갑 것이 아니다” 라고 판단한 것입니다.
고친 뒤 같은 트랜잭션을 다시 찍으니 바로 Confirm Transaction 이 떴습니다. 금액도 보내는 주소들도 정확히 맞았습니다.
PSBT 를 base64 로 뽑아서 BIP32_DERIVATION 값을 보면 됩니다. 기기 설정 화면에 뜨는 마스터 지문(보통 8자리 16진수)과 PSBT 안의 4바이트가 같은 순서로 들어 있어야 합니다. 뒤집혀 있으면 지갑 소프트웨어의 문제고, 님이 고칠 수 있는 것이 아닙니다 — 다른 지갑으로 만들어 보시거나 제작사에 알리세요.
QR 이 끝없이 돌거나, 기기가 버티지 못할 때
오류 문구 없이 QR 이 계속 돌기만 하거나, 기기가 멈추거나, 스캔이 끝나지 않는 경우입니다. 오류가 아니라 용량 문제일 때가 많습니다.
왜 커지나
적립식으로 몇 년 모으면 UTXO 가 수백 개가 됩니다. 한 번에 옮기려 하면 그 수백 개가 전부 한 트랜잭션에 들어가고, 기기 메모리를 넘깁니다.
그런데 개수보다 형식이 문제인 경우가 더 많습니다. 지갑이 레거시(P2PKH) 방식으로 PSBT 를 만들면 입력마다 앞선 트랜잭션 전체를 같이 넣어야 합니다. 세그윗은 금액만 넣으면 되고요. 같은 100개라도 이 차이로 크기가 수십 배 갈립니다.
- 세그윗 입력 100개 — 대략 13 KB
- 레거시 입력 100개 — 1 MB 를 넘길 수 있음
그래서 “나눠 보내세요” 보다 먼저 볼 것은 지갑 설정입니다. 형식만 바꿔도 나눌 필요가 없어지는 경우가 흔합니다.
순서
- 왜 커졌는지 가려냅니다 — 개수인지 형식인지
- 형식 문제라면 그것만 고칩니다
- 정말 개수 문제라면, 기기가 몇 개까지 견디는지 재고 나눕니다
3번에서 추측하면 안 됩니다. 같은 기기라도 펌웨어와 입력 형식에 따라 한계가 움직입니다. 실제로 재보는 것이 유일하게 확실한 방법입니다.
지갑 연동 QR 이나 서명이 안 되는 PSBT 를 넣으면 왜 터지는지 진단하고, 나눠야 한다면 몇 개씩인지 계산합니다. 서명할 PSBT 도 여기서 바로 만들 수 있습니다.
UTXO 통합 진단 열기QR 을 아예 못 읽을 때
기기가 반응조차 없다면 내용이 아니라 전달 자체의 문제입니다.
- 형식이 다릅니다. 키스톤은 PSBT 를
ur:crypto-psbt형식으로 받습니다. 그냥 base64 텍스트를 QR 로 만들어 보여주면 읽지 못합니다. - QR 이 너무 촘촘합니다. 한 장에 많이 담으면 모듈이 작아져 카메라가 못 잡습니다. 여러 장으로 나눠 돌리는 쪽이 오히려 빠릅니다.
- 화면이 너무 밝거나 어둡습니다. 모니터 밝기를 낮추고 지문 자국을 닦아 보세요. 의외로 이것으로 해결되는 경우가 많습니다.
- 애니메이션이 너무 빠릅니다. 장수가 많은데 빠르게 넘기면 놓친 장을 계속 기다립니다. 속도를 늦춰 보세요.
microSD 카드를 쓸 수 있다면 그쪽이 확실합니다. QR 은 편하지만 큰 트랜잭션에서는 카드가 낫습니다.
서명은 됐는데 거기서 막힐 때
키스톤이 서명을 마치면 QR 을 하나 띄웁니다. 그런데 그것은 완성된 트랜잭션이 아니라 서명이 채워진 PSBT 입니다. 네트워크에 보내려면 그 서명을 scriptSig·witness 로 조립하는 단계가 한 번 더 필요하고, 보통은 연동 지갑이 그 일을 합니다.
그래서 “서명은 됐는데 어디로 보내야 할지 모르겠다” 는 상태가 생깁니다. 서명을 손에 들고도 지갑을 한 번 더 거쳐야 하는 겁니다.
서명된 PSBT 를 넣으면 완성해서 브로드캐스트할 수 있는 트랜잭션으로 만듭니다. 개인키는 관여하지 않습니다 — 이미 들어 있는 서명을 조립할 뿐이고, 그 서명이 실제로 맞는지도 따로 검증해 보여줍니다.
서명 후 트랜잭션 도구어느 경우든 지켜야 할 것
- 씨드 문구를 어떤 화면에도 입력하지 마세요. 서명이 안 된다고 해서 씨드를 넣어야 하는 상황은 없습니다. 그걸 요구하는 곳은 전부 탈취입니다.
- 기기 화면에 뜬 금액과 주소를 눈으로 확인하세요. PSBT 를 만든 것이 어떤 프로그램이든, 마지막으로 믿을 것은 기기 화면입니다. 그게 하드웨어 지갑을 쓰는 이유입니다.
- 큰 금액을 옮기기 전에 작게 한 번 해보세요. 전 과정이 도는 것을 확인한 뒤에 나머지를 옮기는 편이 안전합니다.