Script

提供: tezos-wiki
移動先: 案内検索

Bitcoinはtransactionsのスクリプティングシステムを使用します。 Forth - like、 Script はシンプルで、スタックベースで、左から右へ処理されます。意図的にチューリング完了ではなく、ループはありません。

スクリプトは基本的に、転送されるBitcoinsを使いたい次の人がどのようにそれらにアクセスできるかを記述する各トランザクションで記録された命令のリストです。宛先BitcoinアドレスDへの典型的なBitcoin転送用のスクリプトは、ビットコインの将来の支出に単に2つの事柄を抱かせるだけである。すなわち、消費者は、 #ハッシュされたときにスクリプトに埋め込まれた宛先アドレスDを生成する公開鍵 #提供されたばかりの公開鍵に対応する秘密鍵の所有権を証明するための署名。

スクリプトは、転送されたBitcoinsを使うのに必要なもののパラメータを変更する柔軟性を提供します。たとえば、スクリプトシステムを使用して、2つの秘密鍵、または複数の鍵の組み合わせ、あるいは全く鍵を必要としないことがあります。

結合されたスクリプト内の何も障害を引き起こさず、スクリプトが終了したときに一番上のスタック項目がTrue(非ゼロ)であれば、トランザクションは有効です。もともとBitcoinsが送られてきた当事者は、別のトランザクションで使用するためにそれらを解放するために "最後に"発生するスクリプト操作を指示します。それらを費やしたいパーティーは、以前に記録されたスクリプトに入力を提供しなければなりません。その結果、結合されたスクリプトは実行を完了し、スタックの一番上に真の値を返します。

この文書は情報提供のみを目的としています。正式には、Bitcoinスクリプトは[1]で定義されています。

スタックはバイトベクトルを保持します。 数値として使用すると、バイトベクトルはリトルエンディアンの可変長整数として解釈され、最上位ビットは整数の符号を決定します。 したがって、0x81は-1を表します。 0x80はゼロの別の表現(いわゆる負の0)です。 正の0はヌル長のベクトルで表されます。 バイトベクトルは、Falseが任意の表現で表され、Trueが非ゼロの表現で表されるブール値として解釈されます。 整数と負のゼロの先行ゼロはブロックで許可されますが、標準フルノードがトランザクションを再送する前に厳密な要件によって拒否されます。 スタック上のバイトベクタは520バイト以上は許されません。 スタックから整数とboolを取るオペコードは、長さが4バイトを超えないようにする必要がありますが、加算と減算がオーバーフローし、5バイトの整数がスタックに配置される可能性があります。

オペコード[編集]

これは、オペコード、コマンド、またはファンクションとも呼ばれるすべてのスクリプトワードのリストです。

Bitcoinの非常に初期のバージョンに存在していたが、クライアントが実装にバグを持つ可能性があるという懸念から削除されたいくつかの単語があります。 この恐怖はOP_LSHIFTのバグによって動かされ、悪用されるとBitcoinノードがクラッシュする可能性があり、他の誰もがBitcoinを使うことを許可したバグによってクラッシュする可能性があります。 削除されたオペコードは「無効」と言われることもありますが、Bitcoinを使用する人にとって、「絶対に方法はありません」という誤解があります。 プロトコル)、これらのオペコードのすべてを再び有効にするための堅実な計画もありません。 彼らは歴史的な興味のためだけここに記載されています。

新しいオペコードは、OP_NOP1-OP_NOP10を使用して注意深く設計され実行されたsoftforkによって追加できます。

Falseはゼロまたは負のゼロ(任意のバイト数を使用)または空の配列で、Trueは他のものです。

定数[編集]

スクリプトについて言及するとき、これらの値を押す単語は通常省略されます。

