Bitcoin and Blockchain(3)

in #blockchain8 years ago (edited)

이중지불문제(Double spending problem)

디지털 화폐는 실물화폐가 아닌 컴퓨터데이터이기 때문에 복제가 가능하다. 내가 은경에게 100만원을 보내는 것을 연실에게 같은 100만원을 동시에 보낼 수 있는 것이다. 이런 이중지불은 금융에서 절대 일어나지 않아야 할 치명적 결함이다. 현대에는 이런 결함을 중개기관(은행)을 통해 해결한다. 은행은 장부를 관리해주는 위탁시스템을 통해 고객으로부터 관리비용, 보안비용 등을 청구받아 해결하고 있다. 이러한 프로세스는 은행시스템에서는 다소 비효율적이고 고객에게는 비용부담이 크다.

비트코인은 P2P네트워크를 통한 분산장부를 구성하고 이를 블록체인상에 공개함으로써 이 문제를 해결한다. UTXO(Unspent Transaction Output : 아직 소비되지 않은 거래 출력값)는 한번 사용하면 블록체인에 기록되고 블록체인 상에 공개되어 모든 참여자들이 검증하고 볼 수 있게 된다. 이 UTXO는 다시 사용할 때 검증프로세스에서 거부하는 에러가 난다. 이렇게 새로운 거래가 발생하면 수많은 노드들이 검증프로세스를 가지고 이중으로 비트코인이 사용되었는지 확인한다.(즉 이들이 은행의 관리역할을 하게 된다) 만약 동시에 이중지불을 시도한다면 새로운 분기점을 가지고 일시적으로 포크될 수 있다. 2개의 블록이 나뉘는 건데 이는 각각 다른 작업증명을 수행해야 하며 과반수의 연산력이 들어간 더 긴 체인이 주체인으로 통합되므로 이중지불 중 하나의 지불만이 정당성을 얻게 된다.
아래 기술하겠지만 51%의 연산력을 가지게 되면 이중지불도 가능한 시나리오를 만들어 낼 수 있다. 주체인 하나에서 이중지불을 할 수는 없지만 또다른 체인을 이용해 이중지불시도를 성공적으로 할 수 있다.
내가(51% 연산력 확보) 은경이에게 1BTC를 보내고 1500만원을 받았다고 하면 이 거래를 포함하지 않는 다른 블록을 다른 체인(이하 서브체인이라고 함)에서 채굴을 한다. 그리고 그 서브체인을 주체인보다 더 길게 만든 후 주체인에 보내면(메인넷에 보냄) 이 서브체인이 주체인이 되고(여기에는 은경이에게 보낸 거래가 없다) 이제 새로 연실에게 1BTC를 보낸다. 연실로부터 1500만원을 받게 되고 나는 결과적으로 1BTC로 3000만원을 얻은 셈이다.
이러한 시나리오가 가능하다. 아래 기술하겠지만 이런 식의 이중지불은 네트워크 전체를 혼란스럽게 하고 비트코인가격에도 영향을 줄 수 있기 때문에 경제적 인센티브 측면에서 보면 시도하지 않는 것이 본인에게 이롭다.

51% 공격

거래를 정당하게 만들고 안만들고는 분산된, 그리고 신뢰를 전제로 하지 않는 노드들에 의해 하나의 합의를 통해 결정된다.
이러한 합의는 자본주의의 특성을 이용해 결정(1cpu당 1표)하고 이는 블록체인에서 보안을 획득하기 위한 것으로 쓰인다.
이러한 합의에 대한 악용이 51% 공격이다.
위의 비잔틴장군의 딜레마에서 언급했지만, 블록체인은 참가자의 과반수 이상의 합의를 얻으면 블록에 포함되고 검증되어 체인에 연결된다. 여기서 과반수는 노드의 개수가 아니라 컴퓨팅파워(연산능력)이고 따라서 51%이상의 연산능력을 가진 노드들이 잘못된 정보를 갖는 거래가 참이라고 한다면 얼마든지 그렇게 할 수 있다. 그리고 올바른 정보를 가진 거래는 없던 거래가 될 것이다.
예를 들어 빵집에서 빵을 샀는데 빵집주인이 나중에 확인해보니 받은 돈이 없어질 수 있을 것이다. 빵을 산 사람의 지불한 돈은 다시 복귀된다.

