‘Mastering Bitcoin 2nd’ 세미나 14, 10장. Mining and Consensus 1/2

Chapter 10. Mining and Consensus

이번 장은 채굴과 합의에 대해서 다룹니다. 내용은 어렵지 않지만 분량이 꽤 되기 때문에 집중력을 생각해서 두 부분으로 나누어 세미나를 진행합니다. 이번 세미나는 Assembling and Selecting Chains of Blocks까지 다룹니다.

목표값과 난이도와의 관계, 난이도 조정 등은 이번 세미나 범위에 들어 있지만 다음 세미나에서 다루도록 합니다.

 

먼저 책 내용을 읽은 후, 아래 정리한 내용을 다시 한 번 읽어봅니다.

 

Introduction

채굴(마이닝)이란 이름은 좋은 비유이면서 동시에 좋지 않은 비유입니다. 비트코인 시스템이 새로운 비트코인을 생성하는 과정이고 이 과정은 금광에서 금을 채굴하는 것과 같이 어려운 일이라는 점을 나타내는 점에선 좋은 비유지만, 채굴의 진짜 중요한 의미를 간과할 수 있게 한다는 점에서 좋지 않은 비유입니다.

Mining is the mechanism that underpins the decentralized clearinghouse, by which transactions are validated and cleared. Mining is the invention that makes bitcoin special, a decentralized security mechanism that is the basis for P2P digital cash. Mining secures the bitcoin system and enables the emergence of network-wide consensus without a central authority. The reward of newly minted coins and transaction fees is an incentive scheme that aligns the actions of miners with the security of the network, while simultaneously implementing the monetary supply.

채굴은 시스템을 탈중앙화 하면서도 안전을 보장할 수 있도록 하는(탈중앙화할 경우 시스템의 안전을 위협하는 요소들이 있다는 것 – 대표적인 것이 비잔틴 장군 문제이다) 인센티브를 활용한 보안 메커니즘입니다.

인센티브로 준다는 것은 그것이 인센티브가 될 만한 가치가 있어야 한다는 것입니다. 인센티브로 줄 수 있는 가장 효율적인 수단은 캐시입니다. 추가적인 가치가 외부에서 공급되지 않는 비트코인 시스템이 안정성이 보장된 탈중앙화 시스템이 되기 위해서는 필연적으로 디지털 캐시 시스템으로 포지션 할 수 밖에 없습니다.

사토시 나카모토의 백서를 보면 탈중앙화 디지털 캐시 시스템을 위해 채굴이라는 합의 방식을 선택한 것으로 보이지만, 탈중앙화 시스템의 안정성을 보장하는 것이 먼저이고 이를 위해 채굴이라는 합의 방식이 필요했고 그 과정에서 인센티브의 형태로 디지털 캐시가 필요한 것이었을 수도 있습니다.

 

채굴자는 새로운 트랜잭션을 검증하고 블록에 포함해 글로벌 원장(블록체인)에 기록합니다. 새로운 블록은 평균 10분마다 생성됩니다. 생성된 블록이 블록체인에 연결될 때 확정(confirmed) 되었다고 합니다.

확정 되었다는 것은 ‘트랜잭션 순서가 확정 되었다는 것’을 의미합니다. 블록은 특정 시점에 모아진 트랜잭션 순서들을 확정하기 위한 것이고 블록체인은 지금까지의 전체 트랜잭션의 순서를 확정하기 위한 것입니다. 트랜잭션 순서를 확정하는 것은 이중지불을 막는 수단입니다.

 

The solution to the problem, called the Proof-of-Work, is included in the new block and acts as proof that the miner expended significant computing effort. The competition to solve the Proof-of-Work algorithm to earn the reward and the right to record transactions on the blockchain is the basis for bitcoin’s security model.

비트코인 시스템은 ‘누가 블록을 생성할 것인가’를 결정하기 위해 경쟁 방식을 사용합니다. 채굴자들은 해시 알고리즘에 기반한 POW 알고리즘 문제를 가장 먼저 해결하기 컴퓨팅 계산 자원을 가지고 경쟁합니다. 문제에 대한 해결책을 POW라고 하고 새로운 블록에 포함됩니다. POW는 이름 그대로 채굴자가 작업을 했다(해시 값을 구해기 위해 실제 계산 노력을 했다)는 증명으로 사용되고, POW는 비트코인 시스템의 안정성을 보장하는 수단이 됩니다.

 