ワード オペコード 六角 入力 出力 説明
OP_0、OP_FALSE 0 0x00 何もない。 (空の値) 空のバイト配列がスタックにプッシュされます。 (これはノーオペレーションではなく、アイテムがスタックに追加されます)。
N / A 1-75 0x01-0x4b (特別) データ 次の 'opcode' 'バイトは、スタックにプッシュされるデータです
OP_PUSHDATA1 76 0x4c (特別) データ 次のバイトには、スタックにプッシュされるバイト数が格納されます。
OP_PUSHDATA2 77 0x4d (特別) データ 次の2バイトには、リトルエンディアン順にスタックにプッシュされるバイト数が格納されます。
OP_PUSHDATA4 78 0x4e (特別) データ 次の4バイトには、リトルエンディアンの順序でスタックにプッシュされるバイト数が格納されます。
OP_1NEGATE 79 0x4f 何もない。 -1 数値-1がスタックにプッシュされます。
OP_1、OP_TRUE 81 0x51 何もない。 1 番号1がスタックにプッシュされます。
OP_2-OP_16 82-96 0x52-0x60 何もない。 2-16 単語名(2-16)の数字がスタックにプッシュされます。

フロー制御[編集]

ワード オペコード 六角 入力 出力 説明
OP_NOP 97 0x61 何も 何も 何もしない。
OP_IF 99 0x63 <式> if [ステートメント] [else [ステートメント]] * endif

先頭のスタック値がFalseでない場合、ステートメントが実行されます。先頭のスタック値が削除されます。

OP_NOTIF 100 0x64 <式> notif [ステートメント] [else [ステートメント]] * endif

先頭のスタック値がFalseの場合、ステートメントが実行されます。先頭のスタック値が削除されます。

OP_ELSE 103 0x67 <式> if [ステートメント] [else [ステートメント]] * endif 前のOP_IFまたはOP_NOTIFまたはOP_ELSEが実行されなかった場合、これらの文は、前のOP_IFまたはOP_NOTIFまたはOP_ELSEが実行された場合、これらの文は実行されません。
OP_ENDIF 104 0x68 <式> if [ステートメント] [else [ステートメント]] * endif if / elseブロックを終了します。すべてのブロックが終了するか、トランザクションが無効です。以前のOP_IFのないOP_ENDIFもまた '無効' です。
OP_VERIFY 105 0x69 True / false Nothing / 失敗 'トップスタック値が真でない場合、トランザクションを無効とマークします。先頭のスタック値が削除されます。
OP_RETURN 106 0x6a 何も "失敗" 'トランザクションを無効とマークします' 。余分なデータをトランザクションに付加する標準的な方法は、OP_RETURNとそれに続く1つのプッシュデータopからなるscriptPubKeyを持つゼロ値出力を追加することです。そのようなアウトプットは、明らかに無償であり、ネットワークへのコストを削減します。現在、トランザクションは複数のOP_RETURN出力または複数のプッシュデータopを持つOP_RETURN出力を持つために、通常は非標準(有効ですが)とみなされます。

スタック[編集]

ワード オペコード 六角 入力 出力 説明
OP_TOALTSTACK 107 0x6b x1 (alt)x1 altスタックの上に入力を置きます。メインスタックから削除します。
OP_FROMALTSTACK 108 0x6c (alt)x1 x1 入力をメインスタックの上に置きます。 altスタックから削除します。
OP_IFDUP 115 0x73 x x / x x 先頭のスタック値が0でない場合は、それを複製します。
OP_DEPTH 116 0x74 何も <スタックサイズ> スタックアイテムの数をスタックに置きます。
OP_DROP 117 0x75 x 何も 先頭のスタックアイテムを削除します。
OP_DUP 118 0x76 x x x 一番上のスタックアイテムを複製します。
OP_NIP 119 0x77 x1 x2 x2

先頭から2番目のスタックアイテムを削除します。

OP_OVER 120 0x78 x1 x2 x1 x2 x1

先頭から2番目のスタックアイテムを上にコピーします。

