세그윗은 2013년~2014년쯤 제안된 기술입니다. 이 기술은 확장성을 해결하기 위해 제안된 것이 아닌 거래 가변성 공격(transaction malleability attack)을 해결 하기 위함이였습니다
거래 가변성 공격을 쉽게 설명하면 다음과 같이 정의 할 수 있습니다
거래내역에 위변조가 발생했음에도 불구하고 프로그램 버그로 인하여 유효한 거래로 인정 되는 것
입니다.
우리가 거래를 발생시키면 해당 거래를 찾는데 흔히 쓰는 것은 거래 아이디 (txid)입니다. 이 아이디는 세그윗이 적용되기전에는 거래 서명과 거래 내역등을 이용해 생성하였습니다.따라서 서명이 바뀌면 새로운 거래 아이디가 생성이 되는 것입니다.
서명이 바뀌면 위변조 된 것으로 파악을 하고 해당 거래내역을 유효한 것으로 인식하지 말아야 합니다. 그럼데 프로그램 버그로 인해 위조된 서명이 올바른 서명으로 인식되버린 것입니다. 사람들은 이점을 이용해 거래소들을 다음과 같이 공격했습니다
출금을 요청
거래소는 출금을 위한 거래내역을 생성 및 전파 (이하 거래1)
공격자는 거래소로 부터 생성된 거래내역의 서명을 변경
변경된 서명으로 tx id가 다른 거래가 생성되고 이를 전파 (거래2)
만약 거래 2가 포함된 블록이 확정되버리면 거래 1은 자동으로 폐기되버림 (
공격자는 거래소에게 출금이 되지않있다고 신고
거래소는 거래 1에 해당하는 tx가 없으므로 다시 출금을 위한 거래내역을 생성 및 전파
즉 공격자는 거래소로 부터 이중 출금을 받은 것입니다. 그리고 마운틴 콕스는 이런 공격에 의해 피해를 입었다고 발표한 바가 있습니다
이 거래 가변성 공격을 해결 하기 위해 다양한 방법들이 제안되다가 누군가는 매우 간단한 아이디어를 제시합니다. 거래 아이디 생성할때 거래 서명을을 사용하지 말자는 것이였습니다. 즉 거래 서명과 거래 내역을 분리하여 관리하는 것입니다.
그런데 여기서 사람들은 골때리게도 세그윗이 적용된 블록들의 데이터를 계산할때 거래 서명을 포함시키지 않고 계산해버립니다. 따라서 블록에 담을 수 있는 거래 숫자들이 증가하였고 그로 인해 확장성이 증가했다는 것입니다
하지만 세그윗은 확장성 해결을 위한 본질이 될 수 없습니다. 최대 2배정도의 효과를 얻더라도 여전히 10tps내외이기 때문입니다. 따라서 확장성을 위한 라이트닝 네트워크 혹은 사이드체인 기법 등이 연구 개발되고 있는 상황입니다.
세그윗 및 거래 가변성 공격에 대한 것은 bip141 및 bip 148을 보시면 도움이 되리라 생각합니다