블록체인 코어 시리즈: 작업증명(PoW)

어떻게 간단한 해시 함수가 블록체인의 보안을 유지할 수 있는지

Yoonjae Yoo
DNEXT
11 min readJul 22, 2019

--

블록체인 코어를 이해하는 것은 매우 중요합니다. 전세계적인 블록체인 엔지니어에 대한 높은 수요에도 불구하고 코어 레벨까지 이해하는 개발자 분들을 찾기가 어려웠습니다.

이에 보다 많은 분들이 코어 지식을 접할 수 있는 계기가 될 수 있도록 블록체인 코어 시리즈를 연재합니다. 많은 관심 부탁드립니다.

  1. 작업증명(PoW)
  2. 지분증명(PoS) Part I

작업증명

작업증명이라는 말은 영어로 Proof of Work, 즉 “작업을 통해서 증명을 한다"라는 의미입니다. 이 작업은 어떤 것일까요? 바로 해시값을 구하는 작업입니다. 그럼 이 작업은 왜 하는 것일까요? 바로 블록체인의 보안을 유지하기 위해서입니다. 한 문장으로 정리하면 아래와 같습니다.

작업증명은 블록체인의 보안을 유지하기 위해 해시값을 구하는 과정이다.

하지만 이렇게만 얘기하면 잘 이해가 가지 않을 것입니다. 해시값을 구하는 것이 어떻게 보안을 유지하는 데에 도움을 줄 수 있을까요? 그것이 바로 오늘 얘기할 주제입니다!

아무도 믿을 수 없는 블록체인

모든 블록체인은 블록 생성 주기(비트코인의 경우 10분)를 가지고 이 생성 주기마다 새로운 블록이 생성되고 블록체인에 추가됩니다. 그리고 이렇게 생성된 블록은 가장 중요한 정보인 거래 내역을 담고 있습니다.

모든 블록은 가장 중요한 정보인 거래 내역을 담고 있다.

10분 동안 전세계에서 일어난 거래를 채굴자가 선별적으로 선택하여 채굴작업을 하게 되고 이 작업이 완료되면 블록은 확정 상태가 됩니다. 그리고 확정된 블록의 거래는 믿을 수 있는 것이 됩니다. 이 확정에 필요한 채굴 작업이 바로 작업 증명인 것입니다. 즉, 작업 증명을 하지 않으면 믿을 수 있는 거래를 만들어내지 못합니다.

그럼 왜 이렇게 복잡한 과정을 거쳐서 믿을 수 있는 거래를 만들까요? 그냥 거래가 일어나면 바로 장부에 포함시키고 이를 네트워크에 전파하면 되는 것 아닌가요? 굳이 이렇게 복잡한 채굴 과정을 통해 보안을 유지해야하는 이유는 아무도 믿을 수 없기 때문입니다.

블록체인은 기본적으로 열려있는 시스템입니다. 누구나 노드가 될 수 있고 이를 제재하는 관리자는 존재하지 않습니다. 따라서 설령 시스템을 망치려드는 악의적인 의도를 가진 노드(비잔틴 노드라고 지칭됩니다)가 네트워크에 참여하더라도 네트워크는 정상적으로 작동해야 합니다. 즉, 10분마다 유효한 거래가 주기적으로 생성되어야 한다는 것입니다.

믿을 수 없는 악의적인 노드가 참여하더라도 네트워크는 정상적으로 작동하는 것이 보장되어야 합니다. 달성하기 쉬운 목표일까요? 그렇지 않습니다. 그래서 2009년 비트코인이 탄생하기 전 나타났던 수많은 전자화폐 시스템은 실패했습니다. 그리고 그들과 비트코인이 달랐던 점은 바로 작업증명을 차용했다는 점에 있습니다.

유효한 해시값 = 난이도 이하의 값

작업증명의 핵심은 누구나 그 규칙을 따라야 한다는 것입니다. 즉, 새로운 블록을 생성하기 위해서는 누구나 평균 10분(비트코인 기준)의 연산력을 투입해야하는 것이 보장되어 있습니다. 여기서 말하는 연산력이란, 유효한 블록을 생성하기 위해 투입되어야 하는 수학 연산을 의미합니다. 그리고 유효한 블록을 만들기 위해서는 유효한 해시값을 찾아야 합니다.

