본문으로 건너뛰기
buybitcoinsmart

용어집 / 프로토콜과 업그레이드

SegWit

별칭은 Segregated Witness, BIP141, 세그윗입니다.

SegWit이란 무엇입니까?
SegWit은 트랜잭션의 txid가 커밋하는 부분에서 서명 데이터를 분리해, 트랜잭션 가단성을 해결하고 1메가바이트 기본 한도를 바꾸지 않으면서 블록 용량을 높였습니다.

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

이 변경은 겉치레가 아니라 구조적인 것이었습니다. 서명은 구형 노드가 전혀 내려받지 않는 위트니스 구역으로 들어갔고, 그 덕분에 용량 확대가 소프트 포크로 배포될 수 있었으며, 위트니스 바이트는 각각 4개의 가중치 단위가 아니라 1개의 가중치 단위 비용이 듭니다. 따라서 bc1q 주소에서 지출하는 비용은 레거시 입력 비용의 대략 절반입니다.

작동 방식

Segregated Witness는 트랜잭션을 두 부분으로 나누고 각각을 따로 해시합니다.

기본 부분은 버전, 입력, 출력, 록타임을 담습니다. 위트니스 부분은 각 입력에 대해 그것을 승인하는 항목의 스택을 담으며, 보통 서명 1개와 공개 키 1개입니다. 트랜잭션 식별자는 기본 부분만을 대상으로 계산되므로 위트니스 안의 어떤 것도 그것을 바꿀 수 없습니다. 두 번째 식별자인 wtxid는 두 부분을 모두 포괄하며, 블록 안의 모든 wtxid의 머클 루트가 코인베이스 트랜잭션 안에 커밋되므로 위트니스 데이터 역시 변조될 수 없습니다.

용량은 한도의 변경이 아니라 회계 방식의 변경에서 나옵니다. 위트니스 밖의 모든 바이트는 가중치 단위 4개, 안의 모든 바이트는 가중치 단위 1개가 들며, 블록 하나는 가중치 단위 4,000,000개를 담을 수 있습니다. 따라서 위트니스가 아닌 데이터는 이전과 똑같이 1,000,000바이트를 넘을 수 없고, 서명은 남는 예산에 실려 갑니다. 옛 방식으로 측정하는 2017년 이전의 노드는 합법적인 블록을 보고 아무런 이의도 제기하지 않으며, 바로 이것이 이 업그레이드에 하드 포크가 필요하지 않았던 이유입니다.

BIP-143은 위트니스 입력에 서명하는 방식을 다시 썼으며, 실질적인 이득은 들리는 것보다 큽니다. 옛 서명 해시 알고리즘은 입력마다 트랜잭션의 일부를 다시 해시했으므로 입력이 많은 트랜잭션의 서명 작업은 제곱에 비례해 늘어났습니다. 새 알고리즘은 미리 계산된 해시를 재사용하고, 무엇보다 중요하게도 지출되는 금액에 커밋합니다. 그 전에는 하드웨어 지갑에 입력의 가치가 얼마인지 거짓으로 알려 주고 거액의 수수료를 승인하게 만들 수 있었습니다.

SegWit은 출력 유형에도 번호를 붙였습니다. 위트니스 버전 0은 P2WPKH와 P2WSH를 포괄하며, 위트니스 버전 1은 비워 두었다가 나중에 Taproot가 채웠습니다. 이제는 매번 새로운 주소 형식 논쟁 없이 새 출력 유형을 추가할 수 있습니다.

비트코인을 구매할 때 이것이 중요한 이유

비트코인을 직접 사용할 때의 세 가지는 모두 이 업그레이드에서 직접 비롯됩니다.

첫째는 코인을 옮길 때 지불하는 비용입니다. 네이티브 SegWit 입력은 약 68 vbytes로, 레거시 입력의 약 148 vbytes와 대비되므로, 입력 3개를 20 sat/vB의 수수료율로 지출하는 지갑은 트랜잭션 1건에서 수천 사토시를 아낍니다. 그 절감은 받을 때가 아니라 지출할 때 생기므로, 중요한 것은 거래소가 출금하는 주소 유형이 아니라 본인의 지갑이 사용하는 주소 유형입니다.

둘째는 하드웨어 지갑이 안전하게 알려 줄 수 있는 것입니다. BIP-143이 입력 금액에 커밋하므로 Trezor나 Ledger 화면에 표시되는 수수료는 연결된 컴퓨터가 주장하는 데이터가 아니라 장치가 검증할 수 있는 데이터에서 나옵니다. 이것이 실제 공격 하나를 막았으며, 레거시 입력에 서명할 때 여전히 장치에 이전 트랜잭션 전체를 넘겨 금액을 스스로 확인하게 해야 하는 이유입니다.

