파이썬으로 배우는 블록체인 구조와 이론 — 1장 비트코인 네트워크의 개요(3)

Siwoo
Quantum Ant
Published in
5 min readJul 20, 2019

11. 블록의 크기 제한과 비트코인의 확장성

비트코인은 블록의 크기가 1MB로 제한돼 있다. 그러면 한 블록에 들어갈 트랜잭션의 개수도 제한을 받는다. 이 문제를 비트코인의 최대 처리 용량과 확장성(scalability)문제라 한다.

확장성 문제를 해결하려면 한 블록에 들어가는 트랜잭션의 개수가 많아지도록 블록의 크기를 늘려야 한다. 그러러면 합의 규칙을 바꿔야 하기 때문에 전체 노드가 합의를 통해 소프트웨어를 업그레이드 해야 한다.

합의가 이뤄지지 않은 상태로 업그레이드가 진행되면 블록체인이 분리되는 현상이 발생하게 되는데 이를 하드포크라 한다. 하드포크를 방지하려면 기존 소프트웨어와 새로운 소프트웨어가 공존할 수 있어야 한다. 기존SW가 점차 사라지면서 새로운 기능이 정착될 수 있다. 이런 방식을 소프트포크라 한다.

트랜잭션 데이터중 전자서명이 큰 비중을 차지하는데 전자서명을 없애면 트랜잭션 데이터의 크기가 상당히 줄어든다. 그러면 더 많은 트랜잭션을 넣을수 있고 확장성 문제를 완화할 수 있는데 이러한 방법을 세그윗(segregated witness, SegWit)이라고 한다.

개발자들이 세그윗을 제안했을 때 노드들의 합의가 이뤄지지 못해 세그윗을 따르는 기존의 비트코인과 따르지 않는 비트코인 캐시(Butcoin Cash:BCH)로 분리됐다.

12. 비트코인 지갑과 지갑 주소

비트코인을 주고받으려면 주소가 필요하다. 송금자는 수금자의 주소로 비트코인을 보낸다. 그리고 비트코인 주소는 지갑(Wallet)에 보관된다. 지갑 애플리케이션은 주소와 키를 관리하고, 트랜잭션을 생성하고 검증하는 등 다양한 기능을 수행한다.

일반 사용자의 지갑

비트코인 지갑은 키(Key) 관리, 잔액 관리, 거래 생성, 거래 확인, 거래 내역 관리 등의 기능을 수행한다.

자기 주소로 받은 비트코인은 지갑에 보관되는 것이 아니라 블록체인에 보관된다. 지갑은 블록체인에 저장된 비트코인을 사용할 수 있는 권한만 가지고 있다. 만약 지갑을 분실하면 블록체인에 보관된 자기 비트코인은 영원히 사용할 수 없다. 따라서 지갑 관리는 매우 중요하다. 비트코인은 탈중앙화 방식으로 관리 주체가 없기 때문에 모든 책임은 사용자에게 있다.

개발자, 전문가 측면의 지갑

비트코인 지갑은 개인키(Private Key), 공개키(Public Key), 지갑 주소(Address)로 구성된다.

개인키는 블록체인에 저장된 비트코인이 자기 소유임을 증명할 때 사용된다(전자서명).

공개키는 다른 노드들이 송금자의 증명이 맞는지 검증할 때 사용된다(전자서명 검증).

지갑의 구성 요소

13. 트랜잭션(Transaction)생성

비트코인은 암호화폐를 교환하기 위한 시스템이다. 암호화폐를 교환하는 절차가 바로 트랜잭션이다. 따라서 비트코인의 가장 중요한 목적은 트랜잭션이고 나머지 요소들은 트랜잭션을 안전하게 만들기 위한 보조 수단이라 할 수 있다.

트랜잭션 생성

트랜잭션은 입력부(input)출력부(output)로 구성된다. 입력부에는 송금자가 사용 가능한 잔액과 전자서명이 기록된다. 출력부에는 수금자의 주소와 송금할 금액이 기록된다. 송금자가 비트코인을 송금하려면 이런 구조로 트랜잭션을 만들어 비트코인 네트워크로 송출해야 한다.

트랜잭션 생성

블록체인과 트랜잭션 체인

블록체인에는 모든 트랜잭션이 기록돼 있고 트랜잭션들은 체인으로 연결돼 있기 때문에모든 거래 내역을 추적할 수 있다. 블록체인은 공공거래장부이고 모두에게 공개돼 있으므로 거래가 매우 투명하게 이뤄진다. 즉, 누가 누구에게 얼마를 송금했는지 파악할 수 있다는 공개를 통해 신뢰를 구축한다는 발상이다.

14. 트랜잭션 전송

실제 트랜잭션 사례(출처 : blockchain.info/tx/)

지갑 주소 3CUR~에서 32fZ~로 0.39415..BTC를 보냈고, 다시 1394~로 0.023..BTC를 보낸 사례다. 이 트랜잭션은 2019.07.19 04:59:51에 생성됐고, 정상적으로 승인되어 586022번 블록에 등록됐다.

15. 채굴

채굴자는 트랜잭션을 모아 블록을 생성한다. 선택한 트랜잭션들의 유효성을 일일이 검증하고, 수수료를 집계한 후 트랜잭션들을 한데 모아 블록 바디를 구성한다. 트랜잭션들의 해시 값을 계산해서 머클트리를 만들고 머클루트를 블록 헤더에 기록한다. 또한 이 블록이 연결될 이전 블록의 해시 값을 계산해서 블록 헤더에 기록한다. 이 상태에서 현재의 Bits 값이 제시하는 조건에 맞는 논스 값을 찾아 블록헤더에 기록하면 블록이 완성된다.

블록 데이터 구조
채굴 과정

--

--