ビットコインの発行上限は約2100万BTCとされており、約4年ごとの半減期により最終的には新規発行分(コインベース報酬)は0になることが知られています。

ところで、コインベース報酬は約4年ごとに半減、つまり2で割られるのに、なぜ0になってしまうのかと疑問に感じるかもしれません。普段私たちが使う数字であれば、2で割り続けたとしても完全な0にはならず、小数点以下の数字として残り続けます。

「ビットコインにおいて小数点以下は切り捨てられる」といえば簡単な話ですが、どのように切り捨てられるのか、そもそもどのように半減されているのか、なぜ3分の2などではなく2分の1なのか、など半減期の仕組みにまで疑問が広がります。

ビットコインの価値の保存において半減期は重要な要素であるため、半減期の仕組みを知っていることで安心して次の半減期を迎えることができると考えられます。

本記事では、ビットコインの最終報酬がなぜ0であるか、半減期の仕組み、それらに関連して実はビットコインが2100万枚ちょうどにならない理由について解説します。

ビットコインの最終報酬が0になる理由

半減期回数とコインベース報酬(時期は目安)

ビットコインのコインベース報酬は、上図のように半減期ごとに報酬が半減していきます。50 BTC(5,000,000,000 sats)に始まり、33回目の半減期をもって報酬が0 satsになります。

少しわかりにくいかもしれませんが、奇数が報酬である回の次の半減期で切り捨てられていることがわかります。

ビットコインはsats未満の単位、つまり小数表現ができない設計となっています。そのため、33回目に1の半分である0.5ではなく、0になっています。

次に、ビットコインの半減期が実際にどのように動いているのか、ビットコインのコードを元に解説します。

ビットコインの発行と半減期の仕組み

ビットコインの半減において「右シフト(>>=)」が使われているのが特徴です。

下記が実際の半減期のコードです。ビットコインの半減期を知っていても、実際にコードを見るのは初めてという方も多いかと思います。

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;
}

参考:Bitcoin Coreの公式ソースコード(GitHub)

主に次のような処理が行われています。

  • halvingsには210,000ブロックごとの半減期回数の数字が入ります
  • 5,000,000,000 sats(Subsidy=コインベース報酬)をhalvingsの回数分右シフトします

非常にシンプルな形で半減期の処理が完了します。

どこで報酬が半分になっているか疑問に思うかもしれませんが、右シフト(>>=)によって数値を半分にしています。

💡
if (halvings >= 64)
return 0;
halvingsが64以上になると報酬は0になります。報酬は64bit整数で管理されており、それ以上の右シフトは未定義動作となるため、安全のため0を返す実装になっています。
64回目の半減期は2264年頃とされており、かなり未来の話です。

右シフトの特徴:半減と切り捨て

右シフトはbitを右にずらすというもので、2進数(0, 1での表現)で見るとわかりやすいです。

例えば、21(2進数では「10101」)を右シフトしていきます。

右シフト回数 2進数 10進数
0回 10101 21
1回 01010 10
2回 00101 5
3回 00010 2
4回 00001 1
5回 00000 0

2進数の列を見ると、右シフト回数が増えるたびに、1つ右にずれて一番左に0が追加されているのがわかります。一番右側に「1」がある場合、右シフトをすると切り捨てが行われます。

普段私たちが使っている10進数では10で割ると桁が1つずれますが、2進数においては2で割ると桁が1つずれます。

半減期のコードからもわかるビットコインのシンプルさ

brown ITS SIMPLE scrabble tiles

私はプログラミングにそこまで詳しくはありませんが、それでもビットコインの半減期のコードを初めて見たとき、見た目のシンプルさに驚かされました。

他にも、報酬量を表すnSubsidyは64bitの整数で表現されるようで、浮動小数点を扱いません。

仮に小数を扱ってしまうと、コンピュータにおいて「丸め誤差」という微小な数値のずれが生じてしまうおそれがあり、エラーの原因になります。