OP_PICK 121 0x79 xn ... x2 x1 x0 <n> xn ... x2 x1 x0 xn スタック内のアイテム n が先頭にコピーされます。
OP_ROLL 122 0x7a xn ... x2 x1 x0 <n> ... x2 x1 x0 xn スタック内のアイテム n が先頭に移動します。
OP_ROT 123 0x7b x1 x2 x3 x2 x3 x1 スタックの上の3つのアイテムは左に回転します。
OP_SWAP 124 0x7c x1 x2 x2 x1 スタックの上の2つの項目が入れ替えられます。
OP_TUCK 125 0x7d x1 x2 x2 x1 x2 スタックの一番上にある項目は、二番目から一番上の項目の前にコピーされて挿入されます。
OP_2DROP 109 0x6d x1 x2 何も 上位2つのスタック項目を削除します。
OP_2DUP 110 0x6e x1 x2 x1 x2 x1 x2 上位2つのスタック項目を複製します。
OP_3DUP 111 0x6f x1 x2 x3 x1 x2 x3 x1 x2 x3 上位3つのスタック項目を複製します。
OP_2OVER 112 0x70 x1 x2 x3 x4 x1 x2 x3 x4 x1 x2 スタック内の2つのスペースを前面に向かってコピーします。
OP_2ROT 113 0x71 x1 x2 x3 x4 x5 x6 x3 x4 x5 x6 x1 x2 5番目と6番目の項目は、スタックの先頭に移動されます。
OP_2SWAP 114 0x72 x1 x2 x3 x4 x3 x4 x1 x2 上位2組のアイテムを入れ替えます。

スプライス[編集]

無効に設定されたオペコードがスクリプトに存在する場合は、中断して失敗する必要があります。

ワード オペコード 六角 入力 出力 説明
OP_CAT 126 0x7e x1 x2 アウト 2つの文字列を連結します。 "無効になっている"
OP_SUBSTR 127 0x7f 開始サイズ アウト 文字列のセクションを返します。 "無効になっている"
OP_LEFT 128 0x80 サイズ アウト 指定したポイントの文字列を文字列に残します。 "無効になっている"
OP_RIGHT 129 0x81 サイズ アウト 文字列内の指定されたポイントの右にある文字だけを保持します。 "無効になっている"
OP_SIZE 130 0x82 in サイズ スタックの先頭の要素の文字列の長さを(ポップすることなく)プッシュします。

ビット論理[編集]

無効に設定されたオペコードがスクリプトに存在する場合は、中断して失敗する必要があります。

ワード オペコード 六角 入力 出力 説明
OP_INVERT 131 0x83 in アウト 入力のすべてのビットを反転します。 "無効になっている"
OP_AND 132 0x84 x1 x2 アウト ブール を入力の各ビットの間に入れます。 "無効になっている"
OP_OR 133 0x85 x1 x2 アウト "入力の各ビットの間に"または "をブールします。 "無効になっている"
OP_XOR 134 0x86 x1 x2 アウト Boolean | "入力の各ビット間で"排他的 "または" "無効になっている"
OP_EQUAL 135 0x87 x1 x2 True / false 入力が完全に等しい場合は1を返し、そうでない場合は0を返します。
OP_EQUALVERIFY 136 0x88 x1 x2 Nothing / 失敗 OP_EQUALと同じですが、後でOP_VERIFYを実行します。

算術[編集]

注:算術入力は符号付き32ビット整数に制限されていますが、出力がオーバーフローする可能性があります。

これらのコマンドの入力値が4バイトより長い場合、スクリプトは中断して失敗する必要があります。 スクリプトに「無効」とマークされたオペコードがある場合は、中止して失敗する必要があります。

