BIP: 113
Layer: Consensus (soft fork)
Title: Median time-past as endpoint for lock-time calculations
Authors: Thomas Kerin <me@thomaskerin.io>
Mark Friedenbach <mark@friedenbach.org>
Status: Deployed
Type: Specification
Assigned: 2015-08-10
License: PD
概要
本 BIP は、時間ロック付きトランザクションがブロックに取り込まれる資格をどう判定するかについて、その意味論を再定義する提案である。ブロック自身のタイムスタンプの代わりに直近 11 ブロックの中央値を用いることで、各ブロックごとに単調増加することを保証する。
動機
現在、トランザクションは、現在時刻またはブロック高がロックタイムで指定された値以下である場合、ブロックへの取り込みから除外される。コンセンサスルールはブロックのタイムスタンプに厳密な順序を課していないため、これは思わしくない結果を招く。マイナーは、壁時計上はまだ満期を迎えていないトランザクションを取り込むことでより多くの手数料を得るために、自分のブロックの時刻を偽るという歪んだ動機を持つことになる。
本 BIP は、トランザクションを含むブロック自身のタイムスタンプではなく、直近 11 ブロックのタイムスタンプの中央値とロックタイムを比較することを提案する。既存のコンセンサスルールはこの値が単調に増加することを保証しており、これによりマイナーが自分のブロックのタイムスタンプを偽ってより多くのトランザクション手数料を主張する余地が排除される。
本提案は、BIP65(CHECKLOCKTIMEVERIFY)が要求するロックタイム計算での信頼できる挙動を確保し、BIP68(シーケンス番号)および BIP112(CHECKSEQUENCEVERIFY)の挙動と整合させることを目指す。
仕様
トランザクションのロックタイムの値そのものは変更されない。異なるのは、トランザクションを取り込めるかどうかを判定する計算のみである。信頼できないタイムスタンプの代わりに、ロックタイム制約を検証する目的でのブロック時刻を判定するため、以下の関数が用いられる。
enum { nMedianTimeSpan=11 };
int64_t GetMedianTimePast(const CBlockIndex* pindex)
{
int64_t pmedian[nMedianTimeSpan];
int64_t* pbegin = &pmedian[nMedianTimeSpan];
int64_t* pend = &pmedian[nMedianTimeSpan];
for (int i = 0; i < nMedianTimeSpan && pindex; i++, pindex = pindex->pprev)
*(--pbegin) = pindex->GetBlockTime();
std::sort(pbegin, pend);
return pbegin[(pend - pbegin)/2];
}
ロックタイム制約はコンセンサスメソッド IsFinalTx() によって検証される。このメソッドはブロック時刻を引数の 1 つとして受け取る。本 BIP は、有効化後はコンセンサスコード内の IsFinalTx() の呼び出しが、代わりに GetMedianTimePast(pindexPrev) の戻り値を用いることを提案する。
新しい規則は、コインベーストランザクションを含むすべてのトランザクションに適用される。
本提案のリファレンス実装は、以下のプルリクエストで提供されている。
https://github.com/bitcoin/bitcoin/pull/6566
展開
本 BIP は、ビット 0 を用いた「バージョンビット」BIP9 によって展開される。
Bitcoin メインネットでは、BIP9 の starttime は 2016 年 5 月 1 日 UTC 深夜(エポックタイムスタンプ 1462060800)、BIP9 の timeout は 2017 年 5 月 1 日 UTC 深夜(エポックタイムスタンプ 1493596800)となる。
Bitcoin テストネットでは、BIP9 の starttime は 2016 年 3 月 1 日 UTC 深夜(エポックタイムスタンプ 1456790400)、BIP9 の timeout は 2017 年 5 月 1 日 UTC 深夜(エポックタイムスタンプ 1493596800)となる。
本 BIP は、BIP68 および BIP112 と同一の展開機構を用いて同時に展開されなければならない。
謝辞
マーク・フリーデンバッハ — 本 BIP のリファレンス実装の設計と作成に対して。
2013 年 7 月 16 日、#bitcoin-wizards で原案を思いついたグレゴリー・マクスウェルに感謝する。
トーマス・ケリンが本 BIP 文書を執筆した。
互換性
時間ベースのロックタイムを用いて生成されたトランザクションは、旧規則の下で想定される場合よりおよそ 1 時間長く承認に時間がかかる。これが既存のプロトコルとの互換性上の懸念を生むことは知られていない。
参考文献
BIP9: Versionbits (https://github.com/bitcoin/bips/blob/master/bip-0009.mediawiki)
BIP65: OP_CHECKLOCKTIMEVERIFY (https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki)
BIP68: Consensus-enforced transaction replacement signaled via sequence numbers (https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki)
BIP112: CHECKSEQUENCEVERIFY (https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki)
Softfork deployment considerations (http://lists.linuxfoundation.org/pipermail/bitcoin-dev/2015-August/010396.html)
Version bits (https://gist.github.com/sipa/bf69659f43e763540550)
著作権
本文書はパブリックドメインに置かれる。
