파이썬으로 배우는 블록체인 구조와 이론- 5장채굴(Mining)

Minjoo
Quantum Ant
Published in
16 min readAug 13, 2019

비트코인 참여자들은 모두가 사용의 주체이면서 동시에 관리의 주체이다.

<채굴자의 역할>

- 사용자 간의 거래를 인증하고 그 내역을 관리한다.

- 추가로 화폐를 발행하거나 회수해 공급과 수요를 조절하고 화폐의 가치를안정적으로 유지한다.

-블록을 생성한다.

* 블록? 트랜잭션을 검증하고 거래 내역을 기록한 장부

- 채굴자들은 경쟁을 통해 거래 원장을 보호한다.

<블록체인 기술이 해결해야 할 과제>

최근, 대형화된 채굴 기업이나 채굴 연합들이 엄청난 계산 능력을 바탕으로 아래와 같은 일이 발생하고 있다.

1) 블록의 생성 권한을 독차지한다.

2) 자신들이 이룩한 채굴 시스템의 가치를 유지하기 위해 공급과 수요를 조절하기도 하고 합의 정책에 큰 영향을 끼친다.

이와 같은 것은 탈중앙화 철학에 맞지 않는다.

01. 블록 헤더의 구조

블록체인 = 블록 헤더 + 블록 바디

- 블록 헤더 : 블록 바디의 정보를 요약하여 기록

블록 헤더에 기록되는 내용 : 이전 블록을 체인으로 연결하는 포인터, 머클루트(트랜잭션들을 요약한 정보), 블록 생성 시각, 작업 증명을 위해 증거로 제시되는 비츠(nBits_채굴의 난이도)와 논스(Nonce)값 등

- 블록 바디 : 아직 블록에 기록되지 않은 트랜잭션들을 모아 기록

채굴자는 블록을 생성하는데 블록 생성 시 모두가 생성될 블록이 올바른 것이라고 인정해야 하기 때문에 합의 규칙에 따라 만들어야 하고 작업 증명 과정을 거쳐야 한다.

*작업 증명(Proof of Work)? 채굴자가 만든 블록이 유효하다는 것을 스스로 증명해야 하며 그 증거를 블록 해시에 제시하여야 한다. 이 증거를 가장 빨리 제시한 채굴자가 승자가 되고 승자가 만든 블록이 블록체인에 된다. 승자는 채굴의 보상을 가져간다.

<블록 데이터 구조>

출처 : https://steemit.com/kr/@yahweh87/3

02. 버전(version)

버전 필드는 비트코인 소프트웨어의 보안된 기능을 표시

버전의 발전

버전 1 : 2009년 개발된 비트코인의 초기 버전

버전 2 : 2012년 9월 BIP-34로 보완된 비트코인 버전으로 BIP-34는 채굴자가 코인베이스를 만들 때 입력부에 블록 높이를 기록하도록 보완

버전 3 : 2015년 2월 BIP-66으로 보완된 버전으로 BIP-66은 트랜잭션 입력부에 전자서명을 기록할 때 DER(Distinguished Encoding Rule) 인코딩 규칙을 따르도록 보완

버전 4 : 2015년 11월 BIP-65로 보완된 버전으로 BIP-65는 OP코드를 추가한 보완이다. 이 OP코드를 사용하면 트랜잭션 구조의 Lock-Time을 사용하는 것보다 더 많은 기능을 만들 수 있다. (다중서명 기능의 문제점을 보완하기 위해 일부 개인키를 제3자인 변호사에게 위탁하는 escrow)

버전 5 : 2015년 10월 제안된 BIP-9는 버전 필드의 특정 비트 값을 소프트포크에 활용하는 방안이다. 현재는 이 표준이 사용되고 있다.

*escrow : 에스크로는 상거래 시에, 판매자와 구매자의 사이에 신뢰할 수 있는 중립적인 제삼자가 중개하여 금전 또는 물품을 거래를 하도록 하는 것.