아마도 두가지 의문이 들 것입니다. 유효한 해시값을 찾는 것이 어떻게 블록 생성과 연관되어 있는가? 그리고 누구나 평균 10분의 연산력을 투입해야하는 것이 어떻게 보장될 수 있는가?

우선, 평균 10분이라는 시간은 동적으로 조정됩니다. 2016 개의 블록마다 노드들은 난이도를 재계산합니다. 그래서 만약 2016개의 블록을 생성하는데에 20160분 이상이 걸렸으면 난이도를 조금 하락시키고, 반대로 그 이하가 걸렸으면 난이도를 상승시킵니다. 채굴 시간은 상황에 따라 변화될 수 있는 값이고 핵심은 난이도에 있습니다. 그렇다면 이 난이도의 실체는 무엇일까요?

난이도는 유효한 해시값을 찾는 과정과 밀접하게 연관되어 있습니다. 유효한 해시값이란 난이도 이하의 해시값입니다. 네, 그게 다입니다. 난이도 이하면 무조건 유효한 해시값입니다. 어렵지 않죠? 그리고 난이도는 아래와 같이 표시됩니다.

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

위 16진수의 난이도는 앞에 8개의 0이 존재하고 뒤에는 56개의 F가 나타나는 32바이트 숫자입니다. 모든 블록은 이와 같은 난이도 목표를 가지고 있고 이 난이도 목표가 2016개의 블록마다 새로 계산되는 것입니다. 그리고 작업 증명은 바로 난이도 목표 이하의 해시값을 찾는 것입니다. 어렵지 않죠?

1)0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2)0x00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3)0x0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

1번 해시값은 난이도 목표보다 큰 값입니다. 2번 또한 난이도 목표보다 큰 값입니다. 3번 해시값만이 난이도 목표보다 작은 값입니다. 그리고 난이도 목표보다 작은 유효한 해시값을 찾았을 때에는, 앞에 연속적으로 나타나는 0의 개수가 난이도 목표의 그것보다 같거나 더 많다는 특징이 있습니다.

논스

이제 난이도 이하의 값이 유효한 해시값이라는 것을 알았습니다. 그렇다면 이 값은 어떻게 찾는 것이고 왜 모든 노드가 이 값을 찾기 위해 노력을 해야하는 것일까요?

블록체인의 모든 블록은 헤더와 거래 목록으로 구성되어 있습니다. 그 중 헤더는 비트코인 기준으로 아래와 같은 80바이트의 데이터입니다.

비트코인의 블록 헤더

헤더를 구성하는 6가지 값중 version, prev_block, merkle_root, timestamp, bits 다섯가지는 채굴에 앞서 결정이 되어 있습니다. 그리고 이 값은 네트워크에 참여하는 어떤 노드라도 손쉽게 얻을 수 있는 값입니다.

하지만 nonce는 다릅니다. 이 nonce는 정해져 있지 않습니다. 가능한 범위는 0에서부터 2³² 까지의 모든 숫자이지만 어떤 것이 정답인지는 아무도 알 수가 없습니다. 직접 연산력을 투입하기 전까지는요. 작업 증명을 통한 블록 채굴을 하는 과정은 결국 이 nonce를 찾는 과정인데요, 수학적인 다른 기법을 통해 이 과정을 단축시키는 것은 불가능합니다. 오로지 직접 nonce를 하나씩 바꿔가면서 직접 연산을 해보아야합니다.

여기서 얘기하는 연산의 구체적인 과정은 이렇습니다. version, prev_block, merkle_root, timestamp, bits, 그리고 nonce까지 80바이트의 데이터를 SHA256 함수에 집어넣어 32바이트의 값을 구합니다. 그리고 이렇게 구해진 32바이트 값을 한번 더 SHA256 함수에 집어넣어 최종 해시값을 구합니다. 이 값이 난이도 목표보다 작은지 비교하는 것입니다. 이것이 하나의 nonce에 대한 연산인데 만약 난이도 목표보다 작다면 더이상 연산을 할 필요가 없습니다. 유효한 nonce를 발견했고 이는 유효한 해시값의 발견, 즉 유효한 블록을 발견한 것입니다.

