[DSRV 다이제스트] 작업증명(PoW)이 갖는 의미

user-image
Seokjoong Yoon
Researcher/
DSRV
2022.08.04

[Xangle Digest]

※해당 컨텐츠는 지난 4월 15일 외부에서 기발간 된 컨텐츠입니다. 컨텐츠에 대한 추가적인 주의사항은 본문 하단에서 확인해주세요.

pick

DSRV Research는 더 많은 사람들이 Web3를 이해하고 참여하는 데 기여하기 위해, 블록체인과 관련된 지식을 연재합니다.

[목차]

  • 작업 증명, 그래서 그게 뭐야? (Feat. 비트코인)
  • 채굴자 관점에서 바라본 작업 증명
  • 전자 화폐 시스템을 이룬 혁신: 이중지불 방지
  • 마무리 

 

작업증명(PoW)이 갖는 의미


“나가서 땅을 한 번 파봐라, 100원 한 장 나오나!”
땅을 파서 100원을 얻는 것은 매우 어려운 일일 수 있겠지만, 그러던 중 예상치 못하게 100원이 아닌 금을 캘 수 있을지도 모릅니다(물론, 땅을 아주 많이 파야겠지만 말이죠). ‘채굴’이라는 단어가 주는 느낌은 그래서 굉장히 묘합니다. 땅을 파면 공짜 돈이 쏟아지는 이미지가 떠오르기 때문입니다. 게다가 이제 우리는 곡괭이를 들고 광산에 찾아가 직접 돌무더기를 파헤치는 것이 아니라, 단지 자리에 앉아 비트코인이나 이더리움을 채굴할 수 있는 시대를 살고 있습니다. 어쩌면 ‘공짜 돈’이 넘쳐나는 것처럼 보입니다.

그렇지만 비트코인이 정말 최소한의 노력으로 누구나 얻을 수 있는 ‘공짜 돈’이라면 그 가치를 누구한테도 인정받을 수 없을 것입니다. 비트코인이 왜 가치를 가지는가에 대한 해답은 여러 가지가 있을 수 있지만, 그중 하나의 해답이 될 수 있는 것이 바로 작업증명(Proof of Work, PoW)입니다. 채굴자들은 작업증명이라는 일종의 노동을 통해 중간자 없이 개인 간 가치를 전송할 수 있는 인프라를 뒷받침합니다. 그리고 이를 바탕으로 만들어지는 여러 응용 어플리케이션들을 견고하게 받쳐주기도 하죠. 이들의 노력이 바로 비트코인 또는 이더리움이 가치를 갖는 근본적인 이유가 될 수 있을 것입니다.

그래서 DSRV Research에서는 블록체인을 이해하기 위한 아주 기초적인 블록인 작업증명을 다루어보고자 합니다. 모두가 빠르게 달려가는 크립토 산업에서 멀리, 또 오래 달리는 마라톤을 하기 위해서는 기본을 다지는 일이 중요할 테니까요.
 

작업 증명, 그래서 그게 뭐야? (Feat. 비트코인)

최초로 제안된 작업 증명. 출처: Bitcoin Whitepaper[1]

최대한 요약하여 설명해보자면 다음과 같습니다.

“컴퓨터에 성실히 같은 작업을 반복해야만 풀 수 있는 문제를 풀도록 하여, 어떤 거래가 올바른지 제안할 수 있는 권한을 부여하는 과정으로, 성실히 참여할 경우 보상으로 암호화폐를 획득할 수 있다.”