개발자가 소프트포크 방식으로 비트코인 소프트웨어를 업그레이드하려면 채굴자들의 동이가 필요한데 채굴자들에게 개인적으로 물어볼 수 없기 때문에 버전 필드를 이용해 채굴자들의 의사를 확인한다. 개발자는 제안 문서인 BIP를 통해 개발 계획을 발표하고, 채굴자들은 제안 문서를 열람해 개발 계획 동참 여부를 버전의 특정 비트 값에 표시한다.

버전 필드의 크기는 4Byte(32bit)다. 채굴자들이 BIP-9 표준을 따른다면 버전의 처음 3bit는 001로 시작한다. 즉 기본 버전 값은 0x20000000이다. 이때 개발자들은 생성되는 블록의 헤더를 모니터링하면서 채굴자들이 BIP-9 표준을 따르는지 확인한다.

위 내용을 사례로 설명하면 다음과 같다. 2017년 세그윗 기능이 추가됐을 때 개발자는 다음과 같이 BIP-141 문서에 업그레이드 계획을 발표했다. 개발자들은 채굴자들이 이 계획에 동의한다면 버전의 1번 비트를 1로 세팅해 달라고 요구를 했는데 쉽게 말해 블록을 생성할 때 버전 값을 0x2000002로 기록해 달라고 요구한 것이다.

요구 기간을 정해 둔 후, 이 기간에 많은 채굴자가 버전 값의 1번 비트를 세팅하면 이 개발 계획은 채굴자들의 지지를 받는 것을 의미하여 소프트웨어 업그레이드가 진행되지만, 채굴자들의 충분한 지지를 얻지 못한다면 비트코인의 하드 포크가 발생하여 네트워크가 쪼개질 위험이 있어 업그레이드를 진행하지 못한다.

이와 같이 개발자는 버전의 특정 비트 값을 이용해 채굴자들이 지지 여부를 확인할 수 있다. 새로운 개발 계획이 수립될 떄 처음 3bit를 제외한 나머지 비트들을 임의로 사용할 수 있어 동시에 29개의 소프트포크 개발 계획을 진행할 수 있다.

03. 해시 난이도

비트코인 블록은 평균적으로 약 10분마다 한 개씩 생성되도록 설계가 되었는데 무분별하게 자주 생성될 수 있는 것을 방지하기 위해 해시 난이도는 채굴 속도를 조절하는 역할을 한다.

타깃 비츠(Target Bits)

블록헤더에 기록된 nBits는 블록 헤더 해시 값의 상한선을 의미하며 타깃이라고도 불린다. 채굴자가 하나의 블록을 완성한 후에는 헤더의 해시를 계산해 보는데 이때 이 해시의 크기가 타깃보다 작으면 이 블록은 유효한 것으로 채굴에 성공한 것이다. 반면, 타깃 보다 큰 경우 채굴자는 헤더에 기록된 논스 값을 바꿔 가면서 해시가 타깃보다 작아지는 논스값을 찾아야 한다. 이때 논스가 바뀌면 헤더의 내용이 바뀌기 때문에 해시 값도 바뀌게 된다.

채굴자 난이도 지표(Difficulty)

난이도는 현재의 타깃 값이 사토시가 생성한 블록(genesis block)의 타깃 값에 비해 얼마나 작은지에 대한 지표로 난이도는 블록을 생성하는게 최초 블록과 비교했을 때 얼마나 어려워졌는지 측정한 척도이다.

04. 해시 난이도 조절(Retarget)

타깃 값은 누가 정해주는 것이 아니라 채굴자가 스스로 제시하고 다른 노드들이 이를 확인하는 방식으로 운영되는데 채굴자는 규칙에 맞게 타깃 값을 제시하고 블록 헤더의 해시값을 이 타깃보다 작게 만들어야 한다.

타깃 값 설정 규칙