ワード オペコード 六角 入力 出力 説明
OP_1ADD 139 0x8b in アウト 1が入力に追加されます。
OP_1SUB 140 0x8c in アウト 1が入力から減算されます。
OP_2MUL 141 0x8d in アウト 入力に2を掛けます。 disabled
OP_2DIV 142 0x8e in アウト 入力を2で割ります。
OP_NEGATE 143 0x8f in アウト 入力の記号が反転します。
OP_ABS 144 0x90 in アウト 入力は正になります。
OP_NOT 145 0x91 in アウト 入力が0または1の場合、反転されます。それ以外の場合、出力は0になります。
OP_0ノテック 146 0x92 in アウト 入力が0の場合は0を返します。そうでない場合は1を返します。
OP_ADD 147 0x93 a b アウト aがbに追加されます。
OP_SUB 148 0x94 a b アウト bはaから引きます。
OP_MUL 149 0x95 a b アウト aにbを掛けます。 "無効になっている"
OP_DIV 150 0x96 a b アウト aをbで割ります。 "無効になっている"
OP_MOD 151 0x97 a b アウト aをbで割った余りを返します。 "無効になっている"
OP_LSHIFT 152 0x98 a b アウト 記号を保存している左のbビットをシフトします。 "無効になっている"
OP_RSHIFT 153 0x99 a b アウト 記号を保持して右のbビットをシフトします。 "無効になっている"
OP_BOOLAND 154 0x9a a b アウト aとbの両方が ""(ヌル文字列)でない場合、出力は1です。
OP_BOOLOR 155 0x9b a b アウト aまたはbが ""(ヌル文字列)でない場合、出力は1です。それ以外の場合は0です。
OP_NUMEQUAL 156 0x9c a b アウト 数値が等しい場合は1を返し、そうでない場合は0を返します。
OP_NUMEQUALVERIFY 157 0x9d a b Nothing / 失敗 OP_NUMEQUALと同じですが、後でOP_VERIFYを実行します。
OP_NUMNOTEQUAL 158 0x9e a b アウト 数値が等しくない場合は1を返し、そうでない場合は0を返します。
OP_LESSTHAN 159 0x9f a b アウト aがbより小さい場合は1を返し、そうでない場合は0を返します。
OP_GREATERTHAN 160 0xa0 a b アウト aがbより大きい場合は1を返し、そうでない場合は0を返します。
OP_LESSTHANOREQUAL 161 0xa1 a b アウト aがb以下の場合は1を返し、そうでない場合は0を返します。
OP_GREATERTHANOREQUAL 162 0xa2 a b アウト aがb以上の場合は1を返し、それ以外の場合は0を返します。
OP_MIN 163 0xa3 a b アウト aとbの小さい方を返します。
OP_MAX 164 0xa4 a b アウト aとbのうち大きい方を返します。
OP_WITHIN 165 0xa5 x min max アウト xが指定された範囲内にある場合は1を返し、それ以外の場合は0を返します。

暗号化[編集]

ワード オペコード 六角 入力 出力 説明
OP_RIPEMD160 166 0xa6 in ハッシュ 入力はRIPEMD-160を使用してハッシュされます。
OP_SHA1 167 0xa7 in ハッシュ 入力はSHA-1を使用してハッシュされます。
OP_SHA256 168 0xa8 in ハッシュ 入力はSHA-256を使用してハッシュされます。
OP_HASH160 169 0xa9 in ハッシュ 入力は2回ハッシュされます。最初はSHA-256で、次にRIPEMD-160でハッシュされます。
OP_HASH256 170 0xaa in ハッシュ 入力はSHA-256で2回ハッシュされます。
OP_CODESEPARATOR 171 0xab 何も 何も すべての署名検査語は、最も最近実行されたOP_CODESEPARATORの後のデータとのみ一致します。
OP_CHECKSIG 172 0xac sig pubkey True / false トランザクションの出力、入力、およびスクリプト全体(最後に実行されたOP_CODESEPARATORから最後まで)がハッシュされます。 OP_CHECKSIGが使用する署名は、このハッシュと公開鍵の有効な署名でなければなりません。そうである場合は1が返され、それ以外の場合は0が返されます。
OP_CHECKSIGVERIFY 173 0xad sig pubkey Nothing / 失敗 OP_CHECKSIGと同じですが、OP_VERIFYは後で実行されます。
OP_CHECKMULTISIG 174 0xae x sig1 sig2 ... <署名の数> pub1 pub2 <公開鍵の数> 真/偽 ECDSAの一致が見つかるまで、最初の署名と各公開鍵を比較します。次の公開鍵で始まり、ECDSAの一致が見つかるまで、残りの公開鍵と2番目の署名を比較します。このプロセスは、すべての署名がチェックされるか、成功した結果を出すのに十分な公開鍵が残らなくなるまで繰り返されます。すべての署名は公開鍵と一致する必要があります。公開鍵は署名比較に失敗した場合に再度チェックされないので、対応する公開鍵がscriptPubKeyまたはredeemScriptに置かれたのと同じ順序でscriptSigに署名を配置する必要があります。すべての署名が有効な場合は1が返され、それ以外の場合は0が返されます。バグのために、1つの余分な未使用値がスタックから削除されます。
OP_CHECKMULTISIGVERIFY 175 0xaf x sig1 sig2 ... <署名の数> pub1 pub2 ... <公開鍵の数> Nothing / 失敗 OP_CHECKMULTISIGと同じですが、OP_VERIFYは後で実行されます。