우리가 블록체인에서 흔히 이야기하는 작업 증명은 나카모토 사토시(Satoshi Nakamoto, 이하 나카모토)라는 익명의 개발자가 2008년 제안한 논문 “Bitcoin: A Peer-to-Peer Electronic Cash System”(비트코인의 백서이기도 합니다.)을 통해 그 개념이 제안되었습니다[1]. 논문에서 함께 소개된 아담 백(Adam Back)의 해시캐시(HashCash)에서는 이메일을 보내는 과정에서 약간의 컴퓨터 연산을 수행하도록 하여 스팸메일의 발송 비용을 증가시켜, 스팸을 크게 줄이는 데 기여하였습니다[2]. 그렇다면 나카모토는 무엇을 위해 작업 증명을 제시했을까요? 그는 앞선 내용으로부터 영향을 받아 흔히 이중지불이라고 표현되는, 특정 화폐가 중복하여 사용되지 않도록 하기 위해 작업 증명을 도입했습니다.

기존 세상의 디지털 금융은 장부가 중앙에서 관리되는 형태였기 때문에 믿고 사용할 수 있었습니다. 말 그대로 은행, 카드, 보험사 등을 믿고 사용해야 했습니다. 하지만 우리가 알고 있는 블록체인 같은 분산된 네트워크 구조에서는 누구를 믿으면 좋을까요? 어떤 기준으로 누굴 믿을지 정하기 위해, 우리 모두 다 같이 성실히 문제를 풀고 그 문제를 가장 먼저 푼 사람의 이야기를 들어보는 방법은 어떨까요?
 

채굴자 관점에서 바라본 작업 증명

‘채굴’이라 하면 컴퓨터로 가득 찬 방과 벌들이 날아다니는 듯한 쿨링팬 소리가 떠오릅니다. 컴퓨터가 돌아가면 채굴이 되고, 비트코인이나 이더리움이 채굴자에게 보상된다는 것은 알겠는데, 정확히 컴퓨터를 어떻게 동작시켜야 하는 것일까요? 컴퓨터에 어떤 일을 시켜야 하는지가 궁금합니다.

보다 정석적으로 접근해 보겠습니다. 작업증명은 쉽게 말해 ‘블록체인에서 각 블록을 어떻게 생성할 것인가’에 대한 하나의 구현으로, 채굴자가 특정 수학적 문제를 풀면 블록을 생성할 수 있는 권한을 주는 방식을 말합니다. 정확히 어떤 문제를 풀어야 하는지 더 자세히 알아보겠습니다.

작업증명 방식의 블록체인에서 채굴자(miner)는 우선 자신의 컴퓨터에 임시 블록(candidate block)을 만들게 됩니다. 이 임시 블록은 아직 네트워크를 통해 다른 블록체인 노드들에게 전파되지 않아 채굴자 자신만 가지고 있는 블록으로, 영어 이름대로 이후 블록체인에 연결될 수 있는 ‘후보 블록’으로 생각할 수 있습니다. 채굴자는 유저들의 트랜잭션을 멤풀(mempool)이라는 저장공간에 임시로 저장해놓고 그중에서 몇 개의 트랜잭션을 선택하여 임시 블록에 포함시킵니다. 채굴자 보상을 받기 위해서는 이 임시 블록을 네트워크에 전파하고, 모든 채굴자들이 그 특정 채굴자가 제안한 임시 블록을 그들의 컴퓨터에 저장해야 합니다.

그렇지만 아무 임시 블록이나 블록체인에 연결될 수 있는 것은 아닙니다. 특정 채굴자가 임시 블록을 유효한 블록으로 만들고, 다른 노드들에 제안하여 현재 블록체인에 연결시키기 위해서는 블록의 논스(nonce)값을 찾아야 합니다. 위에서 언급했듯이 블록을 생성하기 위해서는 특정 수학적 문제에 대한 정답을 찾아야 하는데 그 정답이 바로 논스입니다.

비트코인 블록 정보. 출처: Blockstream Explorer[3]

위의 사진은 비트코인의 722,383번째 블록에 대한 정보입니다. 빨간색 상자로 표시된 000000000000000000082462175c36ccc2a2ed2f67f38b4b400e02f9b16fb2a6는 해당 블록의 블록 해시를 뜻합니다. 블록 해시는 주황색 상자로 표시된 필드 (TIMESTAMP, VERSION, MERKLE ROOT, BITS, NONCE)와 이전 블록의 블록 해시를 합쳐 암호화 해시함수(이하 해시함수)에 입력값으로 넣고, 그 결과로 나온 결과값입니다.