타깃 값의 목표는 약 10분마다 블록이 생성되도록 난이도를 조절하는 것이다. 채굴자는 타깃 값을 2주마다 변경해야 하며 블록이 10분마다 생성되면 2주 동안은 총 2,016개가 생성된다. 따라서 2,016번째 블록마다 새로운 타깃 값을 설정해야 한다. 타깃은 블록 번호가 2,016의 배수가 될 때 새로 설정되는데 쉽게 말해 블록 번호를 2,016으로 나눴을 때 나머지가 0인 경우 타깃을 새로 설정한다.

새로운 타깃은 타깃 값 조절 규칙에 따라

위의 공식에 넣어 분자를 분모로 나눈 값이 1보다 작으면 이전의 2,016개 블록은 평균인 10분보다 적다는 것을 의미한다. 이는 난이도가 쉽다는 것을 의미하는 것으로 타깃을 낮춰서 난이도를 높여야 한다는 것을 의미한다.

**1154642? 2,016개 블록이 생성되는데 걸린 총 시간을 의미

** 2016개인 이유? 10분마다 블록이 생성되면 1시간 6개 생성, 하루는 24시간, 2주는 14일이기 때문에 (6*24*14 =2016) 2016개가 생성된다는 것을 알 수 있다.

** 타깃 값을 2주마다 변경하는 이유? 블록 해시 첫 부분인 ‘zero’ 수를 2주마다 업데이트 하기 때문이다.

05. 머클 트리(Merkle Tree)와 머클 루트(Merkle Root)

머클 트리?

블록에 포함된 모든 트랜잭션(tx)과 위트닉스(wx)를 해시 값을 이용해 요약한 정보이다. 이진트리로 구성되며 트랜잭션과 위트니시 데이터를 보호할 목적으로 사용된다.

머클 트리의 최상단 노드를 머클 루트라고 하는데 이 값이 블록 헤더에 기록된다.

트랜잭션이나 위트니스가 일부라도 변경되면 머클 루트 값이 달라지는데 이때 블록 해시도 달라진다. 블록 해시가 달라지면 다음 블록의 헤더에 기록된 해시 포인터도 달라지기 때문에 한 번 블록에 기록된 트랜잭션들은 절대 변경될 수 없고 그 상태로 영구 보존된다.

머클트리 만드는 방법

1) 위트니스 데이터로 머클 트리를 만든다.

2) 코인베이스는 입력부에 서명 부분이 없기 때문에 첫 번째 위트니스는 0으로 설정

3) 위트니스부터 해시 값을 계산해서 트리의 하단 리프를 채운다. 이때 리프의 개수가 홀수 개이면 마지막 리프를 복제해 짝수 개로 만든다.

4) 리프를 2개씩 묶어 다시 해시를 계산한다.

5) 이 절차를 반복하면 마지막으로 한 개의 노드가 남는데 이것이 위트니스 머클루트이다.

이렇게 위트니스로 머클 트리를 만들었다. 다음은 트랜잭션으로 머클 트리를 만든다.

6) 트랜잭션인 코인베이스의 두 분째 출력부에 위트니스 머클 루트를 기록한다.

7) 나머지 트랜잭션으로 위트니스 머클 트리와 동일한 방식으로 트리를 구성한다.

8) 마지막 남은 노드가 최종 머클 루트가 된다.

9) 채굴자는 이 최종 머클 루트 값을 블록 헤더에 기록한다.

06. 엑스트라 논스(Extra Nonce)

엑스트라 논스?

논스 값의 범위를 전부 대입해도 타깃보다 작은 브록 해시를 차지 못한다면 채굴자는 다른 값을 이용해야하는 것

최근 해시 파워가 높아지면서 난이도가 계속 증가하고 있어 논스 값의 범위를 전부 뒤져도 해를 찾지 못하는 경우가 발생하고 있다. 이와 같은 문제점의 해결방안은 특정 트랜잭션을 한 개 빼거나 추가한 후 논스 값을 다시 0부터 대입해 보는 방법이 있지만 수수료와 머클 루트도 다시 계산하여 좋은 방법이라 할 수 없다.

