本文へスキップ
buybitcoinsmart

用語集 / 開発者向けリファレンス

Bitcoin Script

別名はScriptです。

Bitcoin Scriptとは?
Bitcoin Scriptは、すべてのビットコインのアウトプットに組み込まれている小さなスタックベースの言語で、そのコインを再び使用できるようにするために誰かが満たさなければならない条件を定めるものです。

コインは人に送られるのではありません。短いプログラムの背後にロックされており、使用するとは、そのプログラムがスタックの一番上で真の値を残して終了するようなデータを供給することを意味します。この言語にはループも再帰もなく、レガシースクリプトは10,000バイトと201オペレーションで止まるため、検証側は作業が必ず終わると常に分かります。だからこそビットコインには暴走するコントラクトが一度も存在したことがないのです。

仕組み

Bitcoin Scriptは左から右へ読むスタックマシンで、それ以外のことは何もしません。

データのプッシュはスタックに積まれ、オペレーションは引数をスタックから取り出して結果を積み戻します。変数も、後方へのジャンプも、検証中のトランザクションの外にあるものを読む方法もありません。スクリプトは、実行がエラーなく完了し、一番上に真の値を残したときに成功します。

2つの部分が使用時に出会います。使用される出力はロックを運び、これをpubkey scriptと呼びます。それを使用する入力は証明を運び、古い出力ではsignature script、segwitの出力ではwitnessと呼びます。両者はスタックを引き継ぎながら順に実行され、1つのプログラムに連結されることは決してありません。この分離は、ロックする側にオペレータを注入できる使用者が条件を書き換えられてしまうことが明らかになった後、早い段階で導入されました。

ビットコインの歴史で最も一般的なスクリプトは、全文を読む価値があります。pay-to-public-key-hashの出力は、OP_DUP、OP_HASH160、20バイトのハッシュ、OP_EQUALVERIFY、OP_CHECKSIGを保持します。使用者は署名と公開鍵を供給します。実行は両方を積み、公開鍵を複製し、そのコピーを20バイトまでハッシュ化し、期待されるハッシュを積み、2つを比較して異なれば中止し、続いてトランザクション自体のシリアル化に対して署名を検証します。6つのステップであり、レガシーアドレスのセキュリティ全体がこれらに依存しています。

上限は意図的かつ正確です。レガシーまたはP2SHのスクリプトは10,000バイトまたは201の非プッシュオペレーションを超えてはなりません。スタック上の単一の項目は520バイトを超えてはなりません。スタックは1,000項目を超えて保持してはなりません。1つのOP_CHECKMULTISIGは20個を超える公開鍵を指定してはなりません。どの上限も、誰が何を書いてもブロックの検証コストが有界に保たれるように存在します。

この言語は2度成長しました。予約されたno-opコードに実際の意味を与えることによってです。BIP65は2015年12月にOP_CHECKLOCKTIMEVERIFYを定義し、出力が指定された時刻または高さより前に動くことを拒否できるようにしました。BIP112はOP_CHECKSEQUENCEVERIFYについて同じことを行い、2016年7月のブロック419,328から有効であり、コインが確認された時点から測定される相対的なタイムロックを追加しました。これら2つのオペコードがあるからこそ、ライトニングのチャネル、期限付きのエスクロー、タイムロック付きの相続スキームがそもそも存在できるのです。

ビットコインを購入する際にこれが重要な理由

出金先のアドレスはスクリプトの種類であり、その選択は次の手数料に現れます。

レガシーのpay-to-public-key-hashの入力を使うと、およそ148仮想バイトのコストがかかります。ネイティブsegwitの入力を使うとおよそ68かかります。BIP141が導入したwitnessの割引により、witnessデータは4分の1の料率で課金され、taprootのキーパス使用はさらに小さくなります。20sat/vBの手数料率では、この差は小額出金のコストの大部分であり、コインを動かすたびに繰り返されます。取引所が出金先アドレスの形式を選べる場合、現代的な形式を選ぶことは恒久的な割引です。

また、Scriptはマルチシグの保管庫が実際に何であるかでもあります。2-of-3の構成は、3つの公開鍵を指定して2つの署名を要求するスクリプトであり、特定のデバイスがそれを正直に表示して署名できるかどうかは、当サイトのハードウェアウォレットレビューが直接取り上げる問題です。タイムロックに基づく相続計画についても同じことが言えます。コインを回収できるのは、誰かがまだスクリプトを持っている場合だけであり、だからこそ、それを再構築するためのプレーンテキストのレシピであるoutput descriptorsが、シードフレーズと並べてバックアップに入れておくべきものなのです。