여기서 NONCE를 제외한 모든 필드는 정적인 값, 즉 정해져서 변하지 않는 값입니다. 따라서 채굴자가 임의로 조정할 수 있는 필드는 NONCE가 유일한데, 채굴자는 논스에 무작위 값을 대입하여 특정 조건을 만족하는 블록 해시값을 찾아야 합니다. 바로 이 과정을 통해 작업 증명에서 말하는 ‘작업’이 발생합니다.

위의 사진에서 알 수 있듯이 비트코인의 722,383번째 블록의 경우에는 블록 해시값이 19개의 0으로 시작합니다. 즉, 블록을 생성하기 위해 채굴자가 풀어야 할 문제가 ‘해시함수의 결과가 19개의 0으로 시작하는 논스값을 찾아라’라는 것을 유추할 수 있습니다. 해시함수의 결과값으로부터 입력값을 유추할 수 없기 때문에 이 조건을 만족하는 블록 해시를 찾을 때까지 채굴자는 논스값을 무작위로 정하여 해시함수에 대입할 수밖에 없고 이는 상당량의 컴퓨팅 파워(이하 해시 파워)를 소모합니다. 즉, 말 그대로 ‘작업’을 수행해야 하는 것이죠.

여기서 몇 개의 0으로 시작하는 블록 해시값을 찾아야 하는지, 즉 얼마 이하의 블록 해시값을 찾아야 하는지를 나타내는 기준을 타겟(target)이라하고 target이하의 블록 해시를 찾기 얼마나 어려운지의 난이도를 difficulty라고 합니다. 비트코인은 블록생성 주기를 약 10분으로 유지하도록 설정되어 있는데, 만약 특정 조건을 만족하는 블록 해시를 찾을 때까지 10분보다 적게 걸린다면 더 많은 개수의 0으로 시작하는 블록 해시값을 찾도록 작업의 난이도가 바뀌게 됩니다. 작업의 난이도가 높아지게 된다는 것은 채굴자 입장에서 논스값을 찾는데 확률적으로 더 많은 횟수의 연산 (무작위의 논스값을 해시함수에 대입하는 작업)을 실행해야 한다는 것을 의미합니다.

비트코인 Difficulty 차트. 출처: Coinwarz[4]

빨간색 상자로 표시된 2021년 6월경에는 중국의 암호화폐 채굴 규제로 중국 내 비트코인 채굴업체의 90%가 폐쇄되었던 사건이 있었습니다. 비트코인 채굴자의 수가 줄어들면 전체 비트코인 네트워크의 해시 파워가 줄어들고, 논스값을 찾는 데 더 오랜 시간이 걸리게 되어 약 10분마다 하나의 블록을 생성하도록 하는 difficulty 또한 하향 조정됨을 위의 그래프에서 확인할 수 있습니다.

이렇게 difficulty는 해시레이트(Hashrate), 즉 채굴에 사용되는 해시 파워(컴퓨팅 자원)의 총합과 긴밀한 관계를 가집니다. 해시레이트가 높을수록 작업 증명을 사용하는 체인의 보안성은 높아진다고 할 수 있는데, 이는 작업 증명과정에 필요한 연산량이 늘어나, 연산에 드는 비용이 직접적으로 증가하기 때문에 새롭게 악의적인 포크를 발생시켜 기존의 Canonical Chain(정식 혹은 표준 체인)을 대체하고자 하는 공격의 가능성과 유인이 낮아지기 때문입니다.
 

전자 화폐 시스템을 이룬 혁신: 이중지불 방지

