본문으로 건너뛰기
buybitcoinsmart

용어집 / 개발자 참고 자료

내부 바이트 순서

내부 바이트 순서란 무엇입니까?
내부 바이트 순서는 비트코인이 직렬화된 구조 내부에서 사용하는 배치 방식입니다. 정수는 최하위 바이트부터 기록하고, 해시 다이제스트는 SHA-256이 생성한 순서 그대로 기록합니다.

두 가지 관례가 하나의 이름 아래에 있습니다. 트랜잭션이나 블록 헤더의 모든 정수 필드는 리틀 엔디언이므로, 버전 번호 2는 02000000으로 기록되고, 32바이트 해시는 모두 해시 함수가 출력한 그대로 원시 데이터에 들어갑니다. 사람이 사용하는 도구는 출력하기 전에 그러한 해시를 뒤집는데, 이것이 직접 작성한 파서가 블록 탐색기와 일치하지 않는 가장 흔한 이유입니다.

작동 방식

내부 바이트 순서는 80바이트 제네시스 블록 헤더를 하나씩 뜯어보면 가장 잘 배울 수 있습니다. 그 안의 모든 필드가 눈으로 확인할 수 있을 만큼 작기 때문입니다.

이 헤더는 01000000으로 시작합니다. 버전 번호 1을 리틀 엔디언 4바이트로 쓴 값입니다. 다음은 32개의 0바이트인데, 첫 블록에는 부모가 없기 때문입니다. 다음은 머클 루트로, 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a로 저장되어 있습니다. 이 값은 모든 탐색기가 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b로 출력하는 다이제스트를 1바이트씩 거꾸로 쓴 것입니다. 다음은 29ab5f49로, 타임스탬프 1231006505입니다. 이는 2009년 1월 3일의 18:15:05 UTC를 뜻합니다. 다음은 ffff001d로, 논리값이 0x1d00ffff인 난이도 필드입니다. 다음은 1dac2b7c로, 논스 2083236893입니다.

금액도 같은 규칙을 따릅니다. 비트코인 1개는 100,000,000사토시이고, 정확히 그만큼을 지급하는 출력은 8바이트 00e1f50500000000을 담습니다.

그 이유는 역사적이며 꽤 평범합니다. 비트코인은 정수를 최하위 바이트부터 저장하는 x86 기계를 위해 작성되었고, 초기 코드는 구조를 프로세서가 이미 가진 배치 그대로 기록했습니다. 해시는 전혀 뒤집히지 않았습니다. 바뀐 것은 출력 방식입니다. Bitcoin Core는 다이제스트를 하나의 거대한 수로 취급하는 클래스에 저장하고, 수는 최상위 부분을 왼쪽에 두고 출력하기 때문입니다.

확인할 수 있는 곳

내부 바이트 순서는 도구가 포맷된 답변 대신 원시 바이트를 건네줄 때마다 얻는 값입니다.

getrawtransaction으로 verbose 플래그 없이 트랜잭션을 가져오거나, getblockheader로 verbose를 false로 설정해 헤더를 가져오면 그 안의 모든 것이 이 순서로 도착합니다. 하드웨어 지갑이 내보낸 PSBT, 탐색기의 원시 데이터 탭 뒤에 있는 16진수, 노드의 blocks 디렉터리에 있는 블록 파일에도 같은 규칙이 적용됩니다.

사람들이 가장 자주 걸리는 필드는 모든 입력의 시작에 있는 아웃포인트입니다. 이 필드는 사용되는 트랜잭션을 32바이트로 지정하는데, 이 바이트는 탐색기가 표시한 식별자의 역순으로 읽힙니다. 두 문자열이 일치하지 않는다고 해서 손상된 것은 아닙니다. 하나를 뒤집으면 일치합니다.

내부 바이트 순서 vs RPC 바이트 순서

내부 바이트 순서와 RPC 바이트 순서는 같은 32바이트를 반대 방향으로 읽은 것이며, 둘을 변환하는 규칙에는 중요한 예외가 하나 있습니다. 해시 다이제스트는 사람에게 출력될 때 뒤집히고 다시 입력될 때 또 뒤집힙니다. 정수는 그렇지 않습니다. 블록 높이, 타임스탬프, 사토시 단위 금액은 모두 평범한 십진수로 제시되므로, 그중 하나를 입력이나 출력 과정에서 뒤집으면 다르게 표기된 값이 아니라 그냥 잘못된 값이 됩니다. 해시만 뒤집고 그 밖의 것은 뒤집지 않으면 대부분의 바이트 순서 버그가 사라집니다.

혼동하기 쉬운 용어

자주 묻는 질문

원시 트랜잭션 안에서 해시가 거꾸로 보이는 이유는 무엇입니까?

거꾸로 된 것은 아닙니다. 출력된 버전이 거꾸로입니다. 다이제스트는 SHA-256이 생성한 순서로 저장되지만, 표시 도구는 Bitcoin Core가 해시를 하나의 큰 수로 취급하고 최상위 부분을 먼저 출력하기 때문에 이를 뒤집습니다.

원시 비트코인 데이터를 파싱할 때 모든 필드를 뒤집어야 합니까?

아닙니다. 정수는 리틀 엔디언이며 그대로 읽고, 32바이트 해시만 뒤집는 값이며, 그것도 탐색기나 RPC 호출이 보여주는 값과 비교하고자 할 때만 뒤집습니다.

다음에 읽을 글

관련 용어

개발자 참고 자료 분야의 다른 용어

이 페이지를 영어로 읽기