채굴자는 채굴을 통해 시스템에 안정성을 제공하고 그 댓가로 보상을 받습니다. 보상은 블록 생성을 위한 보상과 트랜잭션 처리를 위한 수수료 보상으로 이루어집니디.

블록 보상은 거의 매 4년(정확히는 210,000 블록) 마다 50 비트코인으로 시작해서 절반으로 줄어듭니다. 2140년 쯤이면 블록 보상은 0이 되고, 비트코인의 총 발행량은 21백만개가 됩니다.

Decentralized Consensus

시스템에 참여하는 모든 참여자들이 시스템을 믿고 행동하기 위해서는 시스템의 모든 참여자들이 합의하는 단일 진실이 있어야 합니다. 중앙화 시스템에서는 단일 진실을 위해 신뢰를 부여 받은 중앙 기관이 거래 정보를 검증하고 기록합니다.

비트코인 시스템은 중앙 기관이 없는 탈중앙 시스템이기 때문에 이와는 다른 단일 진실을 위한 방법이 필요합니다.

 

Satoshi Nakamoto’s main invention is the decentralized mechanism for emergent consensus. Emergent, because consensus is not achieved explicitly—there is no election or fixed moment when consensus occurs. Instead, consensus is an emergent artifact of the asynchronous interaction of thousands of independent nodes, all following simple rules. All the properties of bitcoin, including currency, transactions, payments, and the security model that does not depend on central authority or trust, derive from this invention.

비트코인 시스템은 투표와 같은 명시적인 방법이 아닌, 네트워크에 참여하는 노드들이 아래와 같은 간단한 규칙을 따라 행동하기만 하면 합의가 창발되는(emergent consensus) 탈중앙 메커니즘을 사용합니다.

  • Independent verification of each transaction, by every full node, based on a comprehensive list of criteria
  • Independent aggregation of those transactions into new blocks by mining nodes, coupled with demonstrated computation through a Proof-of-Work algorithm
  • Independent verification of the new blocks by every node and assembly into a chain
  • Independent selection, by every node, of the chain with the most cumulative computation demonstrated through Proof-of-Work

 

This is why independent validation is a key component of decentralized consensus.

Independent Verification of Transactions

트랜잭션을 전달받은 노드는 다음과 같은 기준으로 트랜잭션을 검증하고, 유효한 경우 트랜잭션을 트랜잭션 풀에 추가하고 다른 노드들에게 전달합니다. 검증에 대한 자세한 구현 내용은 비트코인 코어의 AcceptToMemoryPool, CheckTransaction, CheckInputs 함수에서 볼 수 있습니다.

  • The transaction’s syntax and data structure must be correct.
  • Neither lists of inputs or outputs are empty.
  • The transaction size in bytes is less than MAX_BLOCK_SIZE.
  • Each output value, as well as the total, must be within the allowed range of values (less than 21m coins, more than the dust threshold).
  • None of the inputs have hash=0, N=–1 (coinbase transactions should not be relayed).
    • 코인베이스 트랜잭션은 이전 트랜잭션 해시가 0이고, 인덱스가 -1인 하나의 입력 만을 갖습니다. 코인베이스 트랜잭션은 블록 보상에 대한 트랜잭션으로 채굴자가 채굴 시 생성해서 블록에 포함하는 것으로 노드들 사이에 전달될 필요가 없습니다.
  • nLocktime is equal to INT_MAX, or nLocktime and nSequence values are satisfied according to MedianTimePast.
  • The transaction size in bytes is greater than or equal to 100.
  • The number of signature operations (SIGOPS) contained in the transaction is less than the signature operation limit.
  • The unlocking script (scriptSig) can only push numbers on the stack, and the locking script (scriptPubkey) must match isStandard forms (this rejects “nonstandard” transactions).
  • A matching transaction in the pool, or in a block in the main branch, must exist.
  • For each input, if the referenced output exists in any other transaction in the pool, the transaction must be rejected.
  • For each input, look in the main branch and the transaction pool to find the referenced output transaction. If the output transaction is missing for any input, this will be an orphan transaction. Add to the orphan transactions pool, if a matching transaction is not already in the pool.
  • For each input, if the referenced output transaction is a coinbase output, it must have at least COINBASE_MATURITY (100) confirmations.
  • For each input, the referenced output must exist and cannot already be spent.
  • Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in the allowed range of values (less than 21m coins, more than 0).
  • Reject if the sum of input values is less than sum of output values.
  • Reject if transaction fee would be too low (minRelayTxFee) to get into an empty block.
  • The unlocking scripts for each input must validate against the corresponding output locking scripts.