ロックタイム[編集]

ワード オペコード 六角 入力 出力 説明
OP_CHECKLOCKTIMEVERIFY(以前はOP_NOP2) 177 0xb1 x x / 失敗

先頭スタック項目がトランザクションのnLockTime項目より大きい場合、トランザクションを無効とマークします。そうでなければ、OP_NOPが実行されたかのようにスクリプトの評価が続きます。スタックが空の場合、トランザクションは無効です。または2.上のスタック項目が負である。または3.トランザクションのnLockTimeフィールドが500000000未満の間、最上位のスタック項目が500000000以上か、またはその逆。または4.入力のnSequenceフィールドが0xffffffffに等しい。正確なセマンティクスについては、BIP 0065を参照してください。

OP_CHECKSEQUENCEVERIFY(以前OP_NOP3) 178 0xb2 x x / 失敗 '入力の相対ロック時間が(nSequenceのBIP 0068で実施されている)が最上位のスタック項目の値と等しくないか、またはそれより長い場合。正確なセマンティクスについては、BIP 0112を参照してください。

擬似単語[編集]

これらの単語は、トランザクションマッチングを支援するために内部的に使用されます。実際のスクリプトで使用すると無効です。

ワード オペコード 六角 説明
OP_PUBKEYHASH 253 0xfd OP_HASH160でハッシュされた公開鍵を表します。
OP_PUBKEY 254 0xfe OP_CHECKSIGと互換性のある公開鍵を表します。
OP_INVALIDOPCODE 255 0xff まだ割り当てられていないオペコードと一致します。

予約語[編集]

割り当てられていないオペコードも予約されています。割り当てられていないオペコードを使用すると、トランザクションは無効になります。

ワード オペコード 六角 使用すると...
OP_RESERVED 80 0x50 '実行されていないOP_IFブランチで発生しない限り、トランザクションは無効です'
OP_VER 98 0x62 '実行されていないOP_IFブランチで発生しない限り、トランザクションは無効です'
OP_VERIF 101 0x65 '実行されていないOP_IF分岐で発生した場合でもトランザクションは無効です'
OP_VERNOTIF 102 0x66 '実行されていないOP_IF分岐で発生した場合でもトランザクションは無効です'
OP_RESERVED1 137 0x89 '実行されていないOP_IFブランチで発生しない限り、トランザクションは無効です'
OP_RESERVED2 138 0x8a '実行されていないOP_IFブランチで発生しない限り、トランザクションは無効です'
OP_NOP1、OP_NOP4-OP_NOP10 176、179-185 0xb0、0xb3-0xb9 単語は無視されます。トランザクションを無効としてマークしません。

スクリプトの例[編集]

