{
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;
}
예전에도 쓴 글이 있긴한데 왜 비트코인은 반감기인데 끝이 있는지 아시나요? 매우 적은 수량이라도 계속 절반이라면 분명 받을 수 있는 게 있을텐데 말이죠.
그 이유는 컴퓨터가 수를 저장하는 방식이 2진수이고, 비트코인 구현 방식은 이를 잘 활용합니다.
컴퓨터의 이진수 저장 방식에서 부동소수점 오차를 방지하기 위해서 비트코인은 정수 형태로 수를 저장합니다. 그래서 1BTC는 실제로 코드에서는 10^8으로 저장되어 있습니다.
초기 블록 당 보상은 50BTC로 저장되어 있습니다. 즉 50 * 10^8 만큼 줍니다. 그리고 이 컴퓨터에서 나누기 2는 정말 재밌는 연산인데,,,,바로 이진수로 표현하면 엄청나게 간단한 연산이 되어버립니다.
예를 들어 10이라는 수는 이진수로 표기하면 1010(2)이 되는 데 2로 나누는 연산은 오른쪽 자리를 없앤 5= 101(2)가 됩니다. 즉 나누기 2라는 연산은 복잡할 것 없이 마지막 자리를 없애버리면 됩니다. 곱하기는 오른쪽에 0하나 붙이면 되는거죠.
그래서 이런 이진수 연산에서 비트 오른쪽으로 x 칸 옮기기, 왼쪽으로 x 칸 옮기기 연산을 제공하고 있습니다. (<<와 >>)
그래서 반감기 횟수만큼 비트를 움직이면 보상 계산이 바로 됩니다. 다만 여기서 소수점 끝자리는 다 바로 버려지게 됩니다.
컴퓨터에서 보편적으로 사용되는 정수는 32비트/64비트 표현이 있고, 32비트의 경우 부호가 없는 경우 2^32-1까지 부호가 있는 경우 2^31-1까지 양의 정수를 표현할 수 있는데, 대충 50 * 10^8은 그 언저리입니다. 그래서 32번 연산하면 비트에는 아무것도 남지 않게 되고 더 이상 반감기에는 소수점 단위로도 나눠주지 않게 되는 것입니다.
그래서 반감기 32번쯤하면 블록 보상없다.
