용어집 / 프로토콜과 업그레이드
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이 이미 버전 체계를 만들어 두었기 때문이며, 그래서 둘은 단계적으로 수행된 하나의 설계로 읽는 것이 가장 좋습니다.