用語集 / プロトコルとアップグレード
過去中央値時刻
別名はMTPです。
- 過去中央値時刻とは?
- 過去中央値時刻はビットコインのコンセンサス上の時計です。直前11ブロックのタイムスタンプの中央値であり、時間ベースのロックタイムをすべて照合する際の基準となる値です。
BIP-113で規定されています。
ノードは、検証しているブロックの直前の11ブロックのタイムスタンプを取得し、並べ替えて、中央の値を現在時刻として使用します。この中央値は約6ブロック分前に位置するため、実時間(ウォールクロック)よりおよそ1時間遅れています。そのため、正午までロックしたコインは、午後1時ごろになって初めて使用可能になります。
仕組み
過去中央時刻(Median time past)は、GetMedianTimePastという関数から導き出されます。この関数は11のブロックエントリを遡り、各タイムスタンプを配列にコピーし、並べ替えて、中央の要素を返します。
BIP-113が定義する定数はnMedianTimeSpan = 11であるため、答えは常に11個の数値の中で6番目に小さい値になります。結果を信頼できるものにしているのは、この並べ替えです。あるブロックのタイムスタンプは親ブロックのタイムスタンプより前になることがありますが、コンセンサスルールによって、新しいタイムスタンプはその直前の11ブロックの中央値を上回ることがすでに義務付けられているため、中央値は前に進むことしかできません。したがって、1つのタイムスタンプを歪めても、マイナーにはほとんど何の利益ももたらしません。
BIP-113が解決した問題は、バグではなくインセンティブに関するものでした。旧ルールでは、トランザクションの適格性は、それを含むブロックのタイムスタンプ(マイナーが書き込む数値)に照らして判断されていました。BIPの動機の節はこれを"a perverse incentive for miners to lie about the time of their blocks in order to collect more fees"(より多くの手数料を集めるためにマイナーが自らのブロックの時刻について嘘をつくという、逆方向のインセンティブ)と呼んでいます。修正は1つの置き換えでした。コンセンサスによるIsFinalTxの呼び出しは、ブロック自身の時刻ではなく前のブロックのGetMedianTimePastを使用するようになり、このルールはコインベースを含むすべてのトランザクションに適用されます。
これはBIP9のバージョンビットによるソフトフォークとしてビット0でリリースされ、メインネットでのシグナリングは2016年5月1日UTCの午前0時に始まり、1年後にタイムアウトしました。また、BIP68およびBIP112とともに展開されたため、3つのタイムロックルールが1つのパッケージとして導入されました。
どこで見られるか
過去中央時刻は、Bitcoin CoreのRPC出力にmediantimeという名前のフィールドとして現れ、生のtimeフィールドのすぐ隣に位置します。
getblockはどのブロックについても両方を返し、getblockchaininfoは先端のタイムスタンプの隣に先端の中央時刻を報告します。これは稼働中のノードで1時間の遅れを観察する最も手早い方法です。getchaintxstatsはさらに踏み込み、そのウィンドウの幅を、2つのブロックのヘッダー時刻の差ではなく中央時刻の差として測定するため、どちらの端で1つのタイムスタンプが歪められても結果はほとんど動きません。
これが実際に影響するのはメモリプールです。Bitcoin CoreのCheckFinalTxAtTipは、候補となるトランザクションを、現在の先端の過去中央時刻と、先端より1つ高い高さに照らして評価します。そのため、期限が過ぎた瞬間にブロードキャストするウォレットは、リレーではなく拒否を受け取り、中央値が実際の時計に追いつくまで再試行を続けなければなりません。
相対タイムロックは、両端で同じ時計を引き継ぎます。BIP-68は、512秒単位で数える時間ベースのシーケンスロックを、コインをマイニングしたブロックの前のブロックの過去中央時刻から、支出の前のブロックの過去中央時刻までとして測定するため、遅れは2回現れ、ほとんど相殺されます。
過去中央時刻vsブロックヘッダーのタイムスタンプ
過去中央時刻は11のヘッダータイムスタンプから計算されますが、どのブロックにも保存されません。一方、ヘッダーのタイムスタンプはマイナーが書き込むフィールドであり、すべてのノードが永久に保持します。
Bitcoinは両方を異なる用途で使用します。ロックタイムは中央値を使用します。これは単調に進み、手数料収入のために先へ引きずられることがないためです。難易度の再調整は依然として生のヘッダー時刻を読み取ります。Bitcoin Coreは14日間のウィンドウの最後のブロックのブロック時刻を取得し、最初のブロックのブロック時刻を引き、その差からターゲットを再スケーリングします。1つのチェーンに2つの時計があるのは見た目には整いませんが、それは意図的なものです。再調整には2週間分のブロックにわたる正直な経過時間が必要であり、一方ロックタイムには単独のマイナーが動かせない数値が必要です。