이렇게 51% 이상의 연산력을 가진 노드나 세력들은 거래기록을 위조, 변조할 수 있다. 10번째 블록이 최근블록이라고 한다면 7번째 블록부터 위조, 변조한 거래기록을 채굴하여 기존 10번째 블록이 있는 체인보다 더 길게 만들 수 있고 이를 주체인으로 만들 수 있다.(블록체인에 기록된 내역은 영원히 바꿀 수 없는 것이 아니다.)
이런 공격을 51%공격이라고 한다. 즉 소수의 악의적인 세력과 다수의 선량한 세력과의 해시파워 경쟁을 벌이는 게임에서 소수의 악의적인 세력이 다수가 되어 얼마든지 공격을 감행할 수 있는 상황이다. 이는 위에서 언급한 바와 같이 경제적 유인책을 통해 방지한다.

하드포크(Hard Fork)와 소프트포크(Soft Fork)

포크는 클라이언트 소프트웨어를 업그레이드하는 것을 의미한다.

- 소프트포크

소프트 포크는 새로운 버전과 구 버전의 호환이 가능한 업그레이드이다. 결과적으로 체인split이 발생하지 않는다. 일종의 유효성 축소를 구현한다. 유효한 것들을 더 이상 유효하지 않는 것으로 축소한다. 세그윗이 대표적인 소프트포크이다.

- 하드포크

소프트웨어보다 더 강한 업그레이드에 속한다고 표현한다. 기존 체인이 문제가 생기거나 추가할 기능을 업그레이드할 때 두 갈래로 나뉘어 진행된다(새로운 체인이 생성). 따라서 기존 체인과 호환이 안된다. 큰 업그레이드이기 때문에 네트워크(채굴자 등)의 과반수 이상의 찬성(동의)을 얻어낸 후 진행한다. 네트워크의 합의를 이끌어야 체인이 분리될 수 있기 때문이다. 블록을 채굴하는 채굴자들과 유저들 모두 업그레이드를 해주어야 한다. 이는 새 버전에서 구동되는 것들은 기존에는 유효하지 않았던 것들이 유효하게 하는 유효성 확대의 변화이다.
예를 들면 블록크기증가(Big block)는 하드포크이다.

확장성(Scalability)

암호화폐의 가치는 네트워크 참여자의 증가량에 비례하여 증가한다. 아무리 좋은 합의알고리즘과 목적성을 가진다고 해도 네트워크 참여자가 없다면 그 가치도 0에 수렴할 것이다. 즉, 많은 참여자가 만들어내는 트랜잭션을 수용할 수 있는가와 관련된 것이 확장성이다. 과거에도 그렇고 지금도 그렇고 앞으로도 확장성을 해결할 솔루션의 적용이 가장 중요한 이슈가 될 것이다.

이전 포스팅에서도 말했지만 라이트닝 네트워크나 다른 솔루션들을 통해 개발하고 있지만 현재로서는 비트코인은 심각한 확장성 문제에 직면해있다. 비트코인은 초기에 법정화폐를 대체할 전도유망한 암호화폐로서 전 세계 사람들에게 큰 충격을 주었다. 화폐와 결제수단으로 현재의 페이팔과 금융시스템에 도전장을 내밀었기 때문이다. 비트코인에게는 시간과 장소에 구애받지 않고 그 즉시, 제로에 가까운 수수료로 송금할 수 있는 획기적인 무기를 가지고 있었다. 때문에 마이크로 페이먼트(초소액 결제)가 가능할 수 있겠다는 커뮤니티의 기대가 있었다.

하지만 비트코인을 사용하는 사람, 거래하는 사람들이 많아지기 시작하면서 점차 확장성문제에 크게 직면하게 되었다. 물론 확장성문제는 최초 비트코인이 나왔을 때 누군가가 제기했던 문제였다. 이에 사토시는 모든 거래들을 다 처리하지 않고 SPV(단순지불검증 : 전체 블록을 다운로드하지 않고 특정 거래(transaction)이 블록에 포함되었는지 확인)형태로 취하고 일부 노드만 Full 노드를 돌리면 된다고 의견을 제시했지만 아직까지 확장성문제가 해결되지 않고 있다. 1MB로 블록이 유지되고 있기 때문이다.

1MB의 블록사이즈를 가지고 현재 초당 3~7건의 거래를 처리할 수 있다고 알려져 있다. 단위시간(초당)당 얼마나 많은 거래를 처리할 수 있는가는 TPS(transaction per sec)로 나타내는데 비트코인은 평균 4TPS라고 한다면 VISA는 평균 4~5천TPS이다. 최대 4만TPS정도 나온다고 알고 있다. 비트코인이 VISA를 따라가려면 블록당 7~8기가바이트가 되어야 한다. 이렇게 비트코인은 지금은 글로벌 네트워크에서 오는(앞으로 올) 거래 트래픽을 감당할 수 없다. 대부분의 사람들은 비트코인이 디지털 골드로써 안전자산이 될 것이라고 전망한다. 결제수단으로써 사용되기 어렵다는 것이다. 그래도 Bitpay 통계를 볼 때 매년 비트코인 결제량이 늘어나고 있다는 것은 어떠한 여지를 남겨준다.