以下は興味深いスクリプトのリストです。 スクリプトにメモを付けるとき、スタックにプッシュされるデータは、通常、山括弧 データプッシュコマンドは省略されています。 括弧で囲まれていない単語はオペコードです。 これらの例には接頭辞 "OP_"が含まれていますが、省略することはできます。 従って "<pubkey1> <pubkey2> OP_2 OP_CHECKMULTISIG" 省略してもよい "<pubkey1> <pubkey2> 2 CHECKMULTISIG"。 ノードからノードに中継される少数の標準スクリプトフォームがあることに注意してください。 非標準のスクリプトはブロック内にあれば受け入れられますが、ノードはそれらを中継しません。

Bitcoinアドレスへの標準トランザクション(pay-to-pubkey-hash)[編集]

 scriptPubKey:OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG  scriptSig:<sig> <pubKey>

スクリプトがワイヤ上でどのように見えるかを示すために、ここには生のscriptPubKeyがあります: <前> 76 A9 14 OP_DUP OP_HASH160プッシュするバイト数

89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA 88 AC                       OP_EQUALVERIFYをプッシュするデータOP_CHECKSIG </ pre>

注意:scriptSigは支出トランザクションの入力にあり、scriptPubKeyは以前の未使用トランザクション、すなわち「利用可能」トランザクションの出力にあります。

各単語の処理方法は次のとおりです。

スタック スクリプト 説明
空です。 <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG scriptSigとscriptPubKeyが結合されます。
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 定数がスタックに追加されます。
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 上のスタックアイテムが複製されます。
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 上のスタックアイテムがハッシュされています。
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 定数が追加されました。
<sig> <pubKey> OP_CHECKSIG 均等性は、上位2つのスタック項目の間でチェックされます。
空です。 署名は、上位2つのスタックアイテムに対してチェックされます。


古くなったpay-to-pubkeyトランザクション[編集]

OP_CHECKSIGは、最初に公開鍵をハッシュすることなく直接使用されます。 これはBitcoinの初期のバージョンでBitcoinアドレスが導入される前に人々がIPアドレスに直接支払った場所で使われました。 このトランザクションフォームのscriptPubKeysは、Bitcoin Coreによるユーザーへの支払いとして引き続き認識されます。 このトランザクション形式の欠点は、公開鍵全体を事前に知っておく必要があり、支払いアドレスが長くなることを意味し、ECDSA署名アルゴリズムが中断した場合の保護が低下することです。

 scriptPubKey:<pubKey> OP_CHECKSIG  scriptSig:<sig>

チェックプロセス:

スタック スクリプト 説明
空です。 <sig> <pubKey> OP_CHECKSIG scriptSigとscriptPubKeyが結合されています。
<sig> <pubKey> OP_CHECKSIG 定数はスタックに追加されます。
空です。 署名は、上位2つのスタックアイテムに対してチェックされます。

供給不能/プルーナブルな出力[編集]

トランザクションを不可能なものとしてマークする標準的な方法は、次の形式のscriptPubKeyを使用することです。

  scriptPubKey:OP_RETURN {ゼロ以上の値}

OP_RETURNはすぐにスクリプトを無効とマークし、その出力を消費する可能性のあるscriptSigが存在しないことを保証します。したがって、たとえそれが費やされていなくても、UTXOセットから即座に出力をプルーニングすることができます。 eb31ca1a4cbd97c2770983164d7560d2d03276ae1aee26f12dc2c6424252f29は一例です.1つの出力が0であるため、UTXOセットにエントリを追加せずに取引を採掘した鉱夫にフル0.125BTCの料金を与えます。 1a2e22a717d626fc5db363582007c46924ae6b28319f07cb1b907776bd8293fcに示すように、OP_RETURNを使用してUTXOセットにデータが現れずにトランザクションにデータを追加することもできます。 P2Poolは、作成したブロックのコインベース内の共有チェーンハッシュtxoutでこれを行います。


誰もが使えるアウトプット[編集]

逆に、誰かがトランザクションを費やすことができます。

  scriptPubKey :(空)   scriptSig:OP_TRUE