비트코인이 혁신으로 평가받는 이유 중 하나는 바로 앞서 언급하였듯, 작업증명을 사용하여 개인 간 네트워크(P2P 네트워크) 환경에서도 ‘이중지불’을 방지할 방법을 새로이 제시했기 때문입니다. 이중지불이란 쉽게 말해 이미 지불한 토큰으로 또다시 지불하는 것을 말하는데, 페이팔 같은 중앙화된 핀테크 기업은 하나의 데이터베이스만을 운영하고, 사용자의 접근 권한을 제한하는 방식으로 이중지불을 방지합니다[5]. 그러나 P2P 탈중앙화 네트워크 환경에서는 여러 대의 노드가 각자 데이터베이스를 운영하고, 접근 권한 또한 모두에게 열려있기 때문에 이중지불을 방지하기 위해서는 새로운 해결책이 필요합니다.

이중지불을 방지하기 위해서는 거래의 순서를 확정하는 것이 매우 중요합니다. A의 잔액이 1BTC일 때, B에게 1BTC를 보내면서, 동시에 C에게도 1BTC를 같은 토큰으로 보내려 한다고 가정해 보겠습니다. 두 거래 중 무엇이 먼저 발생했는가에 대한 합의가 없는 경우, 즉 거래가 동시에 발생할 경우 이중지불이 가능하지만 두 거래 중 어떤 거래든 먼저 발생했다는 확정이 있으면 이중지불이 불가능합니다. A가 B에게 1BTC를 보내는 거래가 먼저 발생했다는 것이 확정되면 A에게는 더 이상 C에게 보낼 1BTC가 없어지기 때문입니다.

비트코인 백서에서는 이렇게 거래의 순서를 확정하는 메커니즘을 ‘타임스탬프 서버(Timestamp Server)’로 정의합니다. 바로 이미 살펴본 블록 해시가 타임스탬프 서버의 핵심인데, 블록 해시는 위에서 언급했듯이 Hash(PREVIOUS_BLOCK_HASH, TIMESTAMP, VERSION, MERKLE_ROOT, BITS, NONCE)의 결과값입니다. 이번에 눈여겨볼 것은 PREVIOUS_BLOCK_HASH입니다. 이전 블록의 블록 해시가 이번 블록의 블록 해시를 계산하는 데에 입력값으로 사용된다는 것은, 이전 블록의 내용이 바뀌어 블록 해시가 바뀌게 된다면 이번 블록의 블록 해시 또한 아예 다르게 바뀐다는 것을 의미합니다. 즉, n번째 블록을 수정하면 n+1, n+2, ... 그리고 최신 블록까지 수정해야 합니다. 한 번 거래를 체결한 이후 누군가가 과거의 거래 기록을 임의로 조작할 수 없도록 블록체인을 설계한 것입니다.

이런 식으로 각각의 블록들이 연결되어 ‘체인’을 형성하게 됩니다. 직선적으로 연결된 체인은 채굴자들의 컴퓨팅 자원을 소비한 누적된 결과이자 거래의 체결 순서를 보장하는 연속적 원장으로 볼 수 있습니다. 어떤 사용자의 거래가 담긴 블록 이후로 많은 블록이 쌓일수록 해당 블록을 수정하는 데 필요한 해시 파워가 증가하기 때문에 사용자의 거래가 확정될 확률이 높아지게 됩니다.

  • DSRV's TIP
    하나의 블록에 이중지불을 시도하는 트랜잭션 두 개가 동시에 들어갈 수는 없나요?
    -> 제안된 블록에 대해 네트워크에 참여하는 각각의 노드들은 해당 블록에 담겨있는 트랜잭션을 하나씩 검증하기 때문에 유효하지 않은 트랜잭션들(예를 들어 이중지불 시도)이 하나의 블록에 담겨있을 경우 해당 블록을 인정하지 않습니다. 보다 정확하게는 각 노드는 다음의 과정을 거쳐 블록을 검증하게 됩니다[6]:

    1. 제안된 블록이 가지고 있는 PREVIOUS_BLOCK_HASH가 실제로 존재하는 직전 블록의 블록 해시값인지 검증한다.
    2. 제안된 블록의 TIMESTAMP가 이전 블록의 TIMESTAMP보다 큰 값인지를 통해, 블록의 순서가 시간적으로 올바른지 검증한다.
    3. 논스와 블록 해시값 등을 확인하여 블록의 작업증명이 제대로 이루어졌는지 검증한다.
    4. 이전 블록의 마지막 상태를 저장한다.
    5. 이전 블록의 마지막 상태에 이번 블록에 포함된 트랜잭션들을 하나씩 적용시켜 최종적으로 바뀐 상태를 다시 저장한다. 이렇게 저장된 상태가 이번 블록의 마지막 상태가 된다. 트랜잭션을 하나씩 적용시키는 과정에서 오류가 발생하면 블록을 거부한다.

    여기서 5번이 트랜잭션들이 유효한지 검증하는 과정에 속합니다.

