見出し画像

ビットコイン半減期までの日数をblockchain.comのAPIを使って計算する

ぴーすけのWeb開発+アプリ開発の部屋

こんにちはピー助です。

ビットコイン関係のAPIについて。
ググると面白いのが沢山出てきます

その1つがblockchain.comというAPI

これはAPIキーとかもいらないし、ビットコイン限定だけど価格・ブロック高・マイニング情報をRESTAPIから取得できます

そんなblockchain.com API利用の練習も兼ね、
次回ビットコイン半減期までの日数を計算してみました。

ビットコイン半減期の基礎知識について

ビットコインは10分に1回ブロックを生成します。

1つのブロックの中には取引(トランザクション=Tx)が詰め込まれており、マイナーが承認作業を行うことでブロックにTxが追加されます

そしてマイナーがTxを承認するたびに送信者が設定した手数料がマイナーのへの報酬として支払われるわけですね。

そのマイナー報酬が半減するのが半減期です

ビットコイン(のブロックチェーン)が稼働したばかりのころ、
そのマイナー報酬は50BTCもありました。

そして次の半減期を経ながら半減していきます

  • 1回目 - 2011年12月 : 50BTC ⇒ 25BTC

  • 2回目 - 2016年7月 : 25BTC ⇒ 12.5BTC

  • 3回目 - 2020年11月 : 12.5BTC ⇒ 6.25BTC

  • 4回目 - 2024年ごろ : 6.25BTC ⇒ 3.125BTC

この半減期は210000ブロックごとに発生し、
およそ4年に1回起こるように設定されています

だから今のブロック高から半減期までの日時を計算するのはそれほど難しくありません。

ただしブロックの生成時間は10分きっかりではなく、採掘難易度などによっては9分~11分の間で変動する模様です

だから1ブロック10分で生成と割り切って計算することに

blockchain.com APIでブロック高取得

ではblockchain.com API使い方について

これは次の特徴を備えているAPIです

  • APIキーなどは一切不要で使える

  • 呼び出し回数の制限などもなし

そして取得できる情報も幅広いです

  • BTCの価格・出来高・Tx

  • ブロック高などブロックチェーン情報

  • 他ウォレット/支払い関連APIなど

ビットコイン限定なら本当に使い勝手のいいAPIです

ここではブロック高を知りたいので次のAPIを使いました。

✅ API URL : https://api.blockchain.info/stats

▼Ajaxを使うならこのように呼び出せる

$.ajax({
    url: 'https://api.blockchain.info/stats',
    type: 'GET'
}).then(
    function(data){
        console.log('data : ',data)

        /// タイムスタンプ
        const timestamp = data['timestamp']
        /// 現在までのブロック高
        const nBlocksTotal = data['n_blocks_total']
    }
)

※このAPIは10分に1回ごとに細心に更新されます

ここで必要なのは現在ブロック高を表す n_blocks_totalの値だけ。

もし他にどういった情報が返されるのか知りたいなら https://api.blockchain.info/stats に直接アクセスしてみてください。レスポンスはJSON形式で帰ってきます

実際に次回半減期までの日数・時間を求めてみる

次のことさえ理解してれば大丈夫です

  • 1つのブロックは10分ごとに生成

  • 210000ブロックごとに半減期発生

厳密にはブロック生成は9分~11分のように変動しますが、
それは個別のケースなので全体には影響を与えません。

平均すればブロック時間は10分に集約すると仮定します

実際に書いてみたコード(JS)はこういう感じです

▼半減期までの日数・時間をコンソール表示

function calcHalvingCountdown(timestamp, nBlocksTotal){
    const X_BLOCKS_TOTAL = 210000
    const leftBlocksTotal = X_BLOCKS_TOTAL
        * (Math.floor(nBlocksTotal / X_BLOCKS_TOTAL)+1)
        - nBlocksTotal
    const halvingAtBlocksTotal = nBlocksTotal+leftBlocksTotal

    let leftSecsTotal = leftBlocksTotal * 60*10
        - (Date.now() - timestamp) / 1000
    const leftDays = Math.floor(leftSecsTotal / (60*60*24))
    leftSecsTotal -= leftDays*60*60*24
    const leftHours = Math.floor(leftSecsTotal / (60*60))
    leftSecsTotal -= leftHours*60*60
    const leftMinutes = Math.floor(leftSecsTotal / 60)
    const leftSeconds = Math.floor(leftSecsTotal % 60)

    console.log(`BTC半減期まで : 
        ${leftDays}${leftHours}時間${leftMinutes}分
    `)
}

▼blockchain.comのAPI呼び出しと一緒に使う

$.ajax({
    url: 'https://api.blockchain.info/stats',
    type: 'GET'
}).then(
    function(data){
        console.log('data : ',data)

        /// タイムスタンプ
        const timestamp = data['timestamp']
        /// 現在までのブロック高
        const nBlocksTotal = data['n_blocks_total']

        /// 半減期までの残り日時を表示
        calcHalvingCountdown(timestamp, nBlocksTotal )
    }
)

▼ブロック高723027のコンソール表示結果

BTC半減期まで : 
812日7時間23分

工夫すれば半減期カウントダウンタイマーなんかも作れます。

以上、blockchain.comで半減期までの日数数えでした

もし質問・指摘などあればコメント欄からどうぞ。ではまた

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
ぴーすけのWeb開発+アプリ開発の部屋
個人でWebサービスとかAndroidアプリとかを開発している人。このnoteでは本ブログ(pisuke-code.com)よりもさらに踏み込んだ内容・重箱の隅をつつくような開発に役立つ知識を発信しています。眉毛が太い。