MSTR Cat

ブロックチェーン/レベル IV · プロトコルを深く知る/4.1 Script/レッスン 1

スクリプト:スタック言語

実行を制限するスタックと、サトシが無効にしたオペコード

用意するもの紙1枚とペンビットコインブロックエクスプローラーへのアクセスBitcoin Wikiの「Script」ページ

問い

  1. ループのない言語は、なぜすべてのノードを無限の計算から守れるのでしょうか?
  2. 2010年にパッチが適用されるまで、誰でも他人のコインを使えてしまった具体的なバグとは何だったのでしょうか?
  3. アウトプットにデータを載せたまま、どうすれば証明可能な形で使用不可能とマークできるのでしょうか?

探究

  1. Bitcoin Scriptは、Forth風の小さなスタックベース言語です。ループや再帰がなく、意図的にチューリング完全ではない設計になっています。この設計により、すべてのスクリプトの実行コストには上限があり、予測可能です。無限に実行されたり、無制限にリソースを消費したりできるスクリプトは存在せず、汎用的なコードにつきもののサービス拒否攻撃からネットワークを守ります。このシンプルさにより、どのノードもリソース枯渇のリスクを負うことなく、トランザクションを決定論的に検証できます。
  2. すべてのアウトプットには、支出条件を定めるロッキングスクリプト(scriptPubKey)が含まれています。支出者は、scriptSig、またはSegWit以降であればウィットネスデータによって、ロック解除用のデータを提供します。実行時にはデータがスタックに積まれ、オペコードが左から右へと適用されます。実行がエラーなく終了し、スタックの最上部に真の値が残っていれば、その支出は有効です。この二値の結果によって、秘密鍵を一切明かすことなくビットコインが守られます。その根拠は身元確認ではなく、暗号学的な検証です。
  3. 2010年、バグが見つかったことを受けて、サトシ・ナカモトは予防措置としてOP_CATやOP_MULを含むいくつかのオペコードを無効にしました。そのうちの1つ(OP_LSHIFT)のバグは、ノードをクラッシュさせる可能性がありました。さらに深刻な欠陥は、scriptSigとscriptPubKeyを連結して1つのスクリプトとして実行する仕組みにありました。OP_RETURNで終わるscriptSigは、ロッキングスクリプトが実行される前に「true」で実行を終えることができ、誰でも他人のコインを使えてしまったのです。最初の修正では、OP_RETURNが即座に失敗するようにしました。その後のリリースではさらに踏み込み、scriptSigとscriptPubKeyを別々のスクリプトとして実行するようにしました。この変更によってセキュリティモデルが強化され、悪用されたり予測不能な動作を引き起こしたりするおそれのある危険な操作が取り除かれました。
  4. OP_RETURNは、そのアウトプットが証明可能な形で使用不可能であることを示します。これは、有効な支出経路を作ることなく、少量のデータをオンチェーンに埋め込むために使われます。OP_RETURNを満たせる署名は存在しないため、そのコインは永久にロックされますが、付随するデータはブロックチェーンの履歴の一部として残ります。このようなアウトプットは決して使用できないため、ノードはそれらを使用可能なコインの集合から除外します。
  5. その仕組みを理解するために、紙の上で「2 3 OP_ADD 5 OP_EQUAL」という手順を追ってみましょう。スタックは空の状態から始めます。まず2をプッシュし、次に3をプッシュします。OP_ADDを適用して両方の値をポップし、その合計である5をプッシュします。再び5をプッシュします。OP_EQUALを適用してスタックの最上部にある2つの値を比較すると、一致するためtrue(1)がプッシュされます。最終的にスタックにはtrueの値が1つだけ残り、有効性の条件を満たします。この単純な算術演算は、オペコードがどのようにしてスタックを操作して条件を評価するかを示しています。
  6. ブロックエクスプローラーを開き、任意の標準的なトランザクションを見つけてください。アウトプット部分にあるscriptPubKeyを確認しましょう。レガシーなP2PKHアウトプットではOP_DUP、ネイティブSegWitではOP_0、TaprootではOP_1で始まります。次に、そのようなアウトプットを使用しているトランザクションを開き、条件を満たす署名と鍵を探してください。レガシーアウトプットではscriptSig内に、SegWitとTaprootではウィットネス内にあります。これらによって、検証するすべてのノードの実行スタックに真の値が残ります。

重要な事実

  • ビットコインスクリプトはチューリング完全ではなく、ループも再帰もありません。
  • バグが発見された後、予防措置としてサトシは2010年にOP_CAT、OP_MULなどのオペコードを無効にしました。
  • 2010年以降、scriptSigとscriptPubKeyは連結されるのではなく、別々に実行されます。
  • OP_RETURNは、データ埋め込みのために、そのアウトプットが証明可能な形で使用不可能であることを示します。
  • 有効な支出では、実行スタックの最上部に真の値が残ります。
  • 任意の計算ができないため、すべてのスクリプトのコストには上限があります。

演習 九・六・三・一

9集めるビットコインスクリプトのオペコードを9つ挙げてください。どれが無効で、どれがスタックを直接変更し、どれが暗号学的なチェックを行うかも記載してください。
6まとめる9つを機能別に6つのグループに分けてください:算術、比較、スタック操作、暗号検証、データ埋め込み、廃止・削除済み。
3絞り込む6つを、スクリプトが意図的に制限されたままにされた3つの理由に絞り込んでください。
1結晶化する実行が有限に制限されていることが、悪意のあるスクリプトからネットワークをどのように守るのかを1文で書いてください。

事実確認

日付、数字、主張は、下記に記載された公表資料と照合して確認しました。

インタラクティブ版で開く →

EN PT ES ZH KO RU DE FR MS