단어 뜻 부터 알아보죠.
segregated: 분리된, 따로 떨어져 있는
witness: 증인
Segregated Witness
트랜잭션이 유효하다는 것을 증명해줄, 옛날버전의 노드로부터 분리되어서 활동하는 증인.
중앙화 방식의 송금
중앙화된 시스템에서는 중앙의 서버에서 데이터베이스 값을 가지고 간단한 확인작업 만으로 무엇이 가짜인지, 누가 공격을 하는지 가려낼 수 있습니다.
재용이가 유라한테 중앙화된 사이버 머니 1억을 보내는 경우를 풀어서 쓰면
(장재용, 이유라 라는 가상의 인물입니다. 장삼이사...)
재용이가 1억을 유라에게 보내겠다고 서버에 요청하고
서버는 재용이 잔고에 1억 넘게 있는지 확인하고
잔고 천억에서 1억을 빼서 999억으로 업데이트하고
유라 잔고 500원 있던거에서 1억을 더해서 1억 500원으로 업데이트하고
재용이에게 메세지를 보내서 전송이 완료되었다고 알려주고
유라에게도 메세지를 보내서 재용이가 사이버 머니를 보내주었다고 알려주면 끝납니다.
탈 중앙화 방식의 송금
탈 중앙화 된 시스템에서는 시스템을 구성하는 노드들이 모두 평등하기 때문에 가짜를 가려내는 작업이 생각보다 복잡합니다.
재용이가 유라에게 1 비트코인을 보내는 경우를 풀어서 써보겠습니다.
재용이도 비트코인 지갑이 있고 유라도 비트코인 지갑이 있습니다.
유라가 비트코인 주소를 새로 생성해서 그 주소를 재용이한테 알려줍니다.
재용이가 1 비트코인을 그 주소로 보냅니다.
이것을 트랜잭션이라고 부릅시다.
트랜잭션은 인풋과 아웃풋으로 구성됩니다.
재용이 지갑에서 1비트코인 만큼을 잠궈버리는 것이 인풋 입니다.
잠겨진 1비트코인의 소유권을 누구에게로 넘길까 하는 것이 아웃풋 입니다.
보내는사람으로 부터 그 액수가 영영 잠궈지고, 받는 사람에게 그 액수에 대한 소유권이 생기게 되고, 그것에 대해서 아무도 이의를 제기하지 않으면, 그것이 바로 성공적인 트랜잭션이 됩니다.
트랜잭션이 피어 투 피어로 연결된 지갑 노드들에게 점점 전파되면서 유효성이 검증 되고, 마침내 유라 지갑에 까지 그 트랜잭션이 전파됩니다. 그러면
Unconfirmed Transaction: 1.00000000 BTC
유라의 지갑에는 대충 이런 메세지가 뜹니다.
노드들 사이에서 트랜잭션이 전파되다 보면 마이닝을 하고 있는 노드에도 전달이 됩니다.
마이닝 노드는
아, 이 트랜잭션에 담겨있는 수수료는 참으로 귀한거구나
비트코인의 블록체인이라고 하는 것이 앞으로 나아가기 위해서는
이러한 수수료나 이런것들을 통해서 사익을 추구하는 마이너가
지금 생성하는 블록에 이러한 여러가지 트랜잭션을 포함 시켜야 겠구나
라고 중얼거리며 약빤 해싱파워로 마이닝에 성공해서 그것을 컨펌시킵니다.
컨펌수가 늘어나면서 유라는 이 비트코인이 과연 내 비트코인이구나 하는 확신을 가질 수 있습니다.
블록사이즈 문제
사용자 수가 많아지고 사람들이 사용하는 트랜잭션이 자주 일어나다 보니까
10분에 한번 생성되는 비트코인 블록에 그 많은 트랜잭션들이 다 포함되지 못하는 경우가 잦아졌습니다.
1메가라는 블록사이즈의 상한선은 비트코인을 맨 처음 만들 때 넣은 숫자 입니다.
7년이 지나서 2015년에 컨펌이 오래걸리는 문제가 발생했을 때 쯤이면
상황이 변했으니 블록사이즈를 점차 늘려나가자는 주장도 설득력을 가질만 했습니다.
비트코인 코어 개발자들이 아주 신중하다는 점,
중국 채굴자들이 블록사이즈 늘어나면 채굴에 불리해지므로 강하게 반대했다는 점…
비트코인 가격은 내려가고
수수료를 0.0005BTC까지 첨부하더라도 몇시간이 넘게 컨펌이 안되는 경우가 생기고
코어 개발자들 사이에서도 의견이 갈립니다.
로저 버, 마이크 헌 등 유명한 사람들이 비트코인 코드의 의사결정 방식에 대해서 비판하며 돌아서고
XT, Classic, Unlimited 등 블록사이즈 높여주는 여러 지갑 버전이 제안 되기도 하지만
결국은 1메가 블록 사이즈를 유지합니다.
그리고, 1메가를 유지한 채로 다른 해결책이 등장합니다.
세그윗
세그윗 기능은 비트코인 코어 지갑 버전 0.13.1 에서 구현되어 나왔습니다.
그 이전 버전을 돌리고 있는 노드는 세그윗 기능이 없습니다.
세그윗은 이런 옛날버전의 노드들과 공존할 수 있도록 만들어졌습니다.
트랜잭션에는 원래(옛날 버전의 노드가 알고 있는 그대로) 전자서명을 담기 위한 스크립트 부분이 있습니다.
인풋에는 보내는 사람의 전자서명이 들어가야 합니다.
보내고자 하는 1비트코인 만큼의 액수를 소유하고 있는지 증명하기 위해 개인키로 서명합니다.
전자서명은 개인키 자체를 노출시킬 필요 없이, 서명한 사람이 레알 참트루 개인키를 소유했다는걸 증명해줍니다.
아웃풋에는 받는 사람이 잠긴 소유권을 풀 수 있도록 정보를 담습니다.
이것이 예전버전의 트랜잭션이라면
세그윗 방식의 트랜잭션은 스크립트 부분에 단순히 이런 메세지를 담습니다.
"예전 버전 지갑들은 이 트랜잭션을 그냥 무시하십시오"
이 신호에 대한 해석은 예전부터 존재하는 것이기 때문에 옛날버전과 세그윗과의 혼동이 생기지 않습니다.
세그윗 트랜잭션에서는 전자서명을 스크립트 부분에서 제거하고 Segregated Witness 부분에다가 보다 효율적으로 담아서,
같은 1메가 블록사이즈 내에서도 더 많은 트랜잭션을 담을 수 있게 됩니다. 대략 1.75메가 ~ 4메가 정도로 블록사이즈를 늘린것과 같은 효과를 내는 압축률(?) 입니다. 하지만 고작 4배정도 늘리기 위한 해법이 아니라 더 많은 이점이 있습니다.
트랜잭션 멜라빌리티 문제를 더 효율적으로 봉쇄 가능해졌다는 점,
스마트 컨트랙트의 토대가 마련되었다는 점,
풀노드가 저장해야 할 블록체인의 용량을 줄일 수 있다는 점 등등이 거론되고 있는데
제가 강조하고 싶은 부분은 라이트닝 네트워크 입니다. 이부분은 다음 글에서 더 자세히 다룹니다.
소프트한 철학과 일정
하드포크가 아닌 소프트 포크.
새로운 업데이트에 동의하지 않고, 옛날버전을 돌리는 사람의 입장을 존중하면서도
체인이 분리되는 일 없이, 소프트한 변화를 추구하겠다는 것입니다.
2015년 11월에 구현하기 시작해서
2016년 4월에 릴리즈 되었고
2017년 11월 15일 까지 95%의 노드가 업그레이드를 하면 그제서야 세그윗이 가동됩니다.
만약에 그때까지 95%가 되지 않으면 다른 해법을 강구합니다.
버전 현황은 이곳 링크에서 볼 수 있습니다. https://bitnodes.21.co/nodes/
현재 40% 정도 되네요.
빠르고 급진적인 하드포크보다 더 의미있다고 보는 이유는
앞으로 다가올지도 모르는 달러 패권의 위기속에서
여러 세력의 이해관계가 얽히다 보면
자칫 배가 산으로 갈 위험도 있지 않은가 생각합니다.
쉽게 갈 수도 있었던 해법을 굳이 어렵게 오래 걸려서 돌아가는 철학이
사람들에게 "비트코인에는 불변의 안정성이 있다"라고 인정하게 만들 것입니다.