하지만 현실은 녹록하지 않습니다. 몇번 해시값을 구했을 때에 유효한 것이 나올지는 아무도 알 수가 없습니다. 0~2³²까지 값을 변화시키면서 거의 무한대에 가까운 연산을 해봐야 합니다. 손으로 이 작업을 하지 않는 것이 얼마나 다행인가요! 우리의 CPU 혹은 GPU 그리고 최근에는 채굴 전용 반도체가 이 작업을 해줍니다. 만세!

이렇게 갖은 고생끝에 난이도 목표보다 작은 해시값을 발견했다고 가정해봅시다. 해당 nonce 값은 매우 소중합니다. 최신 블록에서 빠져있던 유일한 정보인 nonce를 전세계에서 내가 최초로 발견한 것이니까요! 그리고 이 노력에 대한 보상으로 여러분은 12.5 BTC에 해당하는 채굴보상을 받을 수 있습니다.

새로운 블록에 대한 집단 검증

이제 nonce 를 바꿔가면서 수행하는 채굴 작업에 대해서는 이해했을 것입니다. 그렇지만 한가지 남아있는 의문은 바로, 굳이 nonce를 발견하지 않고 채굴 작업을 우회할 수 있는 방법은 없을까요?

nonce를 발견하는데에 노력(연산력)을 들이지 않고 블록을 생성하는 방법(그래서 12.5 BTC 보상을 공짜로 받는 방법)을 한번 생각해봅시다. nonce를 발견하려면 시간이 걸릴 수밖에 없는데 빠르게 발견하면 좋은 거니까요. 그리고 그러면 전세계의 다른 경쟁자들을 이길 수 있는 것이니까요.

그냥 0에서 2³² 까지의 값 중 임의의 값을 하나 선택해서 이웃 노드들에게 전파해볼게요. 2147202434가 좋을 것 같네요. 다른 노드들이 답답하게도 일일이 nonce를 구하고 있을 때에 저는 2147202434 라는 그럴듯한 값으로 이웃 노드들을 속이는 것입니다. 이 과정을 매 블록 반복하면 저는 모든 블록 보상을 독차지하고 10분도 안되는 시간마다 주기적으로 12.5 BTC를 버는 것입니다!

이는 불가능합니다. 왜냐하면 블록체인은 나혼자 만들어가는 시스템이 아니기 때문입니다. 만약 유효한 nonce를 발견하면 12.5 BTC의 채굴보상을 받는다고 했지만 일단 발견한 시점에는 그 사실은 나만 알고 있는 것입니다. 전세계의 나머지 10,000개의 노드들은 그 사실을 모르고 있는 것이고 이들은 아직도 nonce를 찾는 작업을 계속하고 있습니다. 이 때 내가 해야할 일은? 바로 새로운 블록을 이웃 노드들에게 전파하는 것입니다. 만약 유효한 nonce를 가진 블록을 전파했다면 이 사실은 10초 이내로 전세계의 노드들에게 전파되고 그제서야 비로소 내가 발견한 블록이 인정되게 됩니다.

새로운 블록을 전파받은 이웃 노드들은 해당 블록의 유효성을 검증하게 됩니다. 유효성 검증이란 새로운 nonce로 해시값을 구했을 때에 정말로 난이도 목표 이하의 값을 도출하는지입니다. 이 과정은 단 두번의 해시 함수만 구하면 되기 때문에 0.1초도 안되는 시간에 검증할 수 있습니다.

유효한 nonce를 만드는 것은 너무나도 어렵지만, 이웃 노드들이 이를 검증하는 것은 너무 쉽다.

위 문장이 작업증명의 핵심을 요약해서 설명하고 있습니다. 유효하지 않은 nonce를 가진 블록을 전파했을 때 이를 검증하는 것은 너무나도 쉽기 때문에 이웃노드들은 그냥 무시해버리고 원래하던 채굴 작업을 계속할 것입니다. 오로지 유효한 nonce를 가진 블록을 전파해야 이웃 노드들은 해당 블록을 인정하고 블록체인에 추가할 것입니다.

이 사실은 모두가 알고 있기 때문에 모든 노드들은 열심히 일을 해야 합니다. 내가 정직히 일하지 않았다는 사실이 적발되는 데에 0.1초도 안걸리는 시스템인 것입니다. 이 시스템에서 보상을 받는 유일한 방법은 정직하게 일을 해서 유효한 nonce 값을 찾는 방법밖에 없습니다. 그래서 오늘도 전세계의 채굴장에서는 굉음을 내며 전용 반도체들이 nonce 값을 찾기 위해 사력을 다하고 있습니다.

작업 증명의 한계: 지분 증명의 고안

작업 증명은 비트코인이 성공할 수 있었던 핵심 요소입니다. 너무나도 간단한 방식으로 정직하지 않은 노드를 판별해내기 때문에 이 시스템에서 나쁜 의도를 가지고 다른 노드들을 속일 수 있는 방법이 없습니다. 중앙 관리자가 존재하지 않지만 상호 감시가 철저히 이루어지기 때문에 모든 노드가 공통된 목표를 위해 일할 수밖에 없습니다. 아직까지는 누구도 이를 우회하는 방법을 찾아내지 못했고 아마도 앞으로도 계속 그럴 것입니다.

하지만 작업 증명의 문제는 우선, 너무나도 많은 전기가 오로지 유효한 nonce를 찾는데에 소모된다는 것입니다. 비트코인의 작업증명을 위해 전세계적으로 사용되는 전력 소모량이 이미 아일랜드 등 몇개 국가의 연간 사용량을 초과했다고 합니다. 비트코인이라는 거대한 경제 시스템을 지탱하기 위한 것으로 합리화할 수도 있겠지만 막대한 양의 전기를 생산하기 위해서 환경이 파괴되고 있다는 비판에서 자유로울 수는 없습니다.

다음 문제점은 중앙화입니다. 비트코인과 같은 작업 증명의 채굴은 기업화된 채굴장에 의해 이루어지는데 이들은 규모의 경제를 토대로 개인 채굴자들에 비해 작업증명을 더욱 효율적으로 할 수 있는 조건을 갖추고 있습니다. 따라서 중앙화된 채굴 기업들은 시간이 지날수록 더욱 많은 이익을 얻고 개인들은 채굴 작업에서 도태되어 왔습니다. 이는 비트코인의 탄생 목적인 탈중앙화에 부합하지 않습니다.

마지막 문제는 작업 증명이 담보하는 확률적 안정성 때문입니다. 여기서 얘기하는 안정성이란, 블록이 한번 생성되었을 때에 그 사실을 100% 믿을 수 있는가에 대한 문제입니다. 작업 증명의 경우 확률적 안정성만을 담보하기 때문에 6 블록 (1시간) 이상 블록이 쌓였을 때에 그 거래를 믿을 수 있는 것으로 봅니다. 하지만 1시간을 기다려야 한다는 것은 실생활에서 결제에 사용되기에 불편함이 크고 또 무엇보다도 확률적 안정성의 허점을 이용한 51% 공격이 가능합니다. 이에 대한 구체적인 내용은 다음 포스트에서 다루도록 하겠습니다.

아무튼 작업증명은 이렇게 몇가지 문제점을 안고 있는 완벽하지는 않은 방식이고 블록체인 커뮤니티의 똑똑한 사람들은 지분증명이라는 것을 고안해내기 시작했습니다.

다음 글에서는 지분증명에 대해서 자세히 알아보도록 하겠습니다.

연재 내용은 블록체인 전문 교육 기관인 DNext Campus에서 제공하는 커리큘럼의 일부를 정리한 것입니다.

DNext Campus에서는 블록체인 코어 엔지니어 교육 과정을 제공하고 있습니다. 블록체인 코어 기술에 대해 심층적으로 공부하고 싶으신 분들은 지금 웹사이트를 방문해주세요!

DNext Campus 방문하기

--

--