작년 11월까지 논의되었던 세그윗2X도 고작 블록크기를 2배를 늘리는데 그친다.
네트워크가 점차 커지면서 또 다른 문제도 발생한다. 수수료(Transaction fee)이다. 라이트코인을 설명하는 지난 포스팅을 보면 알 수 있듯 현재 비트코인 송금수수료는 $20을 넘어섰다.
이미 mempool에 대기중인 거래내역들은 블록에 포함되기를 기다리는데 채굴자들이 높은 거래수수료 순서대로 포함시키므로 안정된 블록사이즈에 많은 거래량이 몰릴수록 수수료는 높아진다. 블록사이즈 관련 이슈가 해결 또는 또다른 스케일링 해결방법(off-chain solution 등)이 적용되지 않는 한 당분간 이런 수수료증가는 계속 이어질 것이다.

수수료는 중요하다. 비트코인이 세계금융권에 도전하고자 한 무기 중 하나가 송금수수료였다.
오늘날 세계적으로 송금수수료는 상당히 높다. 국내에서만 해도 서로 다른 은행끼리의 송금에도 수수료가 꽤 많이 드는 편이다. 한국중앙은행과 금융결제원(Clearinghouse)이 중간에서 중개역할을 하고 있고 각 은행 데이터베이스의 보안비용도 만만치 않기 때문이다.
외환거래는 이보다 훨씬 심각하다. 국내 중개기관과 해외 중개기관이 더해져 5~6개의 중간다리를 거쳐가기 때문에 수수료는 20~30%에 육박한다.
예를 들면, 필리핀에서는 GDP의 15%이상이 해외에서 일하는 자국민들의 노동으로 이루어진다. 이들은 각자의 고향으로 돈을 송금하고자 하는 것이 목표인데 주로 머니그램, 웨스턴유니온 등과 같은 비싼 해외 송금업체를 찾는다. 여기서는 송금처리도 2~3일, 많게는 일주일씩 걸린다. 여기에 비트코인과 같은 암호화폐를 이용해서 송금하면 1%도 안되는 수수료로 즉시 송금이 가능하다.(그렇게 생각했었다.)
이로써 해외업체외주나 해외소액결제 등 이전에는 높은 수수료로 경제적으로 불가능했던 다양한 비즈니스와 부가가치가 창출될 수 있다. 이렇게 비효율적이고 비싼 수수료로서의 현 금융시스템을 전면적으로 재개편할 수 있는 시스템이 비트코인이었다. 하지만 아쉽게도 이러한 미래는 기대하기 힘들다. 다른 암호화폐로는 가능할 지도 모른다(해외송금으로 현재는 리플정도).

다시 돌아와서, 그렇다면 왜 사토시는 1MB를 선택했을까. 초기에는 1MB보다 작았지만 이후 1MB로 늘렸다. 해커의 DDos공격과 네트워크 전파속도 등을 고려해 1MB가 가장 적당하다고 생각하고 설계했다.
하지만 시간이 지남에 따라 점점 문제가 대두되었고 개발자들과 채굴자, 커뮤니티와 의견을 주고받으며 확장성(스케일링)문제를 논의하기 시작했다. BIP100(채굴자들의 결정으로 사이즈조절)과 BIP101(1MB->8MB로 증가) 등 여러 제안들이 초기부터 나왔었다.(BIP : Bitcoin Improvement Proposer, 비트코인 개선 제안사항) 블록사이즈 변경을 두고 개발자와 채굴자, 커뮤니티 등 각 플레이어들의 힘싸움이 전개되기도 했다(이는 다소 정치적인 모습으로 비춰진다.). 17년 8월에 비트코인 캐시가 나온 것도 이러한 스케일링에 대한 의견충돌 때문이었다.

작년 한해동안 비트코인 커뮤니티에서 뜨거운 감자였었던 세그윗에 대해 알아보자.

- 세그윗(segwit)