다른 방법으로 코인베이스 트랜잭션의 입력부에 있는 스크립트 영역을 활용하는 방법이 있는데 코인베이스에는 스크립트 영역에 비어 있고 크기가 32byte이므로 숫자의 범위가 매우 넓다. 그리고 채굴자가 원하는 데이터를 기록할 수 있어 이 영역을 엑스트라 논스로 활용할 수 있다.

코인 베이스로 엑스트라 논스를 사용하며 머클 루트를 다시 계산을 해야한다. 하지만 머클 트리를 모두 계산할 필요가 없어 효율적이라고 할 수 있다.

07. 채굴 절차 흐름도

1) 채굴 시작

2) 새로운 트랜잭션 데이터 수집 및 검증

3) 수집된 트랜잭션들의 수수료 계산

4) 코인베이스 트랜잭션 생성

5) 트랜잭션, 위트니스 데이터로 블록 바디 구성

6) 트랜잭션, 위트니스 머클루트 생성

7) Retarget 필요하다면 nBits새로 계산 그렇지 않다면 nBits = 이전 값

8)nonce = 0

9) 블록헤더 생성

10) 블록 헤더 해시 계산

11) 만약 해시< nBits 이라면 채굴 성공,그렇지 않다면 nonce값을 증가시킨 후 nonce값이 Max라면 Extra nonce와 머클루트 재계산을 위해 9)으로 돌아가서 다시 계산한다. 만약 nonce값이 Max가 아니라면 8)로 돌아가서 다시 계산한다.

08. 해시 파워

해시 파워?

초당 계산 가능한 해시의 횟수로 표시

2010년 ~ 2011년 : CPU사용->GPU(Graphics Process Unit)사용

2013년 : SHA-256 해시 전용 반도체 소자인 FPGA(Field Programmable Gate Array) -> ASIC(Application Specific Integrated Circuit)사용

FPGA는 프로그래밍을 할 수 있어 오류 수정이 가능하고 초기 개발비가 저렴하지만 속도가 늦고 ASIC보다 전력 소비가 많다.

ASIC는 해시 계싼 기능을 칩에 고정시킨 것으로 수정은 불가하나 속도가 빠르고 전력 소비가 적다. ASIC의 등장으로 채굴 난이도가 크게 높아졌다.

<채굴 장비별 해시 파워 비교>

출처 : https://en.bitcoinwiki.org/wiki/Mining_hardware_comparison

향후 블록체인 기술이 해결해야 할 과제 중 하나는 강력한 해시 파워를 가진 채굴자가 네트워크를 독점하고 어떤 형태로든 영향력을 행사할 수 있기 때문에 대형 채굴자들을 중심으로 해시 파워가 증가하고 채굴 난이도가 과하게 증가하는 것은 바람직 하지 않다.

09. 비트코인 발행량

2009년 1월 3일 사토시가 제네시스 블록을 생성했을 때는 약 50BTC가 발행됐다. 비트코인 발행량은 최초 50BTC에서 시작해 210,000블록마다 절반씩 줄어든다. 50BTC->25BTC->12.5BTC->6.25BTC->…로 주어든다. 현재 보상은 12.5BTC로 연간 비트코인 발행량은

52,560블록 * 채굴자의 보상 (BTC / 블록)

으로 계산할 수 있다.

비트코인 발행량은 4년마다 절반씩 줄어들어 약 2140년이 디면 최소 단위인 1사토시 미만이 되는데 이 시점까지 발행될 총 비트코인은 약 2천 100만 BTC이다.

비트코인 발향량이 감사함에 따라 채구자의 정규 보상도 점차 감소하지만, 채굴자는 정규 보상 외에 트랜잭션들이 지급하는 수수료도 보상을 받는다. 쉽게 말해 시간이 지날수록 정규 보상은 감소하지만, 사용자가 증가하면 수수료 보상은 증가하기 때문에 총 보상은 일정하게 유지될 수 있다.

