ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 비트코인 블록체인의 구조
    Cryptography 2021. 10. 16. 09:03
    반응형

    블록체인은 트랜잭션들에 대한 분산된 원장(distributed ledger)입니다. 특히, 비트코인의 관점에 있어서 블록체인은 공용이고, 분산형 원장으로 비트코인 네트워크 상에 모든 트랜잭션 기록들을 가지고 있는 것입니다. 이 안의 트랜잭션들은 일시(timestamp)가 적혀있고, 정렬되어 있으며, 변경이 불가능(immutable)한데요. 

     

    이후 트랜잭션은 채굴자에 의해 선택(pick up)되어 채굴을 위해 블록에 포함되게 됩니다. 각 블록은 하나의 해시값을 통해 식별되고 이전 블록의 해시값을 헤더에 포함하여 이전 블록을 참조하게 됩니다. 

     

    이번 글에서는 비트코인 블록체인의 구조를 살펴보겠습니다:

     

    • 비트코인 블록체인의 구조
    • Genesis 블록
    • Stale 및 Orphan 블록
    • 블록체인의 크기
    • 네트워크 difficulty

     


    비트코인 블록체인의 구조

    먼저 한 비트코인 블록의 구조는 아래와 같습니다:

     

    필드 크기 설명
    Block size 4 bytes 블록 크기
    Block header 80 bytes 버젼, 이전 블록 해시값, Merkle root, 타임스탬프, Difficulty target, nonce가 포함됩니다. 바로 아래에서 좀 더 자세히 알아보겠습니다.
    Transaction counter 1-9 bytes 이 필드는 코인베이스 트랜잭션을 포함한 블록 안의 총 트랜잭션 수를 포함합니다.
    Transactions 변동 블록 안의 모든 트랜잭션들

     

    위에서 언급한 블록헤더는 아래와 같은 구조를 가집니다:

     

    필드 크기 설명
    Version 4 bytes 적용할 블록 검증 규칙을 적어둔 블록 버젼 넘버
    Previous block's header hash 32 bytes 이전 블록 헤더에 SHA256을 두 번 해시한 값
    Merkle root hash 32 bytes 블록 안에 포함된 모든 트랜잭션들의 merkle tree를 SHA256으로 두 번 해시한 값
    Timestamp 4 bytes 이 필드는 Unix-epoch time 포맷으로 대략적인 생성 시간을 포함하고 있습니다. 좀 더 정확히는, 채굴자가 헤더를 해싱하기 시작한 시간입니다.
    Difficulty target 4 bytes 현재 네트워크/블록의 difficulty target
    Nonce 4 bytes difficulty target보다 낮은 해시값을 생성하기 위해 채굴자가 반복적으로 변경하는 임의의 숫자입니다.

     

    아래의 그림은 비트코인 블록체인 구조를 상세히 보여주고 있습니다. 아래 이미지에서처럼, 블록체인은 각 블록이 이전 블록 헤더의 해시값을 헤더에 참조하여 연결되어 있습니다. 이러한 연결은 어떠한 트랜잭션도 해당 트랜잭션을 기록하는 블록과 그것을 따르는 모든 블록이 변경되지 않고서는 변경될 수 없습니다. 이전의 블록을 가지지 않은 블록은 genesis 블록이라고 부릅니다. 

     

    비트코인 블록체인의 전체 구조는 아래와 같습니다:

     

    Image from Author inspired by [1]

     

     

    Genesis 블록

    Genesis 블록은 비트코인 블록체인의 첫 블록입니다. 그러한 genesis 블록은 비트코인 코어 소프트웨어에 하드코딩되어 있는데요. Genesis 블록 안에, 코인베이스 트랜잭션은 타임즈 기사에서 가져온 글귀로 코멘트가 남아 있습니다:

     

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

     

    이 코멘트는 비트코인 블록이 2009년 1월 3일 전에는 채굴되지 않았음을 나타냅니다. 정확히는 아래 github 코드에서 확인할 수 있습니다:

     

    static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
    {
        const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
        const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
        return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
    }

     

    비트코인은 중복 지불을 막기 위해 엄격한 트랜잭션 검증을 강제하고 채굴을 통해서 방비를 수행합니다. 

     

    블록의 높이는 블록체인에서 특정 블록 전의 블록의 갯수입니다. PoW는 블록체인을 안전하게 만들기 위해서 사용됩니다. 각 블록은 하나 이상의 트랜잭션을 포함하고, 가장 첫 트랜잭션은 코인베이스 트랜잭션이 됩니다. 코인베이스 트랜잭션에는 특별한 조건이 적용되어 최소 100개 이상 블록이 지나야 사용을 할 수 있습니다. 이점은 블록이 사용 이후에 stale로 판명되는 것을 막기 위함입니다. 

     

    Stale과 orphan 블록들

    Stale 블록은 이미 채굴된지 오래된 블록입니다. 가장 긴 체인(메인 체인)이 이미 해당 블록을 지나서 진행되고 있으나, fork(아래에서 자세히 기술) 때문에 오래된 블록에 대해 계속 작업을 진행하는 채굴자는 stale 블록에 작업을 진행하고 있다고 말할 수 있습니다. 다른 말로하면, 이러한 블록들은 짧은 체인에 존재하며, 관련된 채굴자에게 어떠한 보상도 제공하지 않습니다.

     

    Orphan 블록들은 약간 다른 컨셉인데요. 그것들의 부모가 알려지지 않은 블록들입니다. 부모 블록이 알려지지 않았기 때문에, 그 블록들은 유효하지 않습니다. 이 문제는 2명 이상의 채굴자가 거의 동일한 시점에 블록을 발견했을 경우 발생합니다. 이러한 블록들은 유효한 블록들이고 과거 특정 시점에는 정확하게 발견되었겠으나 더 이상 메인체인의 일부로 존재하지 않게 됩니다. 이러한 일이 발생하는 이유는 거의 동시에 2개의 블록이 발견되었고, 더 많은 양의 PoW를 가진 블록이 수용되고 적은 양의 PoW를 가진 블록은 거부되기 때문입니다. Stale 블록과 같이, 이러한 블록은 채굴자에게 어떠한 보상도 제공하지 않습니다.

     

    Fork

    앞서 stale 블록 부분에서, 새로운 단어인 fork를 소개했습니다. fork는 2개의 다른 버젼의 블록체인이 존재하는 상황을 말합니다. 특정 경우에는 수용될 수 있지만, 어떠한 경우에는 해롭습니다. 블록체인에서는 아래와 같이 다양한 타입의 fork가 존재합니다:

     

    • Temporary forks
    • Soft forks
    • Hard forks

     

    비트코인의 분산된 성질로 인해서, 네트워크 fork는 자연적으로 발생하게 됩니다. 두 개의 노드가 동시에 하나의 유효한 블록은 알리는 경우에, 서로 다른 트랜잭션을 가진 2개의 블록체인이 존재할 수 있습니다. 이것은 달갑지 않은 상황이며, 비트코인 네트워크 상에서 오직 가장 킨 체인만 수용하면서 이 부분을 해결할 수 있습니다. 이러한 경우에 더 작은 체인은 orphaned로 간주됩니다. 공격자가 네트워크 해시 비율의 51%에 대한 조정 권한을 얻으면, 공격자는 그들이 원하는 버젼의 트랜잭션 history를 강제할 수 있습니다.

     

    또한, 블록체인 상에서 fork는 비트코인 프로토콜에 변경을 가하면서 발생할 수 있습니다. soft fork의 경우에, 업데이트된 프로토콜을 지원하는 가장 최신의 버젼으로 업그레이드하지 않은 클라이언트도 여전히 정상적으로 작동할 수 있습니다. 이러한 경우에, 새로운 블록과 이전의 블록들은 모두 수용 가능하며, 그러므로 soft fork를 하위호환성이 있게 합니다. 채굴자는 새로운 프로토콜 규칙을 사용하기 위해서만 새로운 soft fork 클라이언트로 업그레이드할 필요가 있습니다. 계획된 업그레이드는 모든 사용자가 이미 업데이트 되어 있어야 하기에 fork를 생성하지 않습니다. 

     

    반면, Hark fork는 이전에 유효한 블록들을 유효하지 않게 만들며 모든 사용자가 업그레이드할 것을 요구합니다. 때때로 새로운 트랜잭션 종류가 soft fork로 추가되고, 블록 구조 변경이나 주요한 프로토콜 변경의 경우에는 hard fork가 발생하게 됩니다. 

     

    비트코인이 진화하고 새로운 업그레이드와 혁신이 도입되면서, 블록에 연결된 버젼 또한 변경됩니다. 이러한 버젼은 다양한 보안 관련 파라미터나 새로운 기능을 추가합니다. 가장 최신의 비트코인 블록 버젼은 4로 BIP65 [2]에서 제안되었으며 비트코인 코어 클라이언트 0.11.2 버젼부터 사용되었습니다. BIP9 구현체 이후로, nVersion 필드의 비트가 soft fork 변경을 나타내기위해 사용됩니다. 

     

    블록체인의 크기

    비트코인은 지속적으로 성장하는 블록들의 체인이며 계속 그 크기가 커져가고 있습니다. 비트코인 블록체인의 현재 크기는 대략 360.2 GB(2021년 10월 16일 기준) [3]입니다:

    Image from [3]

     

    Network Difficulty

    네트워크 difficulty는 '얼마나 새로운 블록을 찾는 것이 어려운가'에 대한 측정을 말합니다. 즉, 특정 타겟 이하의 해시값을 찾는게 얼마나 어려운지를 말합니다. 

     

    새로운 블록들은 대략 10분마다 블록체인에 추가되고, 네트워크 difficulty는 2,016 블록마다 동적으로 조정되어 새로운 블록이 네트워크에 비교적 일정하게 추가되는 것을 유지하도록 합니다. 

     

    네트워크 difficulty는 아래 공식을 통해 계산됩니다:

     

    Target = Previous target * Time/2016 * 10 minutes

     

     

    Difficulty와 target은 동일한 것을 의미합니다. Previous target은 이전의 target 값이며, Time은 이전 2,016 블록을 발생하는 데에 들어간 시간을 의미합니다. 네트워크 difficulty는 본질적으로 채굴자가 새로운 블록 하나를 발견하는게 얼마나 어려운지를 의미하며 정확히는 hashing 퍼즐이 얼마나 어려운가를 나타냅니다. 

     

     

    Reference

    [1] Mastering Blockchain

    [2] https://github.com/Bitcoin/bips/blob/master/bip-0065.mediawiki

    [3] https://www.statista.com/statistics/647523/worldwide-bitcoin-blockchain-size/

     

    반응형
Kaden Sungbin Cho