본문으로 건너뛰기
buybitcoinsmart

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

트랜잭션 가단성

별칭은 Transaction malleability입니다.

트랜잭션 가단성이란 무엇입니까?
트랜잭션 가단성은 제3자가 트랜잭션에 담긴 서명 데이터를 다시 인코딩하여 돈이 향하는 곳은 바꾸지 않고 트랜잭션 ID만 바꿀 수 있었던 결함입니다.

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

결제는 여전히 작동했습니다. 바뀐 것은 그 이름뿐이었습니다. 비트코인은 2015년부터 2017년까지 단계적으로 이 구멍을 막았고, SegWit이 서명을 위트니스에 두는 입력에 대해 마무리했습니다. 레거시 입력은 여전히 가단성을 지니며, 이는 코인을 bc1 주소에 보관해야 하는 또 하나의 이유입니다.

작동 방식

트랜잭션 ID는 트랜잭션 바이트의 해시이므로 어떤 바이트든 바꾸면 다른 ID가 나오며, 레거시 입력에서는 서명이 그 바이트 가운데 하나입니다.

세 가지 종류의 여유 덕분에 아무것도 깨뜨리지 않고 변경이 가능했습니다.

첫째는 산술입니다. ECDSA 서명은 r과 s 두 수의 쌍이며, 모든 유효한 s에 대해 곡선 위수에서 s를 뺀 또 하나의 똑같이 유효한 값이 있습니다. 네트워크를 지켜보는 누구든 이 값을 뒤집을 수 있고 검증은 여전히 성공합니다.

둘째는 인코딩입니다. 서명은 DER로 감싸져 있었고, 비트코인이 의존하던 라이브러리는 느슨한 변형을 받아들였습니다. 앞에 남는 0 바이트, 정규화되지 않은 길이 표시, 신중한 인코더라면 내보내지 않을 패딩 같은 것들입니다. 각 변형은 서로 다른 ID로 해시되었습니다.

셋째는 서명을 둘러싼 잠금 해제 스크립트입니다. 무해한 항목을 하나 더 스택에 밀어 넣어도 스크립트의 결과는 동일하게 남고 직렬화된 바이트는 달라졌습니다.

수리는 한 계층씩 이루어졌습니다. BIP66은 2015년 7월 4일의 높이 363,725에서 엄격한 DER 인코딩을 합의 규칙으로 만들었는데, 이 활성화는 여러 대형 풀이 검증하지 않은 헤더 위에서 블록을 만들다가 그날 오후 6개 블록 포크를 일으킨 일로 주로 기억됩니다. 2015년 10월에 출시된 Bitcoin Core 0.11.1은 낮은 s 값을 릴레이 정책 규칙으로 만들었고, 이는 나중에 BIP146으로 정리되었습니다. 남은 모든 원인을 열거하고 금지하려던 시도인 BIP62는 실행 불가능하다는 이유로 포기되었고 오늘까지 Withdrawn 상태를 지니고 있습니다. 문제를 매듭지은 것은 2017년 8월 24일의 높이 481,824에서 가동된 SegWit이었습니다. 서명이 위트니스로 옮겨졌고, ID는 위트니스 없이 계산되며, SegWit 입력에는 변경할 것이 남아 있지 않습니다.

확인되는 곳

가단성은 절도가 아니라 회계 실패를 일으켰고, 이것이 지금도 이 위험의 모습입니다.

출금을 자신이 브로드캐스트한 ID로 추적하던 수탁업자는 다른 ID를 지닌 확정된 트랜잭션을 보게 되면 자신의 지급이 실패했다고 판단하고 코인을 다시 보낼 수 있었습니다. 이 패턴은 2014년에 거래소에서 실제 손실을 일으켰고, 진지한 운영자가 ID만이 아니라 출력 주소와 금액으로 대사하는 이유입니다.

연쇄 트랜잭션이 또 다른 희생자였습니다. 미확정 부모를 소비하는 자식은 부모를 ID로 지목하므로, 가단성으로 변형된 부모는 자식을 영구적으로 사용할 수 없게 만듭니다. 자금 트랜잭션이 브로드캐스트되기 전에 환불에 서명하는 모든 프로토콜, 즉 라이트닝 채널을 여는 과정이 정확히 그런 것인데, ID가 안정되기 전까지는 안전하게 구축할 수 없었습니다.

구매하고 보관하는 사람에게는 습관 하나로 이 모두를 감당할 수 있습니다. 미확정 ID는 사실이 아닙니다. 그것은 레거시 입력의 가단성으로 여전히 바뀔 수 있고, 이제는 무관한 이유로 일상적으로 바뀝니다. Bitcoin Core가 기본으로 전체 replace-by-fee를 릴레이하고, 수수료를 올리는 발신자가 새 ID를 게시하기 때문입니다. 확정을 기다린 다음 ID를 묻는 사람에게 알려 주십시오.

트랜잭션 가단성 vs 이중 지출

가단성은 꼬리표를 움직이고, 이중 지출은 돈을 움직입니다. 변형된 트랜잭션에서는 같은 코인이 같은 금액으로 같은 주소에 도달하며, 옛 ID를 기억한 소프트웨어만 무슨 일이 일어났는지 알아차립니다. 이중 지출에서는 경쟁 트랜잭션이 그 코인을 다른 곳으로 보내고 한 버전은 결국 가치가 없어집니다. 둘을 혼동하면 사람들은 확정된 결제를 불신하게 되는데, 이는 잘못된 교훈입니다. 확정된 ID는 가단성이 있었던 적이 없습니다. 가단성은 트랜잭션이 미확정 상태에 머무는 동안에만 적용되었기 때문입니다.

혼동하기 쉬운 용어

자주 묻는 질문

가단성을 이용해 비트코인을 훔칠 수 있었습니까?

직접적으로는 아닙니다. 코인은 의도한 주소로 의도한 금액만큼 도달했습니다. 손실은 미확정 트랜잭션 ID를 신뢰하고, 기억하던 ID가 체인에 나타나지 않자 두 번 지급한 소프트웨어에서 비롯되었습니다.

트랜잭션 가단성은 수정되었습니까?

SegWit 입력의 경우에는 2017년 8월부터 수정되었습니다. 1 또는 3으로 시작하는 레거시 주소를 소비하는 입력은 여전히 서명을 트랜잭션의 해시 대상 부분 안에 지니므로, 그 ID는 확정 전에 여전히 변경될 수 있습니다.

미확정 트랜잭션 ID가 계속 바뀌는 이유는 무엇입니까?

거의 항상 발신 지갑이 트랜잭션을 더 높은 수수료 버전으로 대체했기 때문이며, 이는 다른 ID를 만듭니다. 전체 replace-by-fee는 현대 Bitcoin Core의 기본 릴레이 정책이므로, 이는 공격이 아니라 정상적인 동작입니다.

다음에 읽을 글

관련 용어

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

이 페이지를 영어로 읽기