앞으로는 두 주체 모두 불만이 없는 상태로 시장에서 보상과 수수료가 자동으로 결정될 것이다.

10. 수수료와 최적 블록 사이즈

비트코인 네트워크는 중앙통제가 아닌 경쟁 시스템을 기반으로 자율적으로 운영되는 하나의 생태계이다. 채굴자들은 서로 보상을 위해 경재하고, 채굴자와 일반 사용자는 수수료를 위해 경쟁한다.

채굴자 입장

채굴의 보상을 많이 얻기 위해 ‘트랜잭션 수집/검증 속도, 해시 계산 속도, 블록 전파 속도 등의 소도 경쟁을 벌인다. 블록을 작게 만들수록 속도 경쟁에는 유리하지만, 거래 수수료는 많이 얻지 못하는 단점을 갖고 있다. 블록을 크게 만들면 수수료는 많이 얻지만, 속도 경쟁에는 불리하다. 따라서 채굴자들은 경쟁 위험 대비 총 보상을 최대로 하려는 전략을 사용한다.

일반 사용자 입장

일반 사용자들이 수수료를 많이 지급하면 채굴자가 승인하는 시간이 짧아져서 송금 시간이 단축된다. 채굴자는 수수료가 높은 트랜잭션을 선호하기 때문에 수수료가 작은 트랜잭션은 지연 처리되거나 아예 처리되지 않을 수도 있어 수수료의 크기와 처리되지 못할 위험은 서로 trade off 관계에 있다. 이에 사용자는 위험 대비 적은 수수료를 지불할 전략을 사용한다.

11. 솔로 마이닝(Solo Mining)과 풀 마이닝(Pool Mining)

솔로 마이닝?

개인이나 집단이 독립적으로 채굴 설비를 운영하는 형태로 초기에는 채굴 경쟁이 심하지 않아도 개인도 채굴 보상을 얻을 기회가 있었지만, 경쟁이 심해지면서 대규모 채굴 설비를 갖춘 형태가 등장했다. 솔로 마이너는 채굴에 성공하면 보상의 전부를 가질 수 있지만, 성공확률은 낮고 전체 보상 수익이 일정하지 않아 수익 편차가 크다는 단점이 있다.

풀 마이닝 ?

여러 채굴자가 연합해 공동으로 채굴하고 각자의 공헌도에 따라 보상을 하는 시스템이다.

- 풀 오퍼레이터 : 풀을 조직해서 관리하는 주체로 보사 분배, 시스템 관리, 블록체인 관리, S/W개발, 업그레이드, 유지보수, 채굴 서비스 등을 제공한다.

- 채굴자 : 채굴을 위해 이 조직에 참여한 주체로 채굴 장비를 운영하는 비용을 부담한다.

풀 오퍼레이터가 개별 채굴자들에게 블록 헤더를 보내면 채굴자들은 헤더의 해시 값을 계산하는데 채굴자에게 요구하는 난이도(share difficulty)를 만족하는 해시를 찾으면 풀 오퍼레이터에게 보내는데 이를 셰어(share)라고 한다.

풀 오퍼레이터는 채굴자들이 보낸 셰어(share)들 중에 타깃 난이도를 만족하는 해시가 있으면 이를 비트코인 네트워크로 보내 실제로 채굴을 수행하여 비트코인 네트워크 입장에서는 풀 오퍼레이터가 실제 채굴자이다.

보상 분배 방식

풀 오퍼레이터가 채굴 보상을 받으면 이를 공헌도에 따라 채굴자에게 분배하는데 개별 채굴자들은 자신이 보낸 셰어가 많을수록 큰 보상을 받는다.

- PPS(Pay-per-Share) 방식 : 실제 채굴 여부와 관계없이 단순히 채굴자들이 보낸 셰어의 비중에 따라 분배하는 방식

- PPLNS(Pay-per-Last-N-Shares) 방식 : 실제 채굴이 이뤄진 경우 마지막 N개의셰어 중 각 채굴자가 보낸 셰어의 비중에 따라 분배

