본문으로 건너뛰기
buybitcoinsmart

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

서명 해시

별칭은 Sighash입니다.

서명 해시란 무엇입니까?
서명 해시는 지갑이 실제로 서명하는 다이제스트입니다. 해당 입력에 선택된 플래그에 따라 정리된, 트랜잭션을 다시 구성한 사본에 SHA-256을 두 번 적용한 값입니다.

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

어떤 서명도 네트워크에 전송되는 그대로의 트랜잭션을 대상으로 하지 않습니다. 각 입력은 고유한 다이제스트를 가지며, 그 다이제스트를 만드는 절차는 두 번 다시 작성되었습니다. 원래 절차는 2009년의 것이고, segwit 입력에는 BIP143이, Taproot에는 BIP341이 적용됩니다. 다이제스트가 제외하는 부분은 공격자가 마음대로 바꿀 수 있는 부분입니다.

작동 방식

서명 해시를 만든다는 것은 곧 브로드캐스트하려는 트랜잭션이 아니라 그 트랜잭션을 수정한 사본을 구성하고 그 사본의 해시를 계산한다는 뜻입니다.

원래 절차는 다음과 같이 진행됩니다. 트랜잭션을 가져와 모든 입력의 잠금 해제 스크립트를 비우고, 서명하려는 단일 입력에 지출하려는 스크립트를 삽입한 다음 플래그에 따라 출력을 유지하거나 비우거나 버립니다. 플래그를 4바이트 숫자로 덧붙이고 전체에 SHA-256을 두 번 적용한 뒤, 나오는 32바이트에 서명합니다.

이 설계에는 트랜잭션이 커질 때까지 아무도 알아차리지 못한 비용이 따랐습니다. 각 입력이 트랜잭션 전체를 다시 구성하고 다시 해시하기 때문에 작업량은 입력 개수의 제곱에 비례해 늘어납니다. BIP143은 여기에 수치를 붙입니다. 평범한 1MB 블록을 검증하는 데는 2초 정도가 걸리는 반면, 5,569건의 서명 연산을 담은, 의도적으로 만든 1MB 트랜잭션 1건은 25초가 걸릴 수 있습니다. 트랜잭션 1건이 그만큼 오래 네트워크의 모든 노드를 멈추게 하는 것은 산업화를 기다리는 서비스 거부 공격입니다.

BIP143은 segwit 버전 0 입력을 위해 이 절차를 다시 작성했고 두 가지 문제를 한꺼번에 해결했습니다. 아웃포인트, 시퀀스 번호, 출력을 다루는 3개의 하위 해시를 한 번 계산해 모든 입력에 재사용하므로 비용이 선형이 됩니다. 코인을 보유한 사람에게 더 중요한 점은, 이제 다이제스트가 서명하는 입력의 금액을 확정한다는 것입니다. 그 전에는 서명 장치에 입력의 가치를 알려 주어야 했고 확인할 방법이 없었으므로, 악성 프로그램이 입력 금액을 실제 가치보다 낮게 제시해 하드웨어 지갑이 막대한 수수료를 승인하도록 속일 수 있었습니다.

BIP341은 Taproot를 위해 세 번째로 이 절차를 다시 작성했습니다. Taproot 다이제스트는 태그가 붙은 해시로, 다른 프로토콜의 다이제스트와 절대 혼동되지 않도록 도메인 문자열이 앞에 붙으며, 서명하는 입력만이 아니라 지출되는 모든 입력의 금액과 잠금 스크립트를 확정합니다. 또한 플래그의 기본값인 0을 도입하는데, 이는 표준 규칙이 다루는 모든 것을 다루면서도 서명에 기록되지는 않습니다.

확인할 수 있는 곳

서명 해시는 하드웨어 지갑이 지금처럼 작동하는 이유로서 간접적으로 마주치게 됩니다.

레거시 입력에 서명하려면 장치에 이전 트랜잭션 전체를 넘겨야 합니다. 그것이 장치가 입력의 가치를 스스로 확인할 수 있는 유일한 방법이기 때문입니다. Sparrow와 Electrum은 서명 전에 그 트랜잭션들을 Trezor나 Ledger로 전송하며, 오래된 코인이 가득한 지갑에서는 이 단계 때문에 지출이 예상보다 눈에 띄게 오래 걸립니다. segwit 입력은 금액만 필요하며, 그 금액은 PSBT가 이미 담고 있습니다.

서명 해시는 블록 탐색기에서 레거시 또는 segwit 서명의 마지막 바이트로 직접 드러납니다. 01로 끝나는 서명은 모든 것을 다루는 규칙에 따라 만들어졌습니다. 다른 값이라면 트랜잭션을 신뢰하기 전에 그 의미를 이해하는 것이 좋습니다.

서명 해시 vs SIGHASH_ALL

서명 해시는 다이제스트이고, SIGHASH_ALL은 그것을 만드는 규칙 중 하나입니다. 플래그 바이트를 전혀 담지 않는 Taproot 서명을 포함해 모든 서명에는 서명 해시가 있습니다. 달라지는 것은 트랜잭션의 어느 부분이 다이제스트에 들어갔는지이며, 플래그는 그 선택에 붙는 이름일 뿐입니다. 트랜잭션이 "SIGHASH_ALL을 사용한다"고 말하는 것은 정책을 서술하는 것이고, 서명 해시가 있다고 말하는 것은 역사상 모든 비트코인 서명이 가진 무언가를 서술하는 것입니다.

혼동하기 쉬운 용어

자주 묻는 질문

오래된 트랜잭션에 서명할 때 하드웨어 지갑에서 왜 이렇게 오래 걸립니까?

레거시 서명 해시가 입력의 금액에 커밋하지 않기 때문에, 장치가 금액을 스스로 계산하려면 이전 트랜잭션 전체를 하나하나 넘겨받아야 합니다. segwit 입력은 이 단계를 건너뛰므로 최신 코인은 몇 초 만에 서명됩니다.

서명 해시는 트랜잭션 ID와 같은 것입니까?

아닙니다. 트랜잭션 ID는 브로드캐스트될 그대로의 트랜잭션의 해시입니다. 서명 해시는 수정된 사본을 다루며 입력마다, 플래그마다 다르고, 체인 어디에도 나타나지 않습니다.

관련 용어

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

이 페이지를 영어로 읽기