Chapter 9. 블록

Paul Woo
Programming Bitcoin
7 min readMay 31, 2020

아래 글에서는 “밑바닥부터 시작하는 비트코인(Programming Bitcoin) -한빛미디어(2019)”의 Chapter 9. 블록의 구조와 작업증명에 대한 내용을 다룬다.

Writer. 우승윤

Programming Bitcoin Series

Chapter 1. 유한체
Chapter 2. 타원곡선
Chapter 3. 타원곡선 암호
Chapter 4. 직렬화
Chapter 5. 트랜잭션
Chapter 6. 스크립트
Chapter 7. 트랜잭션 검증과 생성
Chapter 8. p2sh 스크립트
Chapter 9. 블록
Chapter 10. 네트워킹
Chapter 11. 단순 지급 검증
Chapter 12. 블룸 필터
Chapter 13. 세그윗

컴퓨터와 인터넷의 장점 중 하나는 데이터가 유기적이고 또 유동적이라는 것이다. 데이터를 빨리 주고 받을 수 있고 쉽게 바꿀 수 있기에 SNS에 자신의 글을 올리고 역동적인 게임을 할 수 있다. 하지만 누구나 모든 데이터를 바꿀 수 있게 되면 어떨까? 악의적인 일부 사람들이 사칭을 하거나 게임을 마음대로 조작하는 일들이 팽배하게 될 것이다. 그렇기에 정보 시대에서 제일 중요한 것은 보안이라고 해도 과언이 아니다.

비트코인은 소유의 개념을 다루는 기술인 만큼 보안의 중요성은 절대적이다. 보안 취약점의 대표적인 악용사례는 바로 이중지불 문제다. 예를 들어, 비트코인 소유를 증명하는 거래 내역 장부를 마음대로 바꿀 수 있는 사람이 있다면 하나의 비트코인을 여러 번 사용할 수 있게 되고, 그러면 비트코인은 자연스럽게 자산으로서의 가치를 잃게 될 것이다.

비트코인의 블록

블록체인은 바로 이 문제에 대한 해결책을 중심으로 구상되었다. 순서대로 기록된 거래내역을 블록에 담아 전파하여 체인의 형태로 보관하여 같은 거래내역이 두번 사용되는 것을 막는다. 또한, 노드들이 거래내역을 하나하나 전파하는 비효율을 막기 위해 블록은 10분에 한번씩 생성된다.

코인베이스 트랜잭션

블록의 첫번째 요소는 코인베이스 트랜잭션이다. 코인베이스 트랜잭션은 블록을 채굴한 마이너한테 가는 보상 역할을 하는 트랜잭션으로서 일반 트랜잭션과 다를 건 없지만, 네트워크 참여자가 코인을 보내서 발생하는 트랜잭션이 아닌 만큼 아래와 같은 특성들을 지니고 있다:

  1. 하나의 입력을 가진다
  2. 그 입력의 이전 트랜잭션 해시값은 32바이트의 00
  3. 그 입력의 이전 트랜잭션 출력 번호는 ffffffff

이렇듯 원래는 이전 트랜잭션, 즉 소비되는 트랜잭션에 대한 대한 정보가 들어가야할 곳들이 특정 데이터로 채워져 있다. 비슷한 맥락에서 원래는 자물쇠 역할을 하는 코드가 들어가야하는 ScriptSig란에는 마이너가 원하는 메세지를 새겨 넣을 수 있다. 대표적인 예로 사토시 나카모토가 생성한 비트코인의 첫번째 블록인 제네시스 블록의 코인베이스 트랜잭션에는 비트코인 탄생비화에 대한 힌트를 주는 타임지의 기사 제목과 날짜가 기록되어 있다,

‘The Times 03/Jan/2009 Chancellor on brink of second bailout for banks’

하지만 마이너가 ScriptSig 전체의 권한을 갖게 되면 같은 메세지를 사용하는 코인베이스 트랜잭션들의 해시값인 ID 또한 매번 같아지기 때문에 가빈 안드레센의 BIP0034에 의해 코인베이스 트랜잭션의 ScriptSig란의 첫 부분에는 블록 높이가 의무적으로 들어가게 되었다.

블록헤더

블록의 두번째 요소는 블록헤더다. 블록헤더는 책 내용에 대한 함축적인 정보를 담은 커버나 목차처럼 블록의 수많은 트랙잭션에 대한 메타 데이터를 담고 있는 80 바이트 크기의 데이터다. 블록헤더의 크기는 전체 블록의 0.023% 정도 밖에 되지 않기 때문에 간편 지급 증명 (simplified payment verification, SPV) 등의 활용도를 가지고 있다. 블록헤더의 구성요소는 아래와 같다:

Image by Soobok Jin

작업증명

작업증명 (Proof of Work; POW)은 우리가 흔히 ‘채굴’이라고 부르는 행위로서 블록체인의 보안을 강화하는 동시에 탈중앙화를 가능하게 한다. 블록을 임의의 채굴자가 생성하면 모든 노드들이 검증을 한 후 전파하기 때문에 탈중앙화가 실현되고, 전체 네트워크가 결국에는 수많은 블록들이 이어져 있는 이 장부를 공유하기 때문에 보안을 확보할 수 있는 것이다. 또한 네트워크가 탈중앙화되면 더이상 하나의 기관에 의존하지 않아도 되기 때문에 단일 장애점 (Single Point of Failure)같은 위험으로부터 또한 안전해진다. 이 과정에서 핵심이 되는 블록의 생성과 연결하는 일의 중심에 작업증명이 존재한다.

블록을 생성하고 검증하는 일에 인센티브가 없으면 아무도 하지 않을 것(소수의 사람들이 하더라도 네트워크를 쉽게 조작할 수 있어 보안성이 떨어질 것)이기 때문에 블록을 성공적으로 생성한 채굴자는 일정량의 비트코인을 코인베이스 트랜잭션을 통해 보상으로 받게 된다. 채굴에 실패한 노드들은 다음 보상을 노리기위해 최대한 빨리 생성된 블록을 검증하고 전파한다. 채굴하기는 어렵지만 검증하기는 쉬운 비대칭적인 특성 덕에 이것이 가능하다. 그렇다면 보상을 원하는 수많은 노드들 중 누가 블록을 생성할 수 있는 권한을 갖게 될까?

이 질문에 답하기 위해 왜 ‘채굴’이 작업증명에 대한 적절한 비유인지에 대해 알아보자. 보석을 채굴하기 위해서는 광탄에서 수많은 가치 없는 돌들 속에서 가치 있는 광석을 찾아내야 한다. 한마디로 하나의 보석을 찾기 위해서 수많은 돌들을 거쳐야 한다. 이 전체 광탄을 블록헤더의 모든 HASH256의 경우의 수라고 보면 되고, 그 중에서 보석은 목푯값과 일치하거나 낮은 해시 값이다.

여기서 목푯값은 앞서 간단히 살펴본 블록헤더의 비트값 필드에 있는 수치로 계산할 수 있다. 비트값은 4바이트로 이루어져 있는데, 첫 1바이트가 지수고 나머지 3바이트가 계수라고 했을 때 아래의 공식에 대입하면 된다:

목푯값 = 계수 * 256^(지수 — 3)

이 목표에 다다르기 위해서는 목푯값을 만족하는 해시값이 나올 때까지 논스값을 계속해서 바꿔가며 해싱 하는 방법 밖에 없다. 다만 논스값의 크기가 4바이트로 제한된 만큼 2^32 개의 해시 내에서 필요한 해시를 찾지 못했을 경우에는 코인베이스 트랜잭션의 ScriptSig란을 바꿔야한다 (하나의 트랜잭션이 바뀌면 머클루트의 해시 또한 바뀌기 때문에).

또한, 목표값은 정해져 있지 않고 평균적인 블록 생성 시간이 10분 보다 더 오래 걸렸냐 적게 걸렸냐에 따라 아래 공식에 의해 2016번째 블록마다 난이도가 조절된다.

(시간 차이) = (난이도 조정 기간의 마지막 블록 타임스탬프) — (난이도 조정 기간의 첫번째 블록 타임스탬프)

***시간 차이의 변동성을 4배로 제한하기 위해 최대값은 8주며 최소값은 3.5일이다.

새로운 목푯값 = 이전 목푯값 * (시간 차이) / (2주간의 초 단위 시간)

비트코인 난이도 변화와 그에 따른 가격 변동

이렇듯 작업증명은 현실세계와 가장 밀접해 있는 비트코인의 중심이라고 볼 수 있다. 물론 51%의 해시 파워가 특정 개인이나 단체에 집중되면(아직까지 그런일은 없었지만) 중앙화된 권력이 탄생하는 51% 어택이나 과도한 전력 소비라는 단점들도 존재하지만, 작업증명은 신뢰가 쌓이지 않은 수많은 개인들로 견고한 시스템을 최초로 구현했다는 점만으로도 새로운 디지털 시대의 개막을 알리기에 충분했다.

--

--