<풀 마이닝의 점유 현황>

출처 : https://www.blockchain.com/pools

12. 블록체인의 분기

블록체인의 일시적인 분기

채굴자들이 경쟁적으로 블록을 생성하다 보면 블록 번호가 중복될 수 있는데 이때, 블록체인이 일시적이지만 두 갈래로 갈라진다. 두 갈래 중 어느 것을 인정할지는 또 그 다음 블록이 어디로 연결되는지에 따라 결정된다.

부모가 없는 블록이 발생할 수도 있는데 이것을 고아 블록(orphaned block)이라 한다. 예를 들면, 현재 블록이 100번까지 있는데 102번 블록이 발생한다면 이것을 연결할 블록이없다. 이런 경우 101번 블록이 생성되기는 했지만 아직 도착하지 ㅇ낳은 것일 수도 있기 떼문에 고아 블록을 임시 저장소에 보관했다가 101번 블록이 도착한 이후에 처리한다.

트랜잭션의 최종 승인(Confirmation)

블록체인은 일시적으로 분기가 발생하다가 다시 하나의 체인으로 유지된다. 채굴자들은 안전한 보상을 얻기 위해 취소 가능성이 적은 긴 체인을 선택하기 때문에 하나로 유지될 수 있는 것이다. 채굴자들이 더 이상 선택하지 않은 체인은 폐기가 되는데 그 안에 있던 모든 트랜잭션과 그 블록의 채굴 보상도 모두 취소가 된다.

블록체인의 마지막 블록을 팁(tip)이라고 한다. 이 번호를 블록 높이라고 하는데 팁 이전에 또 다른 분기가 있고 이 체인보다 더 긴 체인이 발생한다면 현재 보이는 팁도 폐기 될 수 있다. 팁이 최종 확정되려면 뒤에 6블록 정도가 연결돼야 한다.

참고로, 어떤 트랜잭션이 최종 승인되려면 블록 깊이가 최소 6이상이어야 한다. 즉 어떤 트랜재션 6 Confirmation 이상이면 이 트랜잭션은 최종 승인됐다고 판단한다. 그리고 채굴자가 보상으로 받은 코인베이스 트랜잭션은 100블록이 지나야 최종 승인이 된다. 즉 채굴자는 100블록 이후에 이 코인베이스에 있는 보상을 사용할 수 있 다.

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

하드포크?

분기가 발생했을 때 두 소프트웨어가 서로 호환되지 않고 계속 체인을 만든다면 이 블록체인은 영구적으로 분기가 되는데 이런 현상을 하드포크라고 한다.

소프트포크?

소프트웨어 개발 계획을 수립하고 채굴자들도 동의한 상황에서 새로운 소프트웨어가 배포될 때 대부분의 채굴자는 소프트웨어를 업그레이드하지만 아직 업그레이드하지 못한 채굴자(A)가 있다면 블록체인은 일시적으로 분기가 될 수 있다. 채굴자(A)도 소프트웨어를 업그레이드를 하게 되면 체인은 다시 하나로 유지된다. 이런 현상을 소프트 포크라고 한다.

네트워크 분리와 새로운 코인의 탄생

하드포크가 발생하면 블록체인이 영구적으로 분기되고, 네트워크도 분리가 되어 두 네트워크는 완전히 다른 기능을 수행하고 각가 다른 코인이 된다. 비트코인 네트워크가 하드포크로 분리된 사례로는 2017년 8월 세그윗기능에 동참하지 않은 채굴자들이 분리시킨 비트코인 캐시(BCH)가 있다.

네트워크 분리로 새로운 코인이 탄생하면 블록체인이 분기되기 이전의 블록들은 두 네트워크에서 모두 유효하다. 즉 누군가 분기되기 전 블록 안에 UTXO를 가지고 있다면 이 UTXO는 두 네트워크에서 모두 사용할 수 있다.

--

--