用語集 / トランザクションと手数料
相対タイムロック
- 相対タイムロックとは?
- 相対タイムロックとは、取引のインプットが、使用するコインの確認から一定のブロック数または512秒間隔が経過するまで無効となる仕組みです。
BIP-68で規定されています。
BIP-68は、各インプットの4バイトのシーケンスフィールドにコンセンサス上の意味を与えましたが、それはバージョン2以上を宣言する取引に限られます。このルールは2016年5月1日に開始されたビット0でのBIP-9のversionbitsデプロイを通じてネットワークに到達し、BIP-112およびBIP-113とともに提供されました。リカバリースクリプトやチャネルスクリプトでコインを保有している場合、そのコインが移動するたびにカウントダウンは最初からやり直しになります。
仕組み
相対タイムロックはシーケンスフィールドにエンコードされ、最上位ビットがそもそも何かが起こるかどうかを決めます。
ビット31がセットされている場合、このフィールドにはコンセンサス上の意味がなく、インプットはどのブロックにも含めることができます。ビット31がクリアされている場合、ノードはフィールドを0x0000ffffでマスクし、残った16ビットを待機期間として読み取ります。単位はビット22で選びます。クリアされている場合、数値はブロック数を数え、BIP-68はその範囲を0~65,535ブロックとし、これを1.25年と呼んでいます。セットされている場合、数値は512秒の期間を数え、BIPはその範囲を33,554,431秒未満、およそ1.06年と述べています。奇妙な512が選ばれたのは、ブロックがおよそ600秒ごとに到着するためであり、両方の単位が同じ16ビットで同程度の期間をカバーします。
ブロックベースの値nを持つインプットは、それが使用するアウトプットをマイニングしたブロックのnブロック後に含めることができます。したがって値1は、その次の次ではなく、まさに次のブロックで条件を満たします。時間ベースの値が時計と比較されることはありません。BIP-68は、アウトプットをマイニングしたブロックの前のブロックのmedian time pastから、構築中のブロックの前のブロックのmedian time pastまでを測り、BIP-113はその数値を直近11ブロックのタイムスタンプの中央値と定義しています。生のタイムスタンプではなく中央値が使われるのは、コンセンサスルールが中央値の単調な前進を保証しており、それによってマイナーがブロックの時刻について嘘をついて追加の手数料を得ることができなくなるためです。
重要な例外が2つあります。このルールはコインベース取引のインプットのシーケンスフィールドには決して適用されません。また、16から21までの6つの位置は未定義のまま残され、将来のソフトフォークで新しいフィールドを設けることなく粒度や上限を引き上げられるようになっています。
使われる場面
BIP-112は、資金が入ってから30日後にタイムアウトするエスクロー契約によって相対タイムロックを機能させています。
Alice、Bob、そしてエスクローエージェントは2 of 3のスクリプトを共有します。いずれか2名がいつでも使用できます。遅延の後はAliceが単独で署名します。BIPはそのトリガーについて明快です。エスクローアドレスへの支払いが確認されるまで、時計は動き始めません。これがカレンダー上の期限との違いのすべてであり、1つのスクリプトが書き換えなしで新しいエスクローすべてに使える理由でもあります。
このルールはmempoolの挙動も形作ります。Bitcoin Coreのシーケンスロックのチェックは、現在の先端ではなく次のブロックの高さに対して実行され、未確認の親をそのブロックで確認されるものとして扱います。そのため、待機が次のブロックで満了する使用は、実際に使用可能になる少し前にリレーされます。その余裕の外に待ち行列はありません。未成熟な使用は無効であり、保留ではありません。
相対タイムロックvs OP_CHECKSEQUENCEVERIFY
相対タイムロックは取引のインプットに存在し、OP_CHECKSEQUENCEVERIFYはコインのスクリプトに存在して、使用するインプットがそれを守っているかを検査します。
BIP-68だけでは誰も拘束しません。使用を構築する者がシーケンス値を選ぶため、そこに書かれた遅延は希望であり、取引相手が頼れるルールではありません。BIP-112はこのフィールドをスクリプトから読み取れるようにすることでこの隔たりを埋めます。取引のバージョンが2未満の場合、インプットのシーケンスの無効化フラグがセットされている場合、2つの値の単位が一致しない場合、またはスタック上の数値がマスクされたシーケンスを超える場合に、このオペコードは失敗します。スタック上の値自体が無効化フラグを持つ場合、オペコードはNOPとして動作し、これは将来のソフトフォークのための意図的な余地です。これらの検査が備わって初めて、この待機はエスクローエージェントやライトニングのピアが頼れるものになります。