スクリプト
はじめに
Bitcoin スクリプトは高級プログラミング言語というよりもアセンブラ言語に近いところがある。
逆ポーランド法のように、計算したいデータをスタックに載せた後に演算命令を実行すると結果がスタックに載る。
トランザクションのデータはほとんど参照できず、当然インターネットでデータを取得することもできない。
そういった特徴があるので、よく使われているスクリプトを調査してから自分のスクリプトを作っていくのが良いだろう。
また、スクリプトを作り間違えて解けないスクリプトに支払ってしまうと、その Bitcoin はどうやっても取り戻すことができなくなる。
十分に注意が必要である。
基本的な考え方
BitcoinはUTXO方式なので、送金、すなわちamountの持ち主を移動する場合にはまだ送信していない(unspent)トランザクション(transaction)のアウトプット(output)が必要である。
略してUTXOである。
基本的に送金先はスクリプトで、その特殊形が単独鍵と思っておいて良いだろう。
単独鍵へ送金した場合、その秘密鍵を知っている人であればさらに別の送金先に転送することができる。
スクリプトへ送金した場合、そのスクリプトを「解く」ことができれば別の送金先に転送することができる。
つまり「解く」と自分のものになるのではなく、他に転送することができるようになる。
そういう意味では、他に転送して初めてそれが自分のものであったと証明できるのだ。
ドキュメント
デバッグツール
正常終了の条件
- scriptPubKey と redeemScript の対応が取れている(スクリプトを実行する条件)
- スクリプトが途中で Fail にならず最後まで終わっている
- スタックの一番上に非ゼロのデータが載っている
- スタックにデータが 1つだけ載っている(segwit以降)
スタックが 1つだけになっているという条件は segwit が有効になったときに加わったものだそうだ。
SCRIPT_VERIFY_CLEANSTACK
というフラグがあるそうだが、これは Bitcoin Core の実装で使っているフラグのようだから外からは分からないように思う(ChatGPTに聞いた)。
関連ページ