いくつかのソフトウェアの変更により、そのような取引は、取引手数料に加えて資金を鉱夫に寄付する方法として使用することができます。そのような取引を行う鉱夫は、管理している住所に資金を送付した後、このメカニズムは、証明可能な方法で資金を犠牲にするために忠実度のある債券のために将来使用される可能性があります。

誰でも使用できる出力は、現在、非標準と見なされており、P2Pネットワーク上では中継されません。

将来、ある時点まで資金を凍結する[編集]

OP_CHECKLOCKTIMEVERIFYを使用すると、将来の特定の時点まで、資金を証明できないようにすることができます。

 scriptPubKey:<有効期限> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG  scriptSig:<sig> <pubKey>

スタック スクリプト 説明
空です。 <sig> <pubKey> <有効期限> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG scriptSigとscriptPubKeyが結合されます。
<sig> <pubKey> <有効期限> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 定数がスタックに追加されます。
<sig> <pubKey> <有効期限> OP_DROP OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 上のスタックアイテムは、現在の時間またはブロックの高さと照合されます。
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 上のスタックアイテムが削除されます。
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 上のスタックアイテムが複製されます。
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 上のスタックアイテムがハッシュされています。
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG 定数が追加されました。
<sig> <pubKey> OP_CHECKSIG 均等性は、上位2つのスタック項目の間でチェックされます。
空です。 署名は、上位2つのスタックアイテムに対してチェックされます。

トランザクションパズル=[編集]

トランザクションa4bfa8ab6435ae5f25dae9d89e4eb67dfa94283ca751f393c1ddc5a837bbc31bは興味深いパズルです。

 scriptPubKey:OP_HASH256 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000 OP_EQUAL  scriptSig:<データ>

トランザクションを費やすには、データを2回ハッシュすると指定されたハッシュが2回発生するようなデータが必要になります。

スタック スクリプト 説明
空です。 OP_HASH256 <given_hash> OP_EQUAL
<データ> OP_HASH256 <given_hash> OP_EQUAL scriptSigがスタックに追加されました。
<data_hash> <given_hash> OP_EQUAL データはハッシュされます。
<data_hash> <given_hash> OP_EQUAL 指定されたハッシュがスタックにプッシュされます。
空です。 ハッシュは比較され、スタックには真のままです。

このトランザクションは、09f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1によって正常に費やされました。必要なデータはGenesis blockであり、スクリプト内の指定されたハッシュは、SHA-256で2回ハッシュされた起源ブロックヘッダでした。このようなトランザクションは楽しいものですが、署名が含まれていないため、それらを使用しようとするトランザクションを別のトランザクションに置き換えて、別の場所に送金することができるため、安全ではありません。

ハッシュ衝突のインセンティブな発見[編集]

2013年、Peter Toddは、ハッシュ衝突が見つかった場合に真となるスクリプトを作成しました。これらのスクリプトの結果であるBitcoinアドレスには、お金を送付することができます。誰かがハッシュコリジョンを見つけた場合、そのアドレスにビットコインを費やすことができるので、この設定は誰かにインセンティブとして働きます。

たとえば、SHA1スクリプト:

 scriptPubKey:OP_2DUP OP_EQUAL OP_NOT OP_VERIFY OP_SHA1 OP_SWAP OP_SHA1 OP_EQUAL  scriptSig:<preimage1> <preimage2>

ハッシュコリジョン賞金に関するBitcointalkスレッド<ref> bitcointalkフォーラムスレッド </ ref>とredditスレッド<ref> https://www.redditを参照してください。詳細については、com / r / Bitcoin / comments / 1mavh9 / trustless_bitcoin_bounty_for_sha1_sha256_etc / </ ref>を参照してください。

2017年2月には、2.48ビットコアのSHA1賞金が要求されました。

関連項目[編集]

外部リンク[編集]

(cf. "[2]")</ sup>

参考文献[編集]

<リファレンス/>

Category:技術 Category:Vocabulary