비트코인에 적용된 합의 알고리즘에 대한 개념정리를 하기 앞서 1982년 레슬리 램포트 와 쇼스탁이 공저한 논문에서 처음 언급된 비잔티움 장군 문제에 대해 살펴보도록 하겠습니다. 이 논문에서 언급된 비잔티움 장군 문제는 지리적으로 떨어진 상태에서 각 부대의 지휘관들이 전령을 통해 교신하면서 공격 계획을 함께 세우는 상황을 가정하고 있습니다. 이 부대의 지휘관 중 일부에는 배신자가 섞여 있을 수 있고, 배신자는 규칙을 충실히 따르는 충직한 지휘관들과 달리 규칙에 얽매이지 않고 마음대로 행동할 수 있습니다. 이때 배신자의 존재에도 불구하고 충직한 지휘관들이 동일한 공격 계획을 세우기 위해서는 충직한 지휘관들의 수가 얼마나 있어야 하며, 이 지휘관들이 어떤 규칙을 따라 교신해야 하는지에 대한 문제가 바로 비잔티움 장군 문제입니다.
즉, 비잔티움 장군의 문제는 분산 처리 시스템에서 어떤 데이터를 주고 받을때 악의적인 사용자가 데이터를 조작하여 잘못된 데이터를 전달하였을 경우 시스템은 어떻게 데이터를 검증할 수 있는지에 대한 문제를 제기한 내용입니다.
앞서 살펴본 비잔티움 장군 문제와 같이 어떤 사용자가 악의적인 마음으로 데이터를 변경하여 네트워크에 잘못된 데이터를 전파할 수 있음으로 전송 받은 데이터가 올바른 데이터인지 검증하는 방법이 반드시 필요합니다. 분산 처리 시스템 및 탈 중앙화된 시스템에서는 네트워크에 연결된 사용자의 데이터를 검증하고 관리하기 위한 방법으로 합의 알고리즘을 사용하고 있으며 비트코인 프로토콜에서는 작업 증명(Proof-of-Work) 방식의 합의 알고리즘을 사용하고 있습니다.
작업 증명 방식의 합의 알고리즘에 대한 개념정리를 하기 위해서는 채굴 과정이 왜 필요했고, 어떻게 이루어지는지에 대한 선행학습이 필요합니다. 지난 비트코인뽀개기 5편에서 언급한 채굴(마이닝)의 필요성과 채굴 과정에 대해 먼저 살펴보도록 하겠습니다.
'보상'의 필요성
탈 중앙화된 금융 시스템이 유지되기 위해서는 개인의 '희생'이 필요합니다. 예를 들어 P2P 네트워크 중 하나인 토렌트 프로그램을 생각해보겠습니다. 토렌트에 접속하는 대다수의 구성원들은 자신이 원하는 파일을 다운로드 받기 위해 접속하며, 다운로드가 완료될 경우 해당 프로그램을 종료합니다.
즉 다른 구성원들을 위해 업로드 기능을 활성화하여 자신의 컴퓨터 자원을 '희생'하는 구성원은 극히 소수일 수밖에 없습니다. 하지만 탈 중앙화된 금융 시스템이 정상적으로 동작하기 위해서는 시스템을 유지시켜야 하는 '이유'와 '목적'을 구성원들에게 제공해야합니다.
비트코인 프로토콜은 탈 중앙화된 금융 시스템이기 때문에 네트워크의 참여자들의 컴퓨팅 자원을 소모하여 시스템이 유지되어야합니다. 즉, 비트코인 네트워크에 연결된 수 많은 노드들 중 누군가는 비트코인 거래 내역을 기록하고, 검증하며 검증된 거래 내역을 블록에 담아 전파해야합니다.
이러한 작업을 수행하기 위해서는 네트워크에 연결된 노드들의 컴퓨팅 자원을 소모해아하며, 아무런 '보상'없이 컴퓨팅 자원의 '희생'만을
요구하기엔 무리가 있습니다. 이러한 문제점을 해결하기 위해 비트코인 프로토콜에서는 새로운 블록을 생성하고 전파한 노드들에게 보상의 개념으로 신규 발행되는 비트코인을
지급하였으며, 새로운 블록을 생성하고 검증하는 작업을 통해 보상을 얻는 행위를 채굴(마이닝)
이라고 합니다.
* 즉, 채굴이란 새로운 블록을 생성한 댓가로 비트코인을 지급받는 행위이며, 비트코인을 지급받기 위하여 채굴자는 새로운 블록을 생성하게되는것입니다.
채굴자는 target보다 작은 블록 해시 결과 값을 갖는 블록을 생성하기 앞서 nonce 정보를 제외한 모든 데이터를 미리 알 수 있습니다. 채굴자가 nonce 정보를 변경할때마다 해시 함수의 특징으로 인하여 블록 해시 결과 값은 전혀 다른 결과 값이 출력됩니다. 즉, 채굴자는 nonce의 값에 어떤 데이터를 입력해야지만 target보다 작은 블록 해시 결과 값을 갖는 블록이 생성되는지 예측할 수 없으며, 오직 nonce의 값을 0부터 1식 증가 시키면서 target보다 작은 블록 해시 결과 값이 나올때까지 무한 반복작업을 수행해야합니다.
* 해시함수는 메시지의 오류나 데이터의 변조를 쉽고 빠르게 탐지할 수 있는 기술이며, 데이터의 무결성을 제공하기 위해 사용됩니다. 해시함수는 매우 빠른 데이터 검색을 위한 소프트웨어에서도 널리 사용되며, 비트코인에서는 SHA-256 방식의 해시 함수를 사용하고 있습니다 (해시 함수는 아래와 같은 특징을 가지고 있습니다).
새로운 블록을 생성하기 위한 연산 과정을 1초에 몇번이나 수행할 수 있는지에 대한 수치 정보를 해시 파워
라고 표현합니다. 해시 파워가 높은
사용자는 더 많은 연산을 수행할 수 있으며, 더 많은 연산을 수행한 사용자가 상대적으로 더 많은 블록을 생성할 수 있습니다.
* 비트코인 프로토콜에서는 더 많은 연산을 수행한 사용자가 더 많은 일을 했다고 판단하며, 더 많은 연산을 수행한 사용자가 네트워크에 더 많은 기여를 했음으로 더 많은 보상을 지급 받을 수 있도록 설계되었습니다.
비트코인의 가치가 상승하자 채굴을 통해 얻을 수 있는 '보상' 금액은 커지고, 자연스럽게 더 많은 채굴자들이 더 많은 보상을 얻기 위하여 남들보다 빠른 연산력을 원하게됩니다. 더 많은 보상을 얻기 위해 네트워크에 연결된 사용자들간의 경쟁이 가속화될 경우 비트코인 네트워크의 전체 해시파워가 상승됩니다.
비트코인 프로토콜에서는 블록 생성 주기를 유지하기 위하여 2주에 한번식 네트워크의 전체 해시파워에 비례되는 난이도 값을 설정합니다. 경쟁이 가속화되면서 비트코인 네트워크의 전체 해시파워가 높아지면 난이도 또한 상향되어 새로운 블록을 생성하기 위해 더 많은 연산력이 요구됩니다.
* 경쟁이 가속화되면서 새로운 블록을 생성하기 위해 더 많은 연산력이 요구되어지며, 연산력이 올라간 만큼 컴퓨터의 전력 소모 또한 증가되는 단점이 발생합니다. 하지만 경쟁이 심화될수록 비트코인 네트워크의 보안은 강화됩니다.
만약 악의적인 사용자가 블록에 담긴 거래 내역 중 일부를 삭제했다고 가정해보겠습니다. 블록에 담긴 거래 내역이 변경되었을 경우 해시 함수의 특징으로인하여 블록 헤더에 저장된 머클 루트 결과 값이 변경될 것이며, 머클 루트 결과 값이 변경되었기 때문에 블록 해시 결과 값 또한 변경될것입니다. 변경된 블록 해시 결과 값이 target보다 작지않다면 target 보다 작은 블록 해시 결과 값을 찾기 위하여 다시 처음부터 임의의 nonce 값을 대입하여 target 보다 작은 블록 해시 결과값을 찾아야만합니다.
악의적인 사용자는 블록의 정보를 조작하였을 경우 target보다 작은 블록 해시 결과 값을 얻기 위해 다시 처음부터 블록의 nonce 값을 찾아야하지만 경쟁이 가속화되어 블록 생성을 위한 더 높은 연산력을 요구하게될 경우 새로운 블록을 생성하기 조차 어려운 문제점이 발생됨으로 보안이 강화되는것입니다.
이상으로 비트코인뽀개기 9편을 마치며 다음 10편에서는 오늘 학습한 내용에 이어서 51% 공격과 같은 네트워크 공격 유형에 대해서 자세히 알아보는 시간을 갖도록 하겠습니다.
https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98 https://ko.wikipedia.org/wiki/%EB%B9%84%EC%9E%94%ED%8B%B0%EC%9B%80_%EC%9E%A5%EC%95%A0_%ED%97%88%EC%9A%A9