본문으로 건너뛰기
buybitcoinsmart

용어집 / 개발자 참고 자료

OP_HASH160

OP_HASH160이란 무엇입니까?
OP_HASH160은 스택 맨 위 항목에 SHA-256을 적용한 뒤 그 결과에 RIPEMD-160을 적용하여 20바이트 다이제스트를 남기며, 이는 1 또는 3으로 시작하는 모든 주소 안에 담긴 동일한 지문입니다.

한 바이트인 0xa9가 암호학에서 가장 많이 연구된 두 해시 함수를 대신합니다. 이 조합은 32바이트 출력을 20바이트로 줄이고 두 알고리즘 중 어느 한쪽의 약점에 대비하지만, 그 대가로 충돌 저항성이 128비트가 아니라 약 80비트로 낮아집니다. 비트코인 주소가 전화로 소리 내어 읽을 수 있을 만큼 짧은 것은 바로 이 때문입니다.

작동 방식

OP_HASH160은 길이에 관계없이 항목 하나를 꺼내 정확히 20바이트를 푸시하며, 같은 입력은 언제나 같은 다이제스트를 만듭니다.

두 함수는 서로 무관한 설계 계보에서 나왔습니다. RIPEMD-160은 1996년에 유럽의 학술 연구진이 공개적으로 작업하여 발표했고, SHA-256은 NSA에서 나와 2001년에 NIST가 표준화했습니다. 둘을 연결한 것은 보수적인 선택이었습니다. 한쪽에 구조적 결함이 생기더라도 다른 쪽이 공격자와 쓸모 있는 위조 사이를 계속 가로막으며, 삼십 년 동안 어느 쪽도 이 구성을 위협할 만한 방식으로 깨지지 않았습니다.

크기 축소는 겉치레가 아닙니다. 모든 출력마다 열두 바이트를 아끼는 것은 영구적인 전 세계 원장을 작게 유지하려던 시기에 중요했으며, 고전적인 잠금 스크립트가 37바이트가 아니라 25바이트인 이유이기도 합니다.

스무 바이트에는 실제로 한계가 있습니다. 160비트 다이제스트를 공유하는 두 입력을 찾는 데는 2의 128제곱이 아니라 2의 80제곱 정도의 연산이 필요합니다. 해시되는 키를 오직 본인만 고를 때는 충분히 안전하지만, 상대방이 커밋되는 스크립트를 고르는 데 관여할 때는 훨씬 덜 안심할 수 있습니다. 바로 이 논리 때문에 segregated witness는 스크립트 커밋을 P2WSH의 단일 32바이트 SHA-256으로 옮기면서 단일 키 출력에는 더 짧은 형태를 유지했습니다.

확인할 수 있는 곳

OP_HASH160은 두 가지 스크립트 템플릿에 들어 있고, 그 출력은 지금까지 복사해 본 거의 모든 주소 안에 들어 있습니다.

레거시 출력은 이것을 공개 키에 적용합니다. Pay-to-script-hash 출력은 이것을 리딤 스크립트에 적용합니다. 두 경우 모두 눈에 보이는 주소는 앞에 버전 바이트가 붙은 20바이트 다이제스트이며, 1로 시작하는 주소에는 0x00이, 3으로 시작하는 주소에는 0x05가 붙고, Base58Check 체크섬으로 감싸져 있습니다. 네이티브 segwit 단일 키 출력은 옵코드가 전혀 없이 동일한 20바이트를 담는데, 그 출력 유형의 규칙이 스크립트로 쓰여 있는 것이 아니라 검증기에 내장되어 있기 때문입니다.

Taproot는 이 관행을 깼습니다. bc1p 출력은 사이에 해시 단계 없이 32바이트 공개 키에 직접 커밋하므로, Taproot 주소 어디에도 hash160이 들어 있지 않습니다.

이것은 하드웨어 지갑 화면에서 주소를 확인하는 방법이 통하는 실용적인 이유이기도 합니다. 어디가 되었든 조금이라도 다른 두 주소는 서로 무관한 두 다이제스트를 만들기 때문에, 바뀐 주소가 거의 맞는 것처럼 보일 수는 없습니다. 기기에 표시된 앞뒤 몇 글자를 컴퓨터가 보여 주는 내용과 비교하는 것만으로 클립보드 악성코드를 잡아낼 수 있습니다.

OP_HASH160 vs SHA-256

SHA-256은 해시 함수이고, OP_HASH160은 우연히 그 함수를 한 번 호출하는 명령입니다. 이 함수는 스크립트와 무관하게 비트코인 곳곳에 나타납니다. 작업 증명은 블록 헤더를 이 함수로 두 번 해시하고, 트랜잭션 식별자는 이 함수를 두 번 적용한 값이며, 머클 트리도 이 함수로 만들어집니다. 반면 옵코드는 Bitcoin Script 안에만 존재하고, 출력이 사용되는 동안에만 실행되며, 언제나 32바이트가 아니라 20바이트를 산출합니다. 이 옵코드가 수행하는 조합, 즉 SHA-256에 대한 RIPEMD-160은 지갑 코드에서 hash160이라는 고유한 이름을 가질 만큼 흔하며, 라이브러리의 함수 목록을 읽을 때 알아 두면 좋습니다.

혼동하기 쉬운 용어

자주 묻는 질문

비트코인은 왜 서로 다른 두 알고리즘으로 두 번 해시합니까?

이유는 두 가지입니다. 두 번째 해시는 다이제스트를 32바이트에서 20바이트로 줄여 모든 주소와 모든 출력 스크립트를 짧게 만들고, 서로 무관한 두 설계를 쓰기에 한 알고리즘만 깨져서는 일치를 위조하기에 충분하지 않습니다.

20바이트 해시는 여전히 안전합니까?

일반적인 단일 키 주소라면 그렇습니다. 더 약한 경우는 다른 사람이 해시 대상 내용의 일부를 고르는 스크립트이며, 그래서 segregated witness는 대신 스크립트를 32바이트 SHA-256 전체로 커밋합니다.

다음에 읽을 글

관련 용어

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

이 페이지를 영어로 읽기