Bitcoinのトランザクションには欠かせない、ロジックの部分を担っているScriptについて解説します。プログラミングや初歩的な数学の知識、ビットコインの概要の理解を前提としています。この記事を読んで、最も典型的なP2PKHのScriptを理解できるようになることが目標です。私は情報学の専門ではないので、間違いがあったらコメントや編集リクエストで指摘していただけるとありがたいです。Bitcoinのトランザクションの章やこの記事を事前に読むことをおすすめします。ScriptとはScriptとは、Bitcoinのトランザクション内に書かれるプログラミング言語の一種です(チューリング完全ではないのでプログラミング言語といってよいのかは微妙)。Out)と呼ばれるデータ構造を持ちます。言う順番で処理されます。OP_ADDのように書かれ、手順は先程と同様なので、コードの左から右に向かって処理されることがわかります。Bitcoinにおいては、Scriptによって誰が、どのような条件でそのBitcoinを使用できるかということを示しています。実際のScriptを見てみる習うより慣れろということで、実際に最もよく使われているP2PKH(pay-to-public-key-hash)トランザクションのScriptを見てみましょう。<pubKey>2行に渡って書かれていますが、上の行がトランザクションのOutputに、下の行がInputに書かれます(InputとOutputがわからない人はWikiとかその日本語版とか僕が以前書いた記事を読んで下さい)。OutputにはBitcoinをロックするロジックが、Inputにはそれをアンロックするために必要なものが書かれています。OP_DUPとかOPなんちゃらって何。ことで以下に説明します。OpcodescriptPubKeyにある「OP_」ではじまる文字列のことを、オペコード(opcode)と呼びます。一般的なオペコードについて詳しくは知らないのですが、一つ前のスタックに対して処理のかたまりを実行するもの、なので関数とかメソッドに近いものだと理解しています(違ったら教えてください)。それ以外にも、定数を表すオペコードもあったりします。以下に、種類ごとにオペコードを抜粋したものを載せます。スクリプトはこんなんでした。そこにはscriptPubKeyが書かれており、適当な電子署名(sig)と公開鍵(pubkey)を与えてあげればoutputがアンロックされて、Bitcoinを送金できるというわけです。実際にアンロックされる過程を見ていきます。output)のscriptPubKeyとscriptSigを連結。電子署名と公開鍵を使ってアンロックする準備。この連結したものを、左から順番にスタックに移動していき、実行していく。<pubKey>2つの定数をスタックに移動。OP_DUPを作用させた。表のスタックの部分を見ると、「スタックの一番topのアイテムを複製する」と書いてある。topアイテムであるpubKeyが複製されている。<pubHashA>OP_HASH160を右から作用させた。pubKeyのハッシュ値を計算した。<pubKeyHash>もともとアウトプットにあったpubKeyHash(ビットコインアドレスに当たる)を右に追加した。あったpubHash(答え)が等しいことが検証された(その後はスタックには残らない)。手順7.1署名がチェックされた。正しかったので、1(true)が返された。ここでtrueが返されたので、このtransactionは有効となります(マイナーによってチェックされた後、ブロックに取り込まれる)。オペコードの意味を知って、ひとつひとつ丁寧に見ていくと、意外とシンプルなことがわかると思います。理解できなかった方も、わかりやすい参考リンクを最後に貼ったので、読んでみてください。DeRosaは特に詳しく、系統的に書かれいるのでおすすめです。練習問題bitFlyerさんの採用ページに手計算で解ける練習問題があるので、解いてみるとScriptをより理解できるかもしれません。この問題は、結局は3変数の連立一次方程式になります。注意点としては、解答は16進数に変換して入力する必要があります。現在はページが変わっています。upLoginユーザーは見つかりませんでした。