Mining Nodes

채굴에 참여한 노드를 채굴 노드라고 합니다. 채굴은 노드가 독립적으로 또는 풀에 참여해서 할 수 있습니다.

The arrival of a new block has special significance for a mining node.

채굴 노드에게 새로운 블록의 도착은 특별히 중요합니다. 유효한 블록이 도착했다는 것은 현재 10분간 치뤄지는 경기에서 졌다는 것을 의미하고, 새로운 경기가 시작됨을 알리기 때문입니다.

Aggregating Transactions into Blocks

채굴 노드는 트랜잭션 풀로 부터 트랜잭션들을 선택하고 후보 블록(candidate block)에 모읍니다.

The Coinbase Transaction

채굴 보상(블록 보상과 수수료)을 위해 블록에 포함되는 첫 번재 트랜잭션을 코인베이스 트랜잭션이라고 합니다. 이전 트랜잭션 출력을 사용하는 것이 아니기 때문에 참조하는 UTXO가 없습니다. 하나의 입력과 하나의 출력 만을 갖습니다.

입력은 참조하는 UTXO가 없기 때문에 UTXO를 참조하는 해시 값과 인덱스가 의미가 없고, 해제 스크립트 부분 또한 필요가 없습니다. 해시는 모든 비트가 0인 값으로 작성하고, 인덱스는 모든 비트가 1인 값으로 0xFFFFFFFF로 작성하고, 해제 스크립트 부분 대신 코인베이스 데이터 부분을 갖습니다.

 

코인베이스 데이터는 2에서 100 바이트로 작성할 수 있는데 첫 번재 몇 바이트를 제외하고는 채굴자들이 자유롭게 사용할 수 있도록 하고 있습니다.

비트코인 시스템의 제네시스 블록에 기록되었다는 그 유명한 문장인 “The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”이 바로 코인베이스 데이터에 작성된 것입니다.

오늘날 채굴자들은 자신들이 자유롭게 작성할 수 있는 영역을 추가적인 논스 값이나 마이닝 풀을 식별하는 문자열로 작성하고 있습니다.

비트코인 시스템에서 자유롭게 작성할 수 있는 영역이 많지 않기 때문에 시간이 지날 수록 코인베이스 데이터를 좀 더 효율적으로 활용하려는 시도들이 등장합니다. BIP-34의 version-2 blocks (버전이 2로 설정된 블록)에서는 코인베이스 데이터의 첫 부분은 블록 높이로 시작해야 합니다.

BIP-16을 지원하는 경우, 코인베이스 데이터의 마지막 부분은 ASCII 인코딩 문자열로 “/P2SH/”로 작성되고, BIP-17을 지원하는 경우는 “p2sh/CHV”로 작성하도록 하고 있습니다.

Constructing the Block Header

블록 헤더는 80바이트 크기를 가집니다. 4바이트 버전, 32 바이트 이전 블록 해시, 32바이트 머클 루트, 4바이트 타임스탬프, 4바이트 목표값, 4바이트 넌스로 구성됩니다.

 

Mining the Block

채굴은 특별한 목표값 보다 더 작은 해시를 찾기 위해 논스를 변경하면서 블록 헤더를 반복적으로 해싱하는 것입니다.

트랜잭션들은 블록 바디에 작성되지만 트랜잭션들에 대한 고유한 지문에 해당하는 해시들은 블록헤더의 머클루트로 요약되기 때문에, 블록헤더 만을 사용해서 해시를 구해도 블록에 포함된 전체 트랜잭션들을 포함한 해시를 구한 것과 같은 효과를 얻을 수 있습니다.

Successfully Mining the Block

채굴에 성공한 채굴자는 블록을 생성하고 전파합니다. 새로운 블록을 받은 노드는 다음과 같이 블록을 검증하고, 유효한 경우 자신의 블록체인에 연결하고 다른 노드들에게 블록을 전파합니다. 블록 검증은 비트코인 코어의 CheckBlock, CheckBlockHeader 함수로 작성되어 있습니다.

  • The block data structure is syntactically valid
  • The block header hash is less than the target (enforces the Proof-of-Work)
  • The block timestamp is less than two hours in the future (allowing for time errors)
  • The block size is within acceptable limits
  • The first transaction (and only the first) is a coinbase transaction
  • All transactions within the block are valid using the transaction checklist discussed in “Independent Verification of Transactions”