마무리

작업증명을 사용하는 대표적인 블록체인인 비트코인과 이더리움은 전체 크립토 시장에서 약 60%의 시가총액을 차지하고 있을 뿐만 아니라, 암호화폐 관련 담론에서 핵심적인 철학을 제공하고 있습니다. 이더리움은 가까운 미래에 지분증명(Proof of Stake, PoS)으로 전환이 될 예정이지만, 작업증명에 대한 이해 없이 지금까지의 암호화폐 시장과 크립토 산업의 정신을 이해하기란 불가능에 가까울 것입니다.

크립토산업의 뿌리는 싸이퍼펑크 정신[7]에 있습니다. 중앙화된 전산시스템은 보안적 약점의 노출을 최소화하기 위해 본질적으로 폐쇄적이며, 보다 효율적으로 기관 간 다중 데이터베이스 시스템을 유지하기 위해 사용자의 개인정보를 통해 신원을 파악합니다[3]. 싸이퍼펑크는 중앙화 전산시스템의 정보 독점, 그리고 사용자 패턴 분석, 더 나아가 개인에 대한 기관의 감시를 ‘암호학’을 사용하여 고안한 새로운 분산화 시스템의 제안을 통해 타파하고자 합니다.

나카모토 사토시의 작업증명은 중앙적 제3자 없이 탈중앙화 데이터베이스 환경에서도 개인 간 화폐 거래를 기술적으로 가능하게 했다는 점에서 이러한 싸이퍼펑크 철학의 흐름에서도 아주 중요한 지점으로 볼 수 있습니다.

지금까지 우리는 작업증명이 왜 등장했는지, 어떤 문제를 해결하였는지, 또 기술적으로는 어떻게 구성돼있는지 등을 포괄하여 알아보았습니다. 작업증명 기반의 암호화폐, 특히 비트코인이 과연 코드 조각에 불과한 유사 화폐인지 아니면 견고한 내재가치를 가지는 새로운 캐시 시스템인지에 대한 논쟁은 매번 존재해왔으며 앞으로도 존재하겠지만 이 글이 이 주제에 대한 독자분들의 생각을 정해나가는 과정에서의 시작점이 될 수 있기를 바랍니다. 이 글을 읽을 귀중한 시간 할애해 주셔서 감사합니다.
 

※ References
[1] Bitcoin Whitepaper
[2] HashCash Whitepaper
[3] Blockstream Explorer
[4] Bitcoin Difficulty Chart — Coinwarz
[5] Security Without Identification: Transaction Systems To Make Big Brother Obsolete by David Chaum
[6] Ethereum Whitepaper — Mining
[7] nakamoto.com — The Cypherpunks


→ '[DSRV 다이제스트] 작업증명(PoW)이 갖는 의미' 원문 보러가기
 

주의사항
research.disclaimer.xangle
본 제작 자료 및 콘텐츠에 대한 저작권은 자사 또는 제휴 파트너에게 있으며, 저작권에 위배되는 편집이나 무단 복제 및 무단 전재, 재배포 시 사전 경고 없이 형사고발 조치됨을 알려드립니다.