OP CHECKSIG
OP_CHECKSIG 'は、 scriptオペコードで、tx入力の署名が有効であることを検証するために使用されます。 OP_CHECKSIGは、2つの値がスタックにあることを想定しています。これらは、スタックの深さの順に、公開鍵とスクリプトの署名です。これらの2つの値は、通常、検証しようとしているトランザクション入力のscriptSigスクリプトを実行することによって取得されます。 scriptSigスクリプトは実行後に削除されますが、スタックはそのままになります。次に、現在使用されている前のトランザクション出力からのscriptPubKeyスクリプトが実行され、一般にOP_CHECKSIGで終了します。
標準のscriptPubKeyは、公開鍵(実際にはハッシュ)が特定の値であること、およびOP_CHECKSIGが渡すことを確認します。
通常のトランザクション入力の場合、現在のトランザクションの作成者が、使用しようとしているトランザクション出力のScriptPubKeyに正しい公開鍵を使用するScriptSig署名を正常に作成できれば、そのトランザクション入力は有効とみなされます。
目次
パラメータ[編集]
スタックパラメータとスクリプトコードに加えて、OP_CHECKSIGが正しく動作するためには、現在のトランザクションと現在のトランザクション入力のインデックスを知る必要があります。
どのように動作するか[編集]
まず、常にこの(デフォルトの)手順が適用されます: thumb | right |デフォルトプロシージャの署名検証プロセス #パブリックキーとシグネチャは、スタックからその順序でポップされます。署名形式は[<DER署名> <1バイトハッシュ型>]です。ハッシュ型の値は、sigの最後のバイトです。 #新しい添え字は、最後に解析されたOP_CODESEPARATOR(スクリプトの最後のもの)からスクリプトの最後までの命令から作成されます。 OP_CODESEPARATORがない場合、スクリプト全体がサブスクリプト(これはsubScriptと呼ばれます)になります。 #sigが存在する場合、サブスクリプトから削除されます(トランザクションの入力スクリプトに署名を持つことは標準ではありません) #すべてのOP_CODESEPARATORSはサブスクリプトから削除されます #ハッシュタイプは、sigの最後のバイトから削除され、保存されます。 #現在のトランザクションのコピーが作成されます(これはtxCopyと呼ばれます) #txCopyのすべてのトランザクション入力のスクリプトは、空のスクリプト(正確に1バイト0x00)に設定されています。 #txCopyでの現在のトランザクション入力用のスクリプトは、サブスクリプトに設定されています(長さがコード化されたvar-integerとして導入されます)。
さて、ハッシュタイプによっては、txCopyにさまざまなことが起こる可能性があります。これらは個別に議論されます。
'ハッシュ型の値(script.hから):'
名前 | 値 |
---|---|
SIGHASH_ALL | 0x00000001 |
SIGHASH_NONE | 0x00000002 |
SIGHASH_SINGLE | 0x00000003 |
SIGHASH_ANYONECANPAY | 0x00000080 |
- (hashtype&31)= SIGHASH_NONEの場合は、SIGHASH_NONEプロシージャを適用します
- (hashtype&31)= SIGHASH_SINGLEの場合は、SIGHASH_SINGLEプロシージャを適用します
- ハッシュタイプ&SIGHASH_ANYONECANPAYの場合は、SIGHASH_ANYONECANPAY-プロシージャを適用します
</ ol>
したがって、ハッシュタイプSIGHASH_ANYONECANPAYは他のハッシュタイプ手続きの後でも適用されるかもしれません<ref> gzファイルsrc / src / script.cpp in bitcoin-0.7.1 </ ref>。 4つのリストされたハッシュタイプに加えて、値0のハッシュタイプだけが(メイン)ブロックチェーンに数回現れます(そしてSIGHASH_ALLのように扱われます)。
ハッシュタイプSIGHASH_ALL(デフォルト)[編集]
デフォルトのケースでは特別な処理は行われません。これを出力の「記号」「すべて」と考えてください。これは既定の手順で既に実行されています。
Hashtype SIGHASH_NONEの手順[編集]
#txCopyの出力はゼロサイズのベクトルに設定されます。 #txCopyの現在の入力以外のすべての入力は、nSequenceインデックスがゼロに設定されています
これを出力の「記号」「なし」と考えてください。ビットコインがどこに行くのかは気にしません。
=== Hashtype SIGHASH_SINGLE ===手順
#txCopyの出力は、現在の入力インデックス+ 1のサイズにリサイズされます。 #現在の入力インデックスと同じ出力以外の他のすべてのtxCopy出力は空のスクリプトと(long)-1の値に設定されます。 #現在の入力以外のすべてのtxCopy入力は、nSequenceインデックスが0に設定されています。
これを出力の「記号」「1つ」と考えてください。他の出力がどこに行くのかは気にしません。
注意:シグネチャのSIGHASH_SINGLEタイプを使用するトランザクションは、出力より多くの入力を持つべきではありません。 しかし、(既存の実装のために)それが拒否されるのではなく、すべての "不正な"入力(つまり、最大出力インデックスよりも大きいインデックスを持つ入力)に対して、ノードはそれを検証する必要がありますただし、0000000000000000000000000000000000000000000000000000000000000001 [1]のハッシュを前提としていますが、
Hashtype SIGHASH_ANYONECANPAYの手順[編集]
#txCopy入力ベクトルの長さを1に変更します。 #このベクトルの最初の唯一のメンバとしてsubscript(長さがコード化されたvar-integerとして導入されます)が設定されます。
これを「他の人がこのトランザクションに入力を追加するようにしてください。他のビットコインがどこから来るかは気にしません」
最終的な署名チェック[編集]
バイト配列は、シリアライズされたtxCopyと、ハッシュタイプの4バイトによって構成されます。この配列はsha256が2回ハッシュされているので、パブリックキーはハッシュに対して提供されたシグネチャをチェックするために使用されます。 secp256k1楕円曲線は、指定された公開鍵を使用した検証に使用されます。
戻り値[編集]
チェックが合格すると、OP_CHECKSIGはスタックにtrueをプッシュし、そうでない場合はfalseを返します。 OP_CHECKSIG_VERIFYはスタックに何も残しませんが、チェックが合格しないとスクリプトのevalが直ちに失敗します。
コードサンプルと生のダンプ[編集]
ブロック番号170のBitcoinで最初のトランザクションを実行すると、トランザクションをシリアル化した後、ハッシュ+サイン(または確認)する前に取得されます。
- http://blockexplorer.com/block/00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee
- http://blockexplorer.com/tx/f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16
コードサンプルについては、libbitcoinも参照してください。
参考文献[編集]
<リファレンス/>
テンプレート:DISPLAYTITLE:OP CHECKSIG