Assembling and Selecting Chains of Blocks

The “main chain” at any time is whichever valid chain of blocks has the most cumulative Proof-of-Work associated with it. The main chain will also have branches with blocks that are “siblings” to the blocks on the main chain. These blocks are valid but not part of the main chain.

비트코인 시스템이 경쟁 방식의 채굴을 선택하고 있고, P2P 네트워크의 특징 상 차이가 발생할 수 있기 때문에 유효한 블록들로만 구성된 경우에도 블록 체인에 분기가 발생할 수 있습니다.

가장 POW 누적이 큰 체인(가장 긴 체인, 가장 무거운 체인, 작업증명 노력이 가장 많이 들어간 체인이라 불리기도 함)을 메인 체인이라 하고, 메인 체인 상에서 분기된 다른 체인을 부 체인(secondary chains)이라고 합니다.

부 체인은 메인 체인과 같이 유효한 체인입니다. 일시적으로 부 체인이지만 시간이 지남에 따라 메인 체인이 될 수 있기 때문에 노드들은 부 체인 또한 관리해야 합니다.

일부 블록들은 메인 체인이나 부 체인 상에 부모 블록이 없어 체인에 연결할 수 없을 수 있습니다. 이러한 블록들을 고아 블록(orphans)이라고 하고 고아 블록 풀로 관리됩니다.

 

By selecting the greatest-cumulative-work valid chain, all nodes eventually achieve network-wide consensus. Temporary discrepancies between chains are resolved eventually as more work is added, extending one of the possible chains. Mining nodes “vote” with their mining power by choosing which chain to extend by mining the next block. When they mine a new block and extend the chain, the new block itself represents their vote.

Each node has its own perspective of the global blockchain.

가장 POW 누적이 큰 체인을 선택함으로 노드들은 궁극적으로 네트워크 범위의 합의에 도달하게 됩니다. 즉 단일 진실에 합의합니다. P2P 네트워크 특성 상 발생할 수 밖에 없는 일시적인 차이는 인정하되 시간이 지남에 따라 궁극의 일치를 보는 것입니다.

채굴자들은 분리가 발생할 경우 ‘다음 블록을 채굴하기 위해 어떤 체인을 확장할 것인지’를 선택합니다. 이러한 선택은 채굴자의 채굴 파워(해시 파워)를 어떤 체인에 투표할 것인지를 결정한 것과 같다고 할 수 있습니다.

 

Blockchain Forks

P2P의 고유한 특성인 ‘차이’ 발생과 비트코인 시스템의 경쟁 방식의 채굴로 인해 체인 경쟁 또한 필연적입니다. 체인 경쟁이 일어나면 그림 4와 같이 네트워크가 분리됩니다. 서로 다른 진실을 공유하는 그룹으로 나누어진 것입니다.

이러한 네트워크의 분리는 오래 가지 않습니다. 채굴 노드는 POW 누적이 가장 큰 체인을 선택해서 새로운 블록을 생성하고 노드들 또한 POW 누적이 가장 큰 체인을 선택해서 전달된 블록을 연결하기 때문에 오래지 않아 네트워크는 그림 6과 같이 하나의 체인으로  통일 되게 됩니다.

비트코인 시스템은 노드들이 독립적으로 POW 누적이 가장 큰 체인을 선택하도록 함으로 ‘네트워크가 다수의 합의를 따라 단일 진실을 결정하도록’ 하는 효과를 얻습니다.

 

Bitcoin’s block interval of 10 minutes is a design compromise between fast confirmation times (settlement of transactions) and the probability of a fork. A faster block time would make transactions clear faster but lead to more frequent blockchain forks, whereas a slower block time would decrease the number of forks but make settlement slower.

비트코인 시스템에서 블록은 평균 10분 마다 생성되는데, 이 10분이라는 시간은 확정 시간과 포크 발생 가능성 사이의 타협입니다. 블록 확정 시간이 더 빨라지면 그 만큼 포크 발생이 더 자주 생기고, 블록 확정 시간이 더 느려지면 그 만큼 포크 발생은 줄어듭니다.

About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*