BIP: 300
Layer: Consensus (soft fork)
Title: Hashrate Escrows (Consensus layer)
Authors: Paul Sztorc <truthcoin@gmail.com>
CryptAxe <cryptaxe@gmail.com>
Status: Draft
Type: Specification
Assigned: 2017-08-14
License: BSD-2-Clause
Discussion: https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2017-May/014364.html
概要
BIP-300は、新しい種類のL2を可能にする。そこでは「引き出し」(L2からL1へのトランザクション)が、連合体や固定された公開鍵集合ではなく、プルーフ・オブ・ワークによって統治される。
BIP-300は、正直な利用者にとって正しく行うのが容易で、不正なマイナーにとって悪用が困難な、緩慢で透明性が高く監査可能な引き出しを重視する。BIP-300の主要な設計目標は分割可能性である — 利用者は望むならBIP-300のトランザクションを無視してよく、利用者がそれらすべてを検証しようと、一部だけを検証しようと、まったく検証しまいと、L1にとっては何の違いもない。第二の設計目標は安全性である — L2の利用者は、L2ネットワークが多額の手数料を支払っているならば (https://www.drivechain.info/blog/fees/)、マイナーはそれを維持したいと望むはずであり、したがって引き出しは正確に処理される、と確信できるべきである。
BIP-300がL1とこれらL2との間に「ブリッジ」を確立すれば、利用者はコインを即座に出し入れでき、最終決済にのみBIP-300を用いればよい。この構成により、ビットコインは、ブロックサイズ・ノードソフトウェア・技術スタック・非中央集権化の水準によらず、世界中のあらゆる形・規模のトランザクションを、L1をまったく変更することなく処理できるようになる。
動機
BIP-300により、強力なプライバシー (https://www.truthcoin.info/blog/zside-meltcast/)、惑星規模のスケール (https://www.truthcoin.info/blog/thunder/)、そして年間数千億ドル規模のマイニング収益 (https://www.truthcoin.info/blog/all-world-txns/)を、ライトニングネットワーク (https://www.truthcoin.info/blog/ln-blackpill/)よりもはるかに強力な (https://x.com/Truthcoin/status/1701959339508965405)セキュリティモデル (https://www.drivechain.info/blog/fees/)のもとで達成できる。
本来の動機はリード・ホフマンにまで遡る。彼は2014年にこう書いた (https://blockstream.com/2015/01/13/en-reid-hoffman-on-the-future-of-the-bitcoin-ecosystem/)。「サイドチェーンは、開発者がBitcoin Coreのコードを実際に変更することなく、ビットコインの世界に機能や特性を追加することを可能にする……その結果、単一通貨を持つ共通プラットフォームの相乗効果を失うことなく、より柔軟で分散した形で、イノベーションをより速く起こすことができる。」
詳細はdrivechain.info (http://www.drivechain.info/)を参照。
仕様
概観
BIP-300は、6種の新しいブロックチェーンメッセージから構成される。
- M1.「新規サイドチェーンの提案」
- M2.「提案へのACK」
- M3.「バンドルの提案」
- M4.「バンドルへのACK」
- M5. 入金 — メインからサイドへのBTCの移転
- M6. 引き出し — サイドからメインへのBTCの移転
ノードはこのデータをいくつかのキャッシュ (https://github.com/LayerTwo-Labs/bip300301_enforcer/blob/13a4353c39a26d9d40180ea361b7580fd682e5b5/src/bip300.rs#L79-L96)に整理する。主に以下の2つである。
- D1.「サイドチェーンリスト」
- D2.「引き出しリスト」
D1(サイドチェーンリスト)
D1は有効なサイドチェーンの一覧である。D1はM1とM2によって満たされる。フィールド #9と #10はM5とM6によって更新される。
| フィールド番号 | ラベル | 型 | 説明・目的 |
|---|---|---|---|
| 1 | エスクロー番号 | uint8_t | エスクローのID番号。各サイドチェーンを一意に指すために用いる。 |
| 2 | バージョン | int32_t | バージョン番号。 |
| 3 | サイドチェーン名 | string | サイドチェーンの人間可読な名前。 |
| 4 | サイドチェーン説明 | string | サイドチェーンの人間可読な説明。 |
| 5 | Hash1 — tarballハッシュ | uint256 | 正規のサイドチェーンソフトウェアのtar.gzのsha256ハッシュとして意図される。(これはBIP-300によって強制されるものではなく、人間向けの用途のみである。) |
| 6 | Hash2 — gitコミットハッシュ | uint160 | 正規のサイドチェーンノードソフトウェアのgitコミットハッシュとして意図される。(これはBIP-300によって強制されるものではなく、人間向けの用途のみである。) |
| 7 | Active | bool | このサイドチェーンスロットは有効なサイドチェーンを含むか? |
| 8 | 有効化状態 | int, int | 提案の経過(ブロック数)、および「失敗」(サイドチェーンにackしないブロック)の回数。サイドチェーンが有効化された後は破棄される。 |
| 9 | 「CTIP」—「TxID」 | uint256 | サイドチェーンの資金を保持するUTXO(2つのうち1つ目)。 |
| 10 | 「CTIP」—「vout」 | int32_t | サイドチェーンの資金を保持するUTXO(2つのうち2つ目)。 |
D2(引き出しリスト)
引き出しとは、L2から(すなわちBIP-300のロックされたUTXOから)コインを取り除き、L1に戻すトランザクションである。BIP-300の引き出し1回で、L2での引き出し最大6,000件をまとめて支払うことができ、(L2ごとに)一度に成功できる引き出しは1件のみである。したがって、すべてのL2利用者は同一の大きな引き出しイベントを共有するため、L1側ではこれらの引き出しを「バンドル」と呼ぶ。
D2はM3・M4・M5・M6によって駆動される。これらのメッセージは以下の原則を強制する。
- データベースは正規の順序を持つ(早い者勝ち)。
- あるブロックから次のブロックへ、すべての「残りブロック数」フィールドは1ずつ減少する。
- 「残りブロック数」がゼロに達すると、そのバンドルは取り除かれる。
- あるブロックから次のブロックへ、「ACK数」の値は最大1まで増減しうる(M4を参照)。
- あるバンドルの「ACK数」が13150以上に達すると、それは「成功」し、対応するM6メッセージをブロックに含めることができる。
- あるバンドルのM6が支払われた場合も、それは取り除かれる。
- あるバンドルが成功しえない場合(13150 −「ACK数」>「残りブロック数」)、それは直ちに取り除かれる。
| フィールド番号 | ラベル | 型 | 説明・目的 |
|---|---|---|---|
| 1 | サイドチェーン番号 | uint8_t | 引き出し要求を特定のハッシュレートエスクローに紐付ける。 |
| 2 | バンドルハッシュ | uint256 | 引き出しの試行。具体的には、サイドチェーンから資金を引き出しうるトランザクションの「ブラインドされたトランザクションID」(すなわち、2つのフィールドをゼロにしたトランザクションの二重Sha256。M6を参照)である。 |
| 3 | ワークスコア(ACK数) | uint16_t | あるバンドルが得たマイナーの支持票の数。0から始まる。増加しうる最速の速度は1ブロックあたり1。 |
| 4 | 残りブロック数 | uint16_t | このバンドルに残された寿命(ブロック数で測定)。26,300から始まりカウントダウンする。 |
M1 — サイドチェーンの提案
新しいサイドチェーンはM1で提案され、M2でACKされる。
M1は、以下を含むコインベースOP Returnアウトプットである。
1-byte - OP_RETURN (0x6a)
4-byte - Message header (0xD5E0C4AF)
N-byte - The serialization of the sidechain.
1-byte nSidechain
4-byte nVersion
x-byte title
x-byte description
32-byte hashID1
20-byte hashID2
M1は以下の場合に無効である。
- D1に重複するエントリーを追加することになる。
- このブロックにすでにM1が存在する。
- サイドチェーンのシリアライズがパースできない。
そうでなければ:
- D1に新しいエントリーが追加され、その初期有効化状態は (age=0, fails=0) である。
M2 — サイドチェーン提案へのACK
M2は、以下を含むコインベースOP Returnアウトプットである。
1-byte - OP_RETURN (0x6a)
4-byte - Message header (0xD6E1C5BF)
32-byte - the sha256D hash of sidechain's serialization
M2は、パースできない場合、または存在しないサイドチェーンに対するものである場合は無視される。
M2は以下の場合に無効である。
- このブロックにすでにM2が存在する。
- 同一のスロットに対する2つの異なるM1にACKしようとしている。
そうでなければ:
- サイドチェーンは「ACK」され、このブロックでは「失敗」を得ない(それ以外であれば得ていたはずである)。
サイドチェーンは以下の場合に有効化に失敗する。
- スロットが未使用の場合: 続く2016ブロックの間に1008回の失敗が蓄積する(すなわち50% のハッシュレート閾値)。
- スロットが使用中の場合: 続く26,300ブロックの間に13,150回の失敗が蓄積する(すなわち50% のハッシュレート閾値)。
(このため、使用中のサイドチェーンスロットを上書きできる。BIP-300のサイドチェーンは、すでに13150ブロックにつき1回の破局(無効な引き出し)に対して脆弱であるため、このスロット上書きの選択肢は安全性の前提を変えない。)
そうでなければ、サイドチェーンは有効化される(ActiveがTRUEに設定される)。
バンドルによる引き出し
サイドチェーンの引き出しは「バンドル」という形を取る — 多数の個別の引き出し要求を、まれにしか発生しない単一のL1トランザクションへと「まとめ上げる」ことからこう呼ばれる。
L2側では、個別の引き出し要求が定期的に結合され、CoinJoinに似た単一の引き出しバンドルになる。このバンドルは(L2とL1の双方で)特定の方法で (https://github.com/LayerTwo-Labs/bip300301_messages/blob/398b224981c7c236c8354704e655996d33685149/src/lib.rs#L374C1-L419C2)ハッシュ化される — この「ブラインドされたハッシュ」は自身のL1手数料にコミットするが、(注目すべきことに)その最初のトランザクションインプットにはコミットしない(その点でBIP-118 (https://github.com/bitcoin/bips/blob/master/bip-0118.mediawiki)に似ている)。
L1のマイナーが3〜6ヶ月かけて緩やかにACKしていくのはこのハッシュであり、M6自体(もちろんいかなるサイドチェーンデータも)ではない。
あるバンドルは、(M6経由で)そのすべての引き出しを支払うか、失敗する(そして誰にも何も支払わない)かのいずれかである。
M3 — バンドルの提案
M3は、以下を含むコインベースOP Returnアウトプットである。
1-byte - OP_RETURN (0x6a)
4-byte - Commitment header (0xD45AA943)
32-byte - The bundle hash, to populate a new D2 entry
1-byte - nSidechain (the slot number)
M3は、パースできない場合、または存在しないサイドチェーンに対するものである場合は無視される。
M3は以下の場合に無効である。
- このブロックにはすでに当該nSidechain向けのM3が存在する。
- このハッシュを持つバンドルがすでにD2に存在する。
- このハッシュを持つバンドルはすでに支払い済みである。
- このハッシュを持つバンドルは過去に拒否されている。
そうでなければ: M3はD2にエントリーを追加し、初期ACKスコアは1、初期残りブロック数は26,299とする。(D2に追加されること自体が、最初の支持票として数えられる。)
M4 — バンドルへのACK
あるバンドルがD2に入った後、それを有効にするのに十分なACKをどのように与えればよいか?
M4は、以下を含むコインベースOP Returnアウトプットである。
1-byte - OP_RETURN (0x6a)
4-byte - Commitment header (0xD77D1776)
1-byte - Version
n-byte - The "upvote vector" -- describes which bundle-choice is "upvoted", for each sidechain.
M4メッセージは以下の場合に無効となる(そしてそのブロックを無効にする)。
- 存在しないバンドルに支持票を投じようとしている(たとえば、サイドチェーン #2にバンドルが3個しかないのに、サイドチェーン #2の7番目のバンドルに投票しようとする場合)。
- いかなるサイドチェーンからのバンドルもまったく存在しない。
M4があるブロックに存在しない場合、それはすべてのサイドチェーンについて「棄権」として扱われる。
M4が存在し有効である場合: ACKされた各引き出しバンドルは、支持票を1票獲得する。
各サイドチェーンは常に2個の「仮想バンドル」を持つ — 「棄権」バンドル(0xFF)と「警報」バンドル(0xFE)である。棄権はACK数を変化させず、警報はすべてのバンドルのACK数をすべて1減らす。
投票を受け取らなかったバンドルは反対票を投じられる(ACKを1失う)。あるサイドチェーンに保留中のバンドルがない場合、M4の作成・パース時にそれは飛ばされる。
実例
サイドチェーン #1の7番目のバンドルに支持票を投じ、サイドチェーン #2の4番目のバンドルに支持票を投じるには、支持ベクトルは { 07, 04 } となる。そしてM4は [0x6A,D77D1776,00,0006,0003] となる。
ブロック900,000のD2が以下のとおりであるとする……
| SC番号 | バンドルハッシュ | ACK数 | 残りブロック数 |
|---|---|---|---|
| 1 | h1 | 45 | 22,109 |
| 1 | h2 | 12 | 22,008 |
| 2 | h3 | 13 | 22,999 |
| 2 | h4 | 8 | 23,550 |
| 2 | h5 | 2 | 22,560 |
……そしてD2が以下のようになろうとしているとする。
| SC番号 | バンドルハッシュ | ACK数 | 残りブロック数 |
|---|---|---|---|
| 1 | h1 | 46 | 22,108 |
| 1 | h2 | 11 | 22,007 |
| 2 | h3 | 12 | 22,998 |
| 2 | h4 | 9 | 23,549 |
| 2 | h5 | 1 | 22,559 |
……このときM4は [0x6A,D77D1776,00,0000,0001] であったことになる。
領域の節約
バージョン番号により、多くの場合において支持ベクトルを縮小できる。 バージョン0x00は支持ベクトルを完全に省略し(すなわちM4全体で6バイト)、このブロックのM4を前ブロックのM4と等しく設定する。 バージョン0x01はサイドチェーンあたり1バイトを用い、ACKされたすべての引き出しのインデックスが256未満である間(すなわち99.99% 以上の場合)に使用できる。 バージョン0x02はサイドチェーンあたり2バイトを用いるが、天文学的に起こりにくいケース(複数のサイドチェーンが256個を超えるバンドル候補を持つ場合など)でも常に機能する。 バージョン0x03は支持ベクトルを省略し、代わりに、対抗馬に対して少なくとも50票の差をつけてリードしている引き出しにのみ支持票を投じる。
たとえば、支持ベクトル { 2, N/A, 1 } は [0x6A,D77D1776,01,01,00] として表現される。これは「サイドチェーン #1の2番目のバンドルと、サイドチェーン #3の1番目のバンドルに支持票を投じる」ことを意味する(サイドチェーン #2に提案されたバンドルがない場合に限る)。
支持ベクトル { N/A, N/A, 4 } は [0x6A,D77D1776,01,03] となる。
M5 — BTCの入金(L1からL2へ)
最後に、入金(M5)と引き出し(M6)について述べる。これらはコインベースアウトプットではなく、L1上のトランザクションである。
エスクローアウトプットを使用し、コインの量を増加させるトランザクションを「M5」と呼ぶ。逆に、エスクローアウトプットを使用し、コインの量を減少させるトランザクションを「M6」と呼ぶ。こちら (https://github.com/LayerTwo-Labs/bip300301_enforcer/blob/13a4353c39a26d9d40180ea361b7580fd682e5b5/src/bip300.rs#L462C1-L462C47)を参照。
入金・引き出しが行われるたびに、古いUTXOが使用され、新しいUTXOが1個作成される。(入金・引き出しは決してUTXOの肥大化を引き起こさない。)各サイドチェーンの特定の財務UTXO(「CTIP」)は、常にD1(前述)にキャッシュされる。
すべてのM5は、以下の限りにおいて有効である。
- OP_DRIVECHAINアウトプットをちょうど1個持つ — これが新しいCTIPとなる。
- 新しいCTIPは、以前より多くのコインを保持する。
M6 — BTCの引き出し(L2からL1へ)
M6は以下の場合に無効である。
- M6のブラインドされたハッシュが、承認済みのバンドルハッシュのいずれとも一致しない。(言い換えれば、M6はまず13,150の支持票によって承認されなければならない。)
- M6の最初のアウトプットがOP_DRIVECHAINでない。(このOP_DRIVECHAINが新しいCTIPとなる。言い換えれば、引き出されなかったすべてのコインはサイドチェーンに払い戻される。)
- 2番目のアウトプットが、正確に10バイトのゼロ値OP_RETURNスクリプトでなく、その8バイトがシリアライズされたビットコイン額でない。
- M6のトランザクション手数料が、直前の項目の額と正確に一致しない。
- 最初の後に追加のOP_DRIVECHAINアウトプットが存在する。
そうでなければ、M6は有効であり、資金は引き出される。
(後半2つの項目の目的は、バンドルハッシュがL1のトランザクション手数料をカバーできるようにすることである。)
OP_DRIVECHAIN
本提案は、使用に厳密な意味論を持つ、単一の新オペコードOP_DRIVECHAINを追加する。OP_NOP5(0xb4)は、スクリプト全体がOP_DRIVECHAINに続けて1バイトのプッシュとOP_TRUE(正確に4バイト)である場合に限り、OP_DRIVECHAINとして再定義される。 この1バイトのプッシュはサイドチェーン番号を含む。 これは「スクリプト番号」ではなく、OP_1..OP_16その他いかなる種類のプッシュにもなりえないことに注意。また符号なしであり、サイドチェーン番号が127を超える場合でもパディングしてはならない。 最後のOP_TRUEは、この変更がソフトフォークであり続けることを保証するためのものである。 これがなければ、サイドチェーン番号0と128は旧来のスクリプトインタープリターを失敗させることになる。
OP_DRIVECHAINインプットが使用される場合、M5またはM6の追加ルール(前述)が強制されなければならない。
後方互換性
本ソフトフォークは、Bitcoin Coreをまったく変更することなく展開できる(すなわちCUSF (https://bip300cusf.com/)経由)。
展開
本BIPは、ハッシュレートの51% 超がエンフォーサークライアント (https://github.com/LayerTwo-Labs/bip300301_enforcer/)を実行したとき(実行すれば)展開される。
理想的には、十分な数の利用者もエンフォーサークライアントを実行することが望ましい — これにより、マイナーがこれを無効化することを強く思いとどまらせることができる。
リファレンス実装
エンフォーサーはこちら (https://github.com/LayerTwo-Labs/bip300301_enforcer/)。
また、いくつかのL2の実例はこちら (https://releases.drivechain.info/)。
著作権
本BIPはBSD 2条項ライセンスの下に提供される。
