Script
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賞金が要求されました。
関連項目[編集]
外部リンク[編集]
- Bitcoin IDE:ダミーのためのBitcoinスクリプト
- Bitcoin Debug Script Execution - オペコードごとにスクリプトを実行するWebツール
- Script Playground - スクリプトをJavaScriptに変換する
(cf. "[2]")</ sup>
参考文献[編集]
<リファレンス/>
Category:技術 Category:Vocabulary
|