スクリプトを動かしてみる!

こんにちは、HashHubインターンのたかてぃです。
最近はエンジニア講座修了生で構成しているOB会や個人での開発に、力を入れてますがまだまだ出来ない事が多くて悪戦苦闘しています、、。今回は、scriptを使って自分でトランザクションを作成できるツールを開発予定です。
さて、今回の記事は以前書いたこの記事の続きで、実際に手を動かしてみようという内容になっています。
また今回は下にも書かれていますが、「ブロックチェーン・プログラミング」という書籍を参考文献としています。

目次

*Bitcoin-rubyのインストール
*スクリプトの作成
*スクリプトの参照
*スクリプトの検証
*OP_CODEの命令文紹介
*最後に


*Bitcoin-rubyのインストール

Bitcoin-rubyのGithubでは、インストール方法が2種類あり
・gemコマンドを用いてインストール
・gitコマンドを用いてクローンしてインストール
です。

$ ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18]
$ gem install bitcoin-ruby
or
$ git clone https://github.com/lian/bitcoin-ruby.git; cd bitcoin-ruby; bundle install

今回僕は、gemを使ってインストールを行いました。

$ sudo gem install bitcoin-ruby
Password:
Fetching ffi-compiler-1.0.1.gem
Fetching scrypt-3.0.6.gem
~~ <中略> ~~
Done installing documentation for ffi-compiler, scrypt, eventmachine, bitcoin-ruby after 8 seconds
4 gems installed

これでインストール完了です。ここからはRubyの対話でプログラムを実行出来る`irb`を使って進めて行きます。


*スクリプトの作成

前回の記事では 「2 + 3 == 5」 のスクリプトを例にしていたので、今回もこの式を使って行きます。文字列からスクリプトを作成するには、

Bitcoin::Script.from_string

を使います。では、作成して行きましょう!

$ irb
> require 'bitcoin'
=> true
> Bitcoin::Script.from_string("2 3 OP_ADD 5 OP_EQUAL")
=> #<Bitcoin::Script:0x00007fee808d7cc0 @raw_byte_sizes=[5, 0], @previous_output_script=nil, @input_script="RS\x93U\x87", @parse_invalid=nil, @inner_p2sh=nil, @script_codeseparator_index=nil, @raw="RS\x93U\x87", @chunks=[82, 83, 147, 85, 135], @exec_stack=[], @stack_alt=[], @stack=[], @last_codeseparator_index=0, @do_exec=true>

irbコマンドを入力し、requireメソッドでbitcoinライブラリをロードします。


*スクリプトの参照

文字列で変数の中身を参照して見ましょう。

$ irb
> require 'bitcoin'
=> true
> script = Bitcoin::Script.from_string("2 3 OP_ADD 5 OP_EQUAL")
> script.to_string
=> "2 3 OP_ADD 5 OP_EQUAL"

他にもバイナリで参照する事も可能だそうです。


*スクリプトの検証

はい、次は作成したスクリプトの検証を行います。

$ irb
> require 'bitcoin'
=> true
> Bitcoin::Script.from_string("2 3 OP_ADD 5 OP_EQUAL").run
=> true
> Bitcoin::Script.from_string("2 3 OP_ADD 6 OP_EQUAL").run
=> false

またスクリプトを実行すると、スタックの状態がリストとしてdebugに記録されるのでそちらも確認します。

$ irb
> require 'bitcoin'
=> true
> script = Bitcoin::Script.from_string("2 3 OP_ADD 5 OP_EQUAL")
> script.run
=> true
> script.debug
=> [[], "OP_2", [2], "OP_3", [2, 3], "OP_ADD", [5], "OP_5", [5, 5], "OP_EQUAL", [1], "RESULT"]

script.debugのあとは、スタックの状態を表しています。最初が空の状態。そこから「OP_2」で数値の2をスタックにプッシュします。そしてスタックに2が入っている状態を示し、、が続いています。

大事なのは、最後の「OP_EQUAL」で結果が「1」と出ている部分です。これは、入力が完全に正しくないと返さない数値だからです。
つまりインプット(今回は、スタックにある[5, 5])がもし違う数値なら「0」が帰ってきて、「script.run」では「true」ではなく「false」が表示されるという事です。
→上のfalseが表示されているコードを見ながらだとイメージしやすいはずです。


*OP_CODEの紹介

Bitcoin Wikiでは、スクリプトワード(これがよく言われるopcodes)のコマンドや機能のリストがあります。今回使用したスクリプトワードやまだ使った事がない物まであるので、是非確認して見て下さい。


*最後に

OB会で今回の僕の活動が、ユーザーにスクリプトを組み立て貰い理解を促進させかつ、トランザクションを作成出来るシステムをRubyを使って開発するなので、この記事でもRubyを使ってみました。更に理解を深めるため今後もコードを書きながら、リサーチを進めていき良質なTechBlogにしていきたいと思います!!

参考文献及び引用元
・ブロックチェーン・プログラミング 仮想通貨入門
山崎さん、安土さん、田中さんが書かれた書籍です。特に安土さんGBECでも動画でブロックチェーン技術をわかりやすく解説していますので、気になる方は是非チェックして見て下さい。
また今回の記事では、紹介した書籍の内容を元に作成しました。


お知らせ

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

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

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

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

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

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

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