비트코인 반감기는 어떻게 프로그래밍 되어 있을까? 그리고 왜 초기값은 50BTC일까?

비트코인 반감기는 어떻게 프로그래밍 되어 있을까? 그리고 왜 초기값은 50BTC일까?

비트코인 반감기 코드 설명

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
    // Force block reward to zero when right shift is undefined.
    if (halvings >= 64)
        return 0;

    CAmount nSubsidy = 50 * COIN;
    // Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
    nSubsidy >>= halvings;
    return nSubsidy;
}

https://github.com/bitcoin/bitcoin/blob/master/src/validation.cpp#L1750

최근 비트코인 반감기는 어떤 식으로 설계되어 있을까에 대해 계속 호기심을 가지다가 자투리 시간이 남아 코드를 확인해보았습니다.

CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)

CAmount는 사용자 정의 데이터 타입으로 64비트 정수형입니다. 블록수에 따라 그리고 합의 관련 조정 값에 따라 보상(Subsidy)의 양을 계산하여 데이터로 반환합니다. 참고로 합의 관련 조정값은 210,000 블록마다 반감기가 온다는 내용만 사용합니다.

int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;

블록 높이 / 반감기 주기로 몇 번째 반감기인지를 구합니다. 참고로 컴퓨터는 기본적으로 정수끼리 나눗셈하면 정수값만 반환합니다.

if (halvings >= 64) return 0;

64비트 정수형이라 어떻게든 64번 반감기 지나면 0이 됩니다. 그래서 64번째 반감기 넘었으면 알아서 보상 0으로 하라는 뜻입니다. (근데 초기값이 1e8이라 그보다 빠르게 0이 됩니다.)

CAmount nSubsidy = 50 * COIN;

첫 보상 초기값이 50 BTC라는 뜻입니다. COIN은 이미 전역변수로 다른 곳에서 10의 8승 정수임이 정의되어 있습니다. 저는 이 부분에서 매번 의문이었는데 이 친구는 왜 초기 값을 50으로 했으며(?) 왜 사토시의 단위는 10의 8승일까요? 서양인이면 10의 3승 단위가 익숙했을텐데...심지어 50 * 1e8 은 int32 범위(2e9)는 넘어가는 더 애매한 숫자인데...저라면 50대신 20을 했던가 아니면 초기값 1에 10의 9승을 선택했을 것 같습니다. 그래서 이더리움은 1e18이 기본이죠.

nSubsidy >>= halvings;

2로 몇 번 나눌까에 대한 또 다른 표현입니다. 정확히는 몇 bit를 움직일까인데 2진수 정수 체계에서는 나누기 2로 사용할 수 있습니다. shift연산을 포함한 bitwise연산은 참 여러모로 섹시하다고 느끼는데 이런건 소소하게 넘 좋네요. 하여튼 반감기 수만큼 2로 나눈 값을 보상값으로 결정한다고 적혀있는 것입니다.

참고로 비트코인 코드는 여기서 보시면 됩니다. 신기하게 아직까지 컨트리뷰터가 1000명이 안되네요.

https://github.com/bitcoin/bitcoin/tree/master

50BTC에 대한 고민

비트코인 백서를 읽고 매번 왜 (1) 1BTC는 1e8 SATS일까? (2) 왜 초기 보상은 50일까에 대해 고민했었습니다. 오늘 직장동료와 이야기하며 재밌는 가설을 만들었습니다. 바로 사토시는 "백분율"에 대해 염두한 것입니다.

반감기는 결국 등비가 1/2인 등비수열입니다. 그리고 초기값이 a, 등비가 1/2인 수열의 총합은 2a입니다. 즉, 그는 총량을 100이라 보았을 때, 초기 보상을 50으로 설정한 것입니다.

그럼 우리는 현재 비트코인 블록 보상에 따라 우리가 얼마나 남은 비트코인을 채굴하는지 알 수 있습니다. 블록보상이 50BTC일때는 전체의 50%를 채굴하고 있는 것이고, 지금은 6.25%만큼을 채굴하고 있는것이죠. 이번 반감기가 지나면 우리는 총 비트코인중 3.125%만큼을 채굴하기 위해 노력한다고 볼 수 있습니다.