半減期が3分の2ではなく半分(2分の1)であるのは、おそらく経済設計として検証しやすくシンプルであるためであると考えられます。加えて、プログラムの世界(2進数)において2分の1の処理は簡単であるという理由も一部あると考えられます。

なお、半減期は報酬だけでなく、ビットコインのセキュリティにどのような影響を与えるのかという点も重要な論点です。半減期とハッシュレート・セキュリティの関係については、以下の記事で解説されています。

実際のところ、半減期はビットコインの「セキュリティ」に影響するのか?
今週ツイッターで話題になったツイートに「ビットコインは半減期によってハッシュレートが下落し、セキュリティが失われる(要約)」というものがありました。マイニングの持続可能性はビットコインについて知るうちに一度は疑問を抱くポイントではないでしょうか。 表面的にはその主張は正しいような気もしてきます。なぜなら、半減期でマイナーの収入が大きく減少するという部分に関しては事実であり、長い目で見ればマイナーが経済合理的にマイニングにかけられる総費用は(半減していく)新規発行分と手数料収入の合計より小さいはずですから。 しかし、元ツイートはその後で論理的に飛躍している部分と矛盾している部分のせいで誤った結論に至っていると考えます。今日はなぜビットコインマイニングは半減期によってとどめを刺されないのか、そしてビットコインの「セキュリティ」におけるマイナーと一般のノードの役割をおさらいし、ついでに発行上限の撤廃に関する議論を取り上げます。 ・ハッシュレートが一方的に下がり続ける悪循環に陥らない理由 ・マイニングが担保するセキュリティとは?一般ノードとの役割分担 ・発行上限の撤廃論者はビットコイ

ビットコインが2100万枚ちょうどにならない理由

半減期と右シフトに関係することで、実はビットコインは2100万BTCちょうどではないという話があります。ビットコインの最終的な数量は 20,999,999.9769 BTC(2,099,999,997,690,000 sats)となります。

中途半端な数字に見えますが、この数字は右シフトによる切り捨てが関係しています。

sats建で2100万BTCとの差分を計算すると、2,310,000(sats)という数字が得られます。

2,100,000,000,000,000 - 2,099,999,997,690,000 = 2,310,000(sats)

そして、ビットコインのコインベース報酬50 BTCをsats建かつ2進数で表示します。

100101010000001011111001000000000

0と1の羅列で見にくいですが、1の数を数えると11個あることが確認できます。

そして、先ほどの2100万BTCとの差分(2,310,000)を11で割ってみます。

2,310,000(sats) ÷ 11 = 210,000

勘のいい方は210,000という数字にピンと来るかと思います。こちらは、半減期の周期である21万ブロックを示しています。

50BTCの2進数表現には1が11個含まれています。右シフトでは最下位ビットが1のときに1satが失われるため、結果として11回の切り捨てが発生します。

つまり、1satが切り捨てられた期間(21万ブロック)が11回存在するため、2100万BTCに対して2,310,000 satsの差分が生じるということがわかります。

もし、ビットコインの正式な数量を答える機会があれば、半減期周期である21万ブロックと、50BTCの2進数表現の1の数から、比較的簡単に導くことができます。

まとめ:当然に疑問を持つと発見に遭遇する

本記事では、ビットコインの最終報酬が0になる理由と半減期の具体的な仕組み、それらに関連してちょうど2100万BTCにならない理由について解説しました。

ビットコインに半減期があることや、最終的に報酬が0になることは知られています。しかし、実際にどのような処理が行われているのかを知る機会は多くないため、本記事がその理解の一助となれば幸いです。

さらに、ビットコインの半減期のコードは非常にシンプルであること、2100万BTCと実際の最終数量の差分のトリビアについても記載しました。

一点、個人的に気になることがあるとすれば、最初のコインベース報酬でなぜ50BTCという2進数にすると中途半端な数字が使われたかということです。

Satoshi Nakamotoも言及していないため理由については定かではありませんが、人間の認識のしやすさを優先したのではないかと考えられます。

ビットコインにおいて当然とされる物事であっても、改めて検証してみるとおもしろい発見に遭遇することもあります。ぜひ皆さんもビットコインを探求してみてください。