実務上の警告が1つあります。プラットフォームが貼り付けたアドレスへの送金を拒否する場合、その原因はほぼ常に、そのプラットフォームの出金コードがそのスクリプトの種類を構築できないことであり、あなたのアドレスが間違っていることではありません。大切な残高を動かす前に、なじみのないアドレス形式は少額でテストしてください。

1,840億ビットコインのバグとSatoshiが無効にしたオペコード

2010年8月15日、ブロック74,638は184,467,440,737.09551616ビットコインを生成するトランザクションを保持しており、それはそれぞれおよそ922億の2つの出力に分割されていました。

トランザクションの出力が入力超過でないことのチェックは固定幅の符号付き演算を使用しており、その演算をオーバーフローさせるほど大きな出力は負の数に合計されたため、テストは通過しました。修正済みのクライアントがおよそ5時間以内に現れ、正直なチェーンが高さ74,691で不正なチェーンを追い越しました。それらのコインは、誰もが使うチェーン上には決して存在しませんでした。

その出来事は、文字列操作と算術演算における関連するバグの一群とともに、15のオペコードが恒久的に無効化されている理由です。OP_CAT、OP_SUBSTR、OP_LEFT、OP_RIGHT、OP_INVERT、OP_AND、OP_OR、OP_XOR、OP_2MUL、OP_2DIV、OP_MUL、OP_DIV、OP_MOD、OP_LSHIFT、OP_RSHIFTです。スクリプトがそれらの1つを含んでいるだけのトランザクションは、実行されるかどうかにかかわらず無効です。無効化は時間的プレッシャーの下で適用された乱暴な手段であり、その一部を元に戻すことは進行中の作業です。BIP347はtapscript内でOP_CATを復活させることを提案しており、そこではより新しい上限によって悪用がはるかに難しくなっています。

Bitcoin Script vs tapscript

tapscriptはルールブックが書き直されたBitcoin Scriptであり、taprootのスクリプトパス使用の内部でのみ適用されます。BIP342は10,000バイトのスクリプトサイズ上限と201オペレーションの上限の両方を廃止し、OP_CHECKMULTISIGとOP_CHECKMULTISIGVERIFYを無効化し、その代わりにOP_CHECKSIGADDを追加してマルチシグのポリシーをバッチ検証できるようにしました。署名チェックは数えられるのではなく計量されます。各入力は50にそのwitnessのシリアル化されたサイズを加えた予算を受け取り、実行される各署名チェックはそこから50を消費します。同じスタックマシンで、会計が異なります。

Bitcoin Script vs pubkey script

Bitcoin Scriptは言語であり、pubkey scriptはそれで書かれた1つのプログラムです。出力はロックであるpubkey scriptを含みます。それを使用する入力は、鍵であるsignature scriptまたはwitnessを含みます。どちらもBitcoin Scriptであり、どちらか一方を単に「スクリプト」と呼ぶことが、生のトランザクションを読む際の最も一般的な混乱の原因です。なぜなら2つの半分は別々に評価され、コインを受け取った時点でコミットされていたのはそのうちの一方だけだからです。

混同しやすい用語

よくある質問

Bitcoin Scriptはチューリング完全ですか?

いいえ、それは意図的なものです。ループも再帰もなく、レガシースクリプトは10,000バイト、201オペレーションに制限されているため、バリデータは実行前にあらゆるスクリプトのコストを上限で抑えることができます。このためビットコインはガスの計測を必要としたことがありません。

ビットコインを購入するのにBitcoin Scriptを理解する必要はありますか?

いいえ、ただし出金先のアドレスの種類はスクリプトの種類であり、手数料を決めます。レガシー入力の使用には約148仮想バイトかかり、ネイティブsegwit入力ではおよそ68仮想バイトです。taprootはさらに安価です。

なぜこれほど多くのビットコインのオペコードが無効化されているのですか?

2010年に見つかったバグによるもので、その中にはブロック74,638で1,840億ビットコインを生み出した値のオーバーフローも含まれます。文字列オペコードと算術オペコードのうち15個が無効化され、現在はBIP347が、より厳しい制限が課されるtapscript内でのOP_CATの復元を提案しています。

ビットコインはスマートコントラクトを実行できますか?

一定の制限の範囲内であれば、はい。マルチシグのルール、絶対タイムロックと相対タイムロック、ハッシュロックはいずれも通常のBitcoin Scriptであり、ライトニングネットワークはそれらだけから構築されています。できないのは、ループすること、自身を呼び出すこと、トランザクションの外部からデータを読み取ることです。

次に読む

関連用語

開発者向けリファレンスのその他の用語

このページを英語で読む