본문으로 건너뛰기
buybitcoinsmart

용어집 / 트랜잭션과 수수료

직렬화된 트랜잭션

별칭은 원시 트랜잭션입니다.

직렬화된 트랜잭션이란 무엇입니까?
직렬화된 트랜잭션이란 지갑이 네트워크에 넘기는 정확한 바이트열, 즉 모든 노드가 단 1바이트도 바꾸지 않고 파싱하고 해시하며 중계하는 16진수 형식입니다.

BIP-144에 명시되어 있습니다.

트랜잭션에서 사용자에게 친숙한 모든 것, 곧 주소와 현지 통화로 표시된 금액, 라벨은 지갑이 덧붙이는 장식일 뿐입니다. 실제로 이동하는 것은 압축된 이진 데이터 덩어리로, 단순한 결제라면 보통 200~250바이트이며 완전히 자기 완결적입니다. 오프라인 컴퓨터에서 그 16진수 문자열을 복사해 인터넷에 연결된 아무 컴퓨터로 옮기면 그곳에서 결제를 브로드캐스트할 수 있습니다.

작동 방식

직렬화는 필드 이름이 없는 고정된 순서이므로, 파서는 전적으로 위치와 길이 접두사에 의존합니다.

데이터 덩어리는 4바이트 버전으로 시작합니다. 이어서 세그윗 트랜잭션은 플래그 바이트 2개, 0x00과 0x01을 삽입합니다. 구형 파서는 이를 입력이 0개인 트랜잭션으로 읽어 거부하게 되는데, 이것은 새 형식이 구 형식과 공존할 수 있게 한 의도적인 방법입니다. 다음에는 입력 개수가 compactSize 정수로 오고, 이어서 각 입력이 옵니다. 지출하는 코인을 지시하는 36바이트, 길이 접두사가 붙은 잠금 해제 스크립트, 4바이트 시퀀스 번호입니다. 그다음 출력 개수가 오고, 이어서 각 출력이 사토시 단위의 8바이트 금액과 길이 접두사가 붙은 잠금 스크립트로 옵니다. 위트니스 데이터는 있을 경우 끝부분 가까이에 위치하며, 마지막 4바이트는 항상 록타임입니다.

숫자는 리틀 엔디언, 즉 가장 작은 바이트부터 저장됩니다. 그래서 100,000사토시의 금액은 16진수에서 a0 86 01 00 00 00 00 00으로 나타납니다. 해시는 내부 바이트 순서로 저장되며, 이는 블록 탐색기가 보여 주는 순서의 역순입니다. 따라서 원시 데이터 덩어리 안의 트랜잭션 ID는 거꾸로 보입니다.

이 하나의 구조에서 두 개의 해시가 나옵니다. 트랜잭션 ID는 마커, 플래그, 위트니스를 제거한 직렬화에 대한 이중 SHA-256이며, 이것이 서명이 사후에 훼손되지 않게 하는 이유입니다. BIP141에 정의된 위트니스 트랜잭션 ID는 위트니스를 포함한 전체를 해시하며, 노드는 중계 장부 관리에 이를 사용합니다. 입력 1개, 출력 2개의 네이티브 SegWit 결제는 약 222바이트의 원시 데이터로 직렬화되고 약 141가상 바이트로 계산됩니다. 위트니스 부분이 할인되기 때문입니다.

확인할 수 있는 곳

원시 형식은 단일 앱의 범위를 벗어나는 순간 나타나며, 대부분의 사람에게 그것은 오프라인 서명이나 결제 복구를 뜻합니다.

하드웨어 지갑과 네트워크에서 분리된 구성은 완료된 트랜잭션을 16진수로, 또는 같은 바이트를 담은 QR 코드로 내보내며, 이를 블록 탐색기의 브로드캐스트 양식에 붙여 넣어 전송합니다. Bitcoin Core의 명령줄은 이를 양방향으로 사용합니다. createrawtransaction과 signrawtransactionwithwallet은 16진수를 만들고, decoderawtransaction은 16진수를 다시 읽을 수 있는 JSON으로 바꾸며, sendrawtransaction은 이를 네트워크에 올립니다. 지원 요청에서는 트랜잭션 ID 대신 원시 16진수를 요구하는 경우가 많은데, 16진수는 트랜잭션의 이름만 알려 주는 것이 아니라 그 내용을 입증하기 때문입니다.

보안 관련 참고 사항이 하나 있습니다. 서명된 원시 트랜잭션은 무기명 정보입니다. 16진수를 가진 사람은 누구나 이를 브로드캐스트할 수 있으며, 그 안에 기밀인 것은 없습니다. 결제가 이루어져도 괜찮지 않다면 도움을 요청하면서 공개 포럼에 이를 붙여 넣지 마십시오.

직렬화된 트랜잭션 vs 트랜잭션 ID

직렬화된 트랜잭션은 문서이고, 트랜잭션 ID는 그 파일 이름입니다. 하나는 화면에서 500자에 이를 수 있는 수백 바이트의 16진수이고, 다른 하나는 항상 정확히 64개의 16진수 문자입니다.

둘 다 16진수의 긴 문자열처럼 보이기 때문에 사람들이 혼동합니다. 구별 기준은 길이와 그 문자열로 할 수 있는 일입니다. 64자 문자열은 블록 탐색기에서 조회하는 것 외에는 할 수 없습니다. 더 긴 문자열은 필드로 디코딩할 수 있으며, 완전히 서명되었다면 이를 가진 누구나, 여러분이 보낸 낯선 사람까지도 브로드캐스트할 수 있습니다.

혼동하기 쉬운 용어

자주 묻는 질문

제가 공유한 서명된 원시 트랜잭션을 누구나 브로드캐스트할 수 있습니까?

예. 완전히 서명된 직렬화된 트랜잭션은 완성된 상태이며 제출에 허가가 필요하지 않으므로, 16진수 문자열을 서명된 수표처럼 다루십시오. 공개 스레드에 이를 공유하면 가장 먼저 복사하는 사람에게 결제가 넘어갑니다.

원시 16진수 안에서 트랜잭션 ID가 왜 거꾸로 보입니까?

해시가 내부 바이트 순서로 저장되며, 이는 블록 탐색기가 표시하는 순서의 역순이기 때문입니다. 둘 다 같은 32바이트를 나타내며, 모든 디코더는 ID를 출력할 때 이를 대신 뒤집어 줍니다.

관련 용어

트랜잭션과 수수료 분야의 다른 용어

이 페이지를 영어로 읽기