셋째는 라이트닝 네트워크, 따라서 그 위에 구축된 모든 거래소입니다. Strike는 기본적으로 라이트닝 네트워크로 가치를 옮기며, 라이트닝 채널은 안정적인 txid 없이는 프로토콜이 작동할 수 없으므로 SegWit 출력으로 자금이 들어갑니다. SegWit이 없으면 채널도 없고, 그 위의 즉시 결제 상품도 없습니다.

먼저 사라져야 했던 가단성 버그

트랜잭션 가단성은 예외적인 사례로 들리지만, 비트코인 위에 무엇이든 구축하는 데 있어 가장 큰 단일 장애물이었습니다.

ECDSA 서명에는 유효한 인코딩이 하나보다 많습니다. SegWit 이전에는 멤풀을 지켜보는 제3자가 미확인 트랜잭션을 가져다가 서명을 무효화하지 않고 다시 인코딩해 다시 전파할 수 있었습니다. 코인은 같은 금액으로 같은 곳에 여전히 옮겨졌습니다. 바뀐 것은 트랜잭션 식별자뿐이었고, 원래 식별자를 기록해 둔 소프트웨어는 이제 그 결제가 사라졌다고 믿었습니다. Mt. Gox는 2014년 2월의 출금 중단을 가단성 탓으로 공개적으로 돌렸는데, 이 주장은 당시 다른 개발자들이 반박했지만 근본 결함은 실재했습니다.

결제 채널은 이 문제를 성가신 것에서 치명적인 것으로 만들었습니다. 채널은 자금 조달 트랜잭션이 전파되기도 전에, 그 txid로 식별되는 자금 조달 출력을 지출하는 서명된 환불 트랜잭션을 보관하는 방식으로 작동합니다. txid가 바뀌면 환불은 지출 불가능해지고, 한쪽 당사자가 상대방의 돈을 볼모로 잡을 수 있게 됩니다. Joseph Poon과 Thaddeus Dryja의 2015 라이트닝 네트워크 논문은 자체 본문에서 가단성 수정을 전제 조건으로 명시했습니다.

SegWit은 서명을 식별자의 프리이미지에서 빼내어 문제를 뿌리부터 제거했습니다. 위트니스 출력을 지출하는 모든 입력은 제3자가 변경할 수 없는 txid를 가지며, 채널 프로토콜은 마침내 설계대로 구축될 수 있었습니다.

SegWit vs 위트니스 데이터

SegWit은 업그레이드이고, 위트니스 데이터는 그것이 만든 구조입니다. 하나는 날짜 2017년 8월 24일과 명세 BIP-141을 가진 사건입니다. 다른 하나는 오늘날 네트워크의 대부분 트랜잭션에 존재하는 필드로, 서명과 스크립트를 담고 자체 직렬화와 자체 할인 가중치를 가집니다. 트랜잭션이 “SegWit을 사용한다”고 하는 것은 그 필드에 승인 정보가 있는 입력을 지출한다는 뜻의 줄임말입니다.

SegWit vs Taproot

4년 차이를 둔 두 번의 소프트 포크이며, 둘 다 위트니스에 관한 것입니다. SegWit은 위트니스 구조를 만들고 주소가 bc1q로 시작하는 위트니스 버전 0 출력 유형을 정의했습니다. Taproot는 버전 1을 채우고 Schnorr 서명을 추가했으며 위트니스 안의 스크립트를 평가하는 방식을 바꾸어 주소가 bc1p로 시작하는 출력을 만들었습니다. Taproot가 그렇게 저렴하게 배포될 수 있었던 것은 SegWit이 이미 버전 체계를 만들어 두었기 때문이며, 그래서 둘은 단계적으로 수행된 하나의 설계로 읽는 것이 가장 좋습니다.

혼동하기 쉬운 용어

자주 묻는 질문

SegWit을 사용하려면 제가 따로 해야 할 일이 있습니까?

올바른 수취 주소를 선택하기만 하면 됩니다. 오늘날 대부분의 지갑은 기본적으로 bc1q로 시작하는 주소를 사용하며, 이 주소는 네이티브 SegWit 출력입니다. 수수료 절감은 비트코인을 받을 때가 아니라 나중에 그 주소에서 지출할 때 발생합니다.

SegWit은 bech32 주소와 같은 것입니까?

아닙니다. SegWit은 합의 변경이고, bech32는 SegWit이 만든 주소를 위해 함께 설계된 텍스트 인코딩입니다. 중첩 SegWit 주소는 3으로 시작하며 bech32가 전혀 아니지만, 그래도 위트니스 입력을 지출합니다.

SegWit이 블록 크기를 4 MB로 늘렸습니까?

그 숫자가 암시하는 방식은 아닙니다. 블록은 4,000,000 가중치 단위로 제한되며, 거의 전부가 위트니스 데이터로 채워진 블록이라야 4 MB에 가까워집니다. 일반적인 결제 트래픽이 만드는 블록은 1.5 MB에 더 가깝습니다.

다음에 읽을 글

관련 용어

프로토콜과 업그레이드 분야의 다른 용어

이 페이지를 영어로 읽기