세그윗은 Segregated witness를 합친 용어로 ‘분리된 증인’이라고도 한다.
비트코인 블록체인의 블록구조를 보면 거래 입력값에(블록에는 복식부기처럼 차변과 대변이 있고 이는 입력값, 출력값이라고 보면 된다.) scriptSig라고 하는 전자서명부분(signature)이 있다. 여기서 이 전자서명부분을 분리하여 별도의 Witness라는 데이터구조로 분리하는 것이다. 이것이 세그윗이다. 1MB의 블록에는 300~400개의 거래내역들이 들어갈 수 있는데 전자서명부분은 1MB에서 70%이상의 메모리를 차지하므로 이를 분리해 1.7~2배 이상의 거래내역들을 블록에 포함시킬 수 있도록 한다.
이러한 세그윗을 통해 거래가변성문제, 스크립트 언어의 업그레이드(세그윗을 통해 출력값에 스크립트 버전을 명시할 수 있고 이를 통해 업그레이드도 가능하다), 스마트컨트랙트 적용가능성, 라이트닝 네트워크 등 개발 중인 기술을 적용할 수 있다.

- 세그윗2X(segwit 2X)

세그윗2X는 블록처리 용량을 2배로 늘리는 하드포크이다.
블록크기를 늘려 더 많은 거래수수료를 얻을 수 있어 채굴자들이 지지했다. 하지만 개발자들은 해킹보안에 취약해지고 채굴집중화를 심화시킬 우려가 있어 반대했다.

세그윗 2X를 지지하던 Jeff Garzik(세그윗 2X 핵심개발자)와 중국 최대 채굴업체 비트메인의 대표 우지한이 세그윗 2X 하드포크 지지를 철회하면서 세그윗2X하드포크는 취소되었었다. 이 때문에 하드포크로 인한 보상을 못 받게 되고 세그윗2X를 지지하던 세력들의 실망도 커져 비트코인 가격은 하락했다. 세그윗2X를 반대하던 사람들은 물론 매수했을 것이다.
하드포크의 실패는 비트코인 캐시에 더 많은 관심을 갖게 만들었다. 비트코인 캐시는 8MB의 블록용량을 가지고 있어서 확장성문제를 조금 더 완화해줄 수 있을 거라 생각했기 때문이다.

결국 세그윗2X가 실패로 돌아가면서 비트코인은 당분간 1MB의 블록크기를 계속 유지할 것으로 보인다. 필자는 블록사이즈를 늘리는 것을 전적으로 지지하는데 이미 많은 사람들이 알고 있고 너무나도 당연하듯 1MB의 블록사이즈를 가지고는 그 무엇도 할 수 없기 때문이다.

- 거래가변성(Transaction Malleability)

각 거래에는 txid라고 불리는 해당거래를 식별할 수 있는 거래아이디가 있다.
거래가변성은 거래내용은 그대로 두고 Txid만 변경해서 동일한 서로 다른 거래를 생성할 수 있게 하는 일종의 버그이다.

예를 들면 은경이가 다은이에게 5BTC를 보내는 거래를 하고 이를 거래1이라고 한다. 다은이는 거래1이 블록에 포함되기 전에 은경이가 보낸 5BTC가 담긴 거래에서 Txid만 바꾼(전자서명을 바꾼) 거래2을 다시 네트워크에 전파한다. 거래2가 포함된 블록이 먼저 채굴되어 저장된다고 하자. 다은이는 은경이에게 거래1이 안 왔다고 말을 하고 은경이는 거래1의 txid를 찾아보지만 블록체인에 없다. 이미 동일한 거래내역을 담은 거래2가 거래블록에 포함되어 거래1은 노드들의 검증에 의해 파기되었다. 따라서 아무것도 모르는 은경이는 다시 다은이에게 새로운 5BTC을 전송하게 되고 다은이는 총 10BTC을 받게 된다. 5BTC은 그래도 한번의 거래에만 쓰이기 때문에 이중지불의 문제는 아니지만 거래 가변성을 이용하게 되면 이것 역시 거래안정성을 위협하는 것이다.
이 외에도 Txid만 바꾸어 계속 네트워크에 전파하는 DDos공격도 가능하게 된다.
이것이 거래 가변성(Transaction malleablility) 문제이다.
이는 여러 방법 중 세그윗을 통해 가장 잘 해결된다. Segwit 업데이트를 하게 되면 txid에서 거래가변성을 일으킬 수 있는 전자서명부분을 거래에서 분리해 내어 따로 관리, 보관할 수 있기 때문에 거래가변성 문제를 해결할 수 있다.

                                           ----- 다음 편에 계속

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.081
BTC 59524.83
ETH 1569.75
USDT 1.00
SBD 0.42