トランザクションScriptについて

はじめまして、HashHubインターンの冨澤(たかてぃ)です!
去年の10月から大学を休学し21年間住んでいた沖縄を離れて、
ブロックチェーンを勉強しに来ました。
とても寒い毎日にいじめられながら、頑張ってます。。

今回からTechBlog参加です! 緊張、、。
さて初投稿となるこの記事では、トランザクションScriptについてまとめてみました。
トランザクションの有効性の検証はどうやって行っているのか。簡単な例を使って流れを理解しましょう。

目次
*トランザクションscriptとは
*トランザクションとは
*トランザクションscriptの仕組み
*script言語
*スタック構造
*トランザクションの有効性検証
*最後に

!!追記!!
script言語の特徴に関して、間違った箇所があるとご指摘を頂いたので修正しました。


*トランザクションscriptとは

Bitcoinのトランザクションが有効か無効かを検証するために必要な仕組みです。
この仕組みを使って、トランザクションは本当に正しい送信者からのinputであるか、正しい送信先にoutput出来ているのかを、scriptを使って検証します。


*トランザクションとは

まずトランザクションから説明していきます。

トランザクションとは、Bitcoinネットワーク参加者間で行われている価値の移転を記録したデータのことです。
では、そのトランザクションのデータ構造を見てみます。

トランザクションには取引に関する情報が含まれています。今回注目するポイントは、txoutsのscript_pubkeyとtxinsのscript_sigの部分です。この2つが、トランザクションの検証の際に必要になり、script言語と呼ばれる言語で書かれています。


*トランザクションscriptの仕組み

・script_pubkeyとscript_sigについて
さてトランザクションの検証の際に必要なものが、script_pubkeyとscript_sigということがわかりました。
具体的には、同時にこの2つのscriptを実行して、script_pubkeyが解除される(=script_pubkeyがtrueになる)かを確認しています。tureになれば、有効性が確認されます。

ここからもう少し深く掘り下げていきます。
まずは、script_pubkey。これは、「locking script」とも呼ばれています。
ここには、次回outputを使用する際の解除するための条件を指定しています。
例えば、Bitcoin送信先のアドレスや公開鍵を指定するなどです。

次に「unlocking script」とも呼ばれているscript_sigは、inputでの条件解除をします。解除することによってoutputでの使用が可能になります。

先ほどこの2つはscript言語で書かれていると言いましたが、次はそのscript言語について説明します。


*script言語

・特徴
チューリング不完全な言語
ループや複雑なフロー制御機能ができないように制限されています(条件分岐は可能)。これは、無限ループを作ることやネットワークを使ったDoS攻撃を起こすようなトランザクションに内在する「logic bomb」などを作らせないように考えられています。
非常にシンプルな言語で検証時の仕組みが、脆弱性を生むことを防いでいます。

ステートレスな検証
これはscript実行前後で、状態を一切保存しないということです。つまり、script実行に必要な情報は全てscriptの中に含まれているということです。ということは、Bitcoinネットワークに参加している人ならscriptを検証できかつ、有効なトランザクションなら全ての人に有効だということです。

というようにいくつかの特徴を持っています。
このscript言語はstackというデータ構造を持っています。


*スタック構造

stackとは、データを上から積み上げていき、取り出す際は一番最後に格納したを取り出すデータ構造です。

データを上から格納することを、「push」
データを上から取り出すことを、「pop」
と呼ばれ、コードは左から順に処理されます。


*トランザクションの有効性検証

ここで、どのようにトランザクションの有効性を検証しているか確認していきます。
トランザクションが有効と判断されるには、最後に実行結果がTrueになればよかったですね。
今回は、unlocking script+locking scriptでscript実行の結果がTrueになる簡単な例を実行します。

Unlocking script:
2
Locking script:
3 OP_ADD 5 OP_EQUAL

script言語でよく出てくるOP_codeという命令の処理が出てきているので確認します。

OP_ADD:
スタックから上2つの数値をpopして加算し、その結果をpush。
OP_EQUAL:
スタックから2つの数値をpopして、等しければTrueをpush。

有効性を検証する際、unlocking script+locking scriptを組み合わせたscriptを実行します。下の図を見て下さい。

scriptの左から順に処理が実行されています。最後のOP_EQUALでは、2+3の結果(5)と定数5の数値を比較し同じなので、True(=1)とstackにpushしています。これにより、unlocking scriptとlocking scriptの有効性は検証されました。

今回は簡単な例での紹介でしたが、検証の際の流れが確認出来たと思います。
この例のように検証の際には、2つをつなげてscriptを実行し結果がtrueになれば有効性を検証できたことになります。


*最後に

今回は、簡単な例を使ってトランザクションscriptについてまとめてみました。Mastering Bitcoinを勉強し始めた時、よくわからなくなった部分だったので勉強し始めている人や正直いまいちよくわかってないと感じている人にも役に立てれば嬉しいです。
これからもHashHubのTechBlogとは別でどんどん記事を書いていくのでそちらも確認お願いします。

参考文献及び引用元
・ハッタリから始めよ:https://www.etarou.work/posts/4894540
えたろうさんのブログです。いつも助けて貰っています。ありがとうございます。
・zoom:https://zoom-blc.com/transaction-script
皆さんもご存知だと思います、osukeさんのブログです。ありがとうございます。
・coincheck blog:https://tech.coincheck.blog/
ありがとうございました。


お知らせ

■HashHubでは入居者募集中です!
HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。

HashHub:https://hashhub.tokyo/
Twitter:https://twitter.com/HashHub_Tokyo

■ブロックチェーンエンジニア集中講座開講中!
HashHubではブロックチェーンエンジニアを育成するための短期集中講座を開講しています。お申込み、詳細は下記のページをご覧ください。

ブロックチェーンエンジニア集中講座:https://www.blockchain-edu.jp/

■HashHubでは下記のポジションを積極採用中です!
・コミュニティマネージャー
・ブロックチェーン技術者・開発者
・ビジネスディベロップメント

詳細は下記Wantedlyのページをご覧ください。

Wantedly:https://www.wantedly.com/companies/hashhub/projects