## はじめにビットコインはしばしばプログラム可能な通貨と呼ばれます。そのデジタル特性は、ユーザーが資金の使用条件を定義する際に、柔軟性を高めます。ビットコインについて話すとき、会話は通常、ウォレットとコインに焦点を当てます。しかし、より正確な概念化は、ウォレットを鍵、コインを小切手、ブロックチェーンを安全な金庫として考えることです。各金庫には、小切手を挿入したり内容を確認したりするための狭い開口部があります。金庫自体へのアクセスは、正しい鍵を持っている者に限られています。キー保有者が資金を移転したい場合、彼らは金庫のロックを解除します。このプロセスは、元の(を参照する新しい小切手を作成し、それが無効化され)、意図された受取人のみがアクセスできる金庫に保管することを含みます。新しい受取人は、これらの資金を使用する際に同様の手順を踏みます。この記事では、ビットコインスクリプトを検討します。これは、ビットコインネットワーク上のノードがこれらのデジタル金庫のロックおよびアンロックメカニズムを制御するために利用するプログラミング言語です。## ビットコインの取引メカニクス私たちのアナロジーに従えば、すべてのビットコイン取引は2つの重要なコンポーネントで構成されています:金庫アクセスのためのキー ( とロックです。キーは、移転したい小切手が保管されている金庫のロックを解除し、新しい小切手は別のロックで保護された別の金庫に配置されます。この新しい金庫から資金にアクセスするには、別の特定のキーが必要です。このシステムは驚くべき柔軟性を提供します。ネットワークはさまざまなロックタイプをサポートしており、一部のボールトは複数のキーを必要とする場合があり、他のボールトはアクセスのために権限の証明を要求するかもしれません。ユーザーは特定の要件に応じて多くの条件をカスタマイズできます。技術的な用語では、鍵はscriptSigと呼ばれ、ロックはscriptPubKeyと呼ばれます。詳しく調べると、これらのコンポーネントはデータの断片とコードブロックの組み合わせとして現れ、それらが一緒になってコンパクトなプログラムを形成します。トランザクション実行中、この組み合わせはネットワーク全体に伝播します。各受信ノードはトランザクションの有効性を検証します。検証に失敗すると、資金にアクセスできなくなります。チェック)コイン(は、技術的には未使用トランザクション出力)UTXO(として知られています。適切なキーを持つユーザーは、これらの資金を利用できます。具体的には、scriptSigがキーとして機能し、scriptPubKeyがロックとして機能します。あなたのウォレットにUTXOが含まれている場合、それらは特定の公開鍵の所有権を証明できる個人のみが関連する資金を解除できるという条件を持っている可能性があります。それらを解除するには、scriptPubKeyに指定された公開鍵に対応する秘密鍵でデジタル署名されたscriptSigを提供する必要があります。## ビットコインスタックの基本スクリプトはスタックベースの言語として機能します。命令は垂直の列に配置され、実行は最上部の要素から始まります。たとえば、要素A、B、Cはスタックを形成し、Cが最上部、Aが最下部にあります。命令を実行する際、操作はスタックの最上部の要素から始まります。*要素は実行中にスタックに追加され、"ポップ"されます。*データ要素 ) は、署名、ハッシュ、および公開鍵( などで、命令 ) やオペコード( とは異なります。命令はデータを削除し、それに対して操作を実行します。この簡略化された例を考えてみましょう:**<xyz> <md5 hasher=""> <d16fb36f0911f878998c136191af705e> <check if="" equal="">**データは赤で表示され、オペコードは青で表示されます。左から右に読むと、文字列<xyz>が最初にスタックに入ります。オペコード<md5 hasher=""> )この例のための仮想(は、次にスタックのトップ要素)<xyz>(を削除し、MD5ハッシュを適用して、その結果をスタックに戻します:d16fb36f0911f878998c136191af705e。次に、\u003cd16fb36f0911f878998c136191af705e\u003e がスタックに入ります。その結果、2つの同一要素が生成されます。最後に、\u003ccheck if="" equal=""\u003e が上位2つの要素を削除し、それらを比較します。同一であれば\u003c1\u003eをスタックにプッシュし、異なる場合は\u003c0\u003eをプッシュします。命令リストの終わりに達した後、スクリプトの検証は2つのルールに従います:残りの要素がnullであるか、条件が満たされないために命令が失敗すると失敗が発生します。この例では、どちらの条件も適用されません - 非nullの要素)<1>(があり、スクリプトの有効性が確認されます。これらの同じルールは、実際のビットコイン取引にも適用されます。## ペイ・トゥ・パブキー・)P2PK(Pay-to-Pubkey )P2PK(は、最も基本的な取引形式を表します。これは、資金を特定の公開鍵にロックします。この方法で資金を受け取るためには、受取人は送信者にビットコインアドレスではなく、自分の公開鍵を提供する必要があります。2009年にサトシ・ナカモトとハル・フィンニーの間で行われた最初の取引はP2PKを利用しました。この構造はビットコインの初期に一般的でしたが、主にPay-to-Pubkey-Hash )P2PKH(に取って代わられました。P2PKのロッキングスクリプトは、次のようなシンプルな形式に従います: <public key=""> OP_CHECKSIG。名前が示すように、OP_CHECKSIGは提供された公開鍵に対して署名を検証します。対応するscriptSigは単に<signature>を含んでいます。実行プロセスは非常に簡単です: 署名がスタックに入った後、公開鍵が続きます。OP_CHECKSIGは両方の要素を検査し、署名を公開鍵と照合します。一致すればスタックに<1>が追加され、そうでなければ<0>が表示されます。P2PKは廃れてしまい、以下のセクションでその理由を探ります。## pay-to-pubkey-hash )P2PKH(Pay-to-Pubkey-Hash )P2PKH(は、ビットコインネットワークで最も一般的なトランザクションタイプを表しています。最新のウォレットソフトウェアは通常、この形式をデフォルトで実装しています。P2PKH scriptPubKey は、次の構造に従います。**OP_DUP OP_HASH160 <公開鍵="" hash=""> OP_EQUALVERIFY OP_CHECKSIG**対応するscriptSigを調べる前に、関与するopcodesを理解しましょう:) OP_DUPOP_DUPは最上位の要素を削除し、複製を作成し、両方のバージョンをスタックに再度プッシュします。これにより、元の要素を保持しながらコピーに対して操作を行うことができます。### OP_HASH160このオペコードは、スタックの最上位の要素を削除し、二重ハッシュを適用します: まずSHA-256、次にSHA-256の出力にRIPEMD-160を適用します。結果のハッシュはスタックに戻ります。### OP_EQUALVERIFYOP_EQUALVERIFYは、2つの操作、OP_EQUALとOP_VERIFYを組み合わせたものです。OP_EQUALは2つの要素を取り除き、同一性を確認し、同一であれば<1>を、異なれば<0>をプッシュします。OP_VERIFYは最上部の要素を取り除き、その真理値###非NULL(を検証します。OP_EQUALVERIFYとして組み合わさることで、最上部の2つの要素が一致しない場合、トランザクションが失敗します。対応するscriptSig構造は次のとおりです:**<signature> <公開鍵="">**P2PKH出力を解除するには、有効な署名とそれに対応する公開鍵の両方を提供する必要があります。このプロセスはP2PK実行フローに基づいており、提供された公開鍵がスクリプトに埋め込まれたハッシュと一致することを確認する機能を追加します。重要な区別:P2PKHロッキングスクリプトでは、公開鍵は隠されたままで、ハッシュのみが表示されます。ブロックチェーンエクスプローラーで未使用のP2PKH出力を調べると、公開鍵情報は表示されません。鍵は、受取人が資金を転送するときにのみ表示されます。このアプローチにはいくつかの利点があります。まず、公開鍵ハッシュは完全な公開鍵よりもコンパクトな伝送を提供します - これは2009年にサトシが実装した動機となりました。これらの公開鍵ハッシュは、ユーザーが交換するビットコインアドレスを構成します。第二に、公開鍵ハッシングは量子コンピュータの脅威に対して追加のセキュリティ層を導入します。公開鍵は支出が発生するまで隠されているため、対応する秘密鍵を特定することが非常に難しくなります。攻撃には、二つの連続したハッシュ操作)RIPEMD-160とSHA-256(を逆にする必要があります。</public></signature></public></signature></public></check></d16fb36f0911f878998c136191af705e></xyz></md5></xyz></check></d16fb36f0911f878998c136191af705e></md5></xyz>
ビットコインスクリプトのデコード:デジタルマネーの背後にあるプログラミング言語
はじめに
ビットコインはしばしばプログラム可能な通貨と呼ばれます。そのデジタル特性は、ユーザーが資金の使用条件を定義する際に、柔軟性を高めます。
ビットコインについて話すとき、会話は通常、ウォレットとコインに焦点を当てます。しかし、より正確な概念化は、ウォレットを鍵、コインを小切手、ブロックチェーンを安全な金庫として考えることです。各金庫には、小切手を挿入したり内容を確認したりするための狭い開口部があります。金庫自体へのアクセスは、正しい鍵を持っている者に限られています。
キー保有者が資金を移転したい場合、彼らは金庫のロックを解除します。このプロセスは、元の(を参照する新しい小切手を作成し、それが無効化され)、意図された受取人のみがアクセスできる金庫に保管することを含みます。新しい受取人は、これらの資金を使用する際に同様の手順を踏みます。
この記事では、ビットコインスクリプトを検討します。これは、ビットコインネットワーク上のノードがこれらのデジタル金庫のロックおよびアンロックメカニズムを制御するために利用するプログラミング言語です。
ビットコインの取引メカニクス
私たちのアナロジーに従えば、すべてのビットコイン取引は2つの重要なコンポーネントで構成されています:金庫アクセスのためのキー ( とロックです。キーは、移転したい小切手が保管されている金庫のロックを解除し、新しい小切手は別のロックで保護された別の金庫に配置されます。この新しい金庫から資金にアクセスするには、別の特定のキーが必要です。
このシステムは驚くべき柔軟性を提供します。ネットワークはさまざまなロックタイプをサポートしており、一部のボールトは複数のキーを必要とする場合があり、他のボールトはアクセスのために権限の証明を要求するかもしれません。ユーザーは特定の要件に応じて多くの条件をカスタマイズできます。
技術的な用語では、鍵はscriptSigと呼ばれ、ロックはscriptPubKeyと呼ばれます。詳しく調べると、これらのコンポーネントはデータの断片とコードブロックの組み合わせとして現れ、それらが一緒になってコンパクトなプログラムを形成します。
トランザクション実行中、この組み合わせはネットワーク全体に伝播します。各受信ノードはトランザクションの有効性を検証します。検証に失敗すると、資金にアクセスできなくなります。
チェック)コイン(は、技術的には未使用トランザクション出力)UTXO(として知られています。適切なキーを持つユーザーは、これらの資金を利用できます。具体的には、scriptSigがキーとして機能し、scriptPubKeyがロックとして機能します。
あなたのウォレットにUTXOが含まれている場合、それらは特定の公開鍵の所有権を証明できる個人のみが関連する資金を解除できるという条件を持っている可能性があります。それらを解除するには、scriptPubKeyに指定された公開鍵に対応する秘密鍵でデジタル署名されたscriptSigを提供する必要があります。
ビットコインスタックの基本
スクリプトはスタックベースの言語として機能します。命令は垂直の列に配置され、実行は最上部の要素から始まります。たとえば、要素A、B、Cはスタックを形成し、Cが最上部、Aが最下部にあります。命令を実行する際、操作はスタックの最上部の要素から始まります。
要素は実行中にスタックに追加され、"ポップ"されます。
データ要素 ) は、署名、ハッシュ、および公開鍵( などで、命令 ) やオペコード( とは異なります。命令はデータを削除し、それに対して操作を実行します。この簡略化された例を考えてみましょう:
データは赤で表示され、オペコードは青で表示されます。左から右に読むと、文字列が最初にスタックに入ります。オペコード )この例のための仮想(は、次にスタックのトップ要素)(を削除し、MD5ハッシュを適用して、その結果をスタックに戻します:d16fb36f0911f878998c136191af705e。
次に、\u003cd16fb36f0911f878998c136191af705e\u003e がスタックに入ります。その結果、2つの同一要素が生成されます。最後に、\u003ccheck if="" equal=""\u003e が上位2つの要素を削除し、それらを比較します。同一であれば\u003c1\u003eをスタックにプッシュし、異なる場合は\u003c0\u003eをプッシュします。
命令リストの終わりに達した後、スクリプトの検証は2つのルールに従います:残りの要素がnullであるか、条件が満たされないために命令が失敗すると失敗が発生します。この例では、どちらの条件も適用されません - 非nullの要素)<1>(があり、スクリプトの有効性が確認されます。これらの同じルールは、実際のビットコイン取引にも適用されます。
ペイ・トゥ・パブキー・)P2PK(
Pay-to-Pubkey )P2PK(は、最も基本的な取引形式を表します。これは、資金を特定の公開鍵にロックします。この方法で資金を受け取るためには、受取人は送信者にビットコインアドレスではなく、自分の公開鍵を提供する必要があります。
2009年にサトシ・ナカモトとハル・フィンニーの間で行われた最初の取引はP2PKを利用しました。この構造はビットコインの初期に一般的でしたが、主にPay-to-Pubkey-Hash )P2PKH(に取って代わられました。
P2PKのロッキングスクリプトは、次のようなシンプルな形式に従います: OP_CHECKSIG。名前が示すように、OP_CHECKSIGは提供された公開鍵に対して署名を検証します。対応するscriptSigは単にを含んでいます。
実行プロセスは非常に簡単です: 署名がスタックに入った後、公開鍵が続きます。OP_CHECKSIGは両方の要素を検査し、署名を公開鍵と照合します。一致すればスタックに<1>が追加され、そうでなければ<0>が表示されます。
P2PKは廃れてしまい、以下のセクションでその理由を探ります。
pay-to-pubkey-hash )P2PKH(
Pay-to-Pubkey-Hash )P2PKH(は、ビットコインネットワークで最も一般的なトランザクションタイプを表しています。最新のウォレットソフトウェアは通常、この形式をデフォルトで実装しています。
P2PKH scriptPubKey は、次の構造に従います。
OP_DUP OP_HASH160 <公開鍵="" hash=""> OP_EQUALVERIFY OP_CHECKSIG
対応するscriptSigを調べる前に、関与するopcodesを理解しましょう:
) OP_DUP
OP_DUPは最上位の要素を削除し、複製を作成し、両方のバージョンをスタックに再度プッシュします。これにより、元の要素を保持しながらコピーに対して操作を行うことができます。
OP_HASH160
このオペコードは、スタックの最上位の要素を削除し、二重ハッシュを適用します: まずSHA-256、次にSHA-256の出力にRIPEMD-160を適用します。結果のハッシュはスタックに戻ります。
OP_EQUALVERIFY
OP_EQUALVERIFYは、2つの操作、OP_EQUALとOP_VERIFYを組み合わせたものです。OP_EQUALは2つの要素を取り除き、同一性を確認し、同一であれば<1>を、異なれば<0>をプッシュします。OP_VERIFYは最上部の要素を取り除き、その真理値###非NULL(を検証します。OP_EQUALVERIFYとして組み合わさることで、最上部の2つの要素が一致しない場合、トランザクションが失敗します。
対応するscriptSig構造は次のとおりです:
<公開鍵="">
P2PKH出力を解除するには、有効な署名とそれに対応する公開鍵の両方を提供する必要があります。
このプロセスはP2PK実行フローに基づいており、提供された公開鍵がスクリプトに埋め込まれたハッシュと一致することを確認する機能を追加します。
重要な区別:P2PKHロッキングスクリプトでは、公開鍵は隠されたままで、ハッシュのみが表示されます。ブロックチェーンエクスプローラーで未使用のP2PKH出力を調べると、公開鍵情報は表示されません。鍵は、受取人が資金を転送するときにのみ表示されます。
このアプローチにはいくつかの利点があります。まず、公開鍵ハッシュは完全な公開鍵よりもコンパクトな伝送を提供します - これは2009年にサトシが実装した動機となりました。これらの公開鍵ハッシュは、ユーザーが交換するビットコインアドレスを構成します。
第二に、公開鍵ハッシングは量子コンピュータの脅威に対して追加のセキュリティ層を導入します。公開鍵は支出が発生するまで隠されているため、対応する秘密鍵を特定することが非常に難しくなります。攻撃には、二つの連続したハッシュ操作)RIPEMD-160とSHA-256(を逆にする必要があります。