Slide 1

Slide 1 text

Bitcoin Script 2018/08/23 avcdsld

Slide 2

Slide 2 text

Bitcoin Script とは ● Bitcoin をロック/アンロックする処理を記述するプログラミング言語 ● Lock Script:TxOut に、どうやったらこのビットコインを使えるか (どうロックするか)を記述する ● Unlock Script:TxIn に、ロックを解除する内容を記述する

Slide 3

Slide 3 text

Bitcoin を使うときの検証の仕組み 参考: https://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222 バージョン 入力数 前の取引ハッシュ 入 力 ① 前の出力インデックス スクリプトバイト長 scriptSig 署名 公開鍵 シーケンス終端記号 出 力 ① 出力額 出力数 script PubKey ロックタイム 公開鍵の ハッシュ トランザクション0 トランザクション1 バージョン 入力数 前の取引ハッシュ 入 力 ① 前の出力インデックス スクリプトバイト長 scriptSig 署名 公開鍵 シーケンス終端記号 出 力 ① 出力額 出力数 script PubKey ロックタイム 公開鍵の ハッシュ

Slide 4

Slide 4 text

Bitcoin を使うときの検証の仕組み 参考: https://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222 バージョン 入力数 前の取引ハッシュ 入 力 ① 前の出力インデックス スクリプトバイト長 scriptSig 署名 公開鍵 シーケンス終端記号 出 力 ① 出力額 出力数 script PubKey ロックタイム 公開鍵の ハッシュ Unlock Script Lock Script

Slide 5

Slide 5 text

Bitcoin Script はスタックマシン 2 3 * 4 5 * + 出典:http://ufcpp.net/study/computer/Compiler.html

Slide 6

Slide 6 text

Bitcoin Script の命令(一部) 命令 Opcode Hex 引数 戻り値 内容 OP_DUP 118 0x76 x1 x1, x1 1 番上の要素を複製して、スタックに追加 する OP_HASH160 169 0xa9 x1 hash (x1) 1 番上の要素を SHA-256 でハッシュしさ らに RIPEMD-160 でハッシュする OP_EQUAL 135 0x87 x1, x2 1 / 0 2 つの要素が等しければ 1、異なれば 0 を返す OP_VERIFY 105 0x69 1 / 0 nothing / fail 1 番上の要素が 1 のときは取り除く、 0 のときはスクリプトの実行が強制終了 し、実行結果が false となる OP_EQUALVERIFY 136 0x88 x1 x2 nothing / fail OP_EQUAL と OP_VERIFY を連続して 実行する. OP_CHECKSI 172 0xac signature, pubkey 1 / 0 署名の妥当性を検証し、 1 または 0 を返 す

Slide 7

Slide 7 text

Bitcoin Script のルール ● [Unlock Script] [Lock Script] の順に並べて、処理していく

Slide 8

Slide 8 text

P2PKH (Pay to Public Key Hash) Lock Script OP_DUP OP_HASH160 <公開鍵Aのハッシュ> OP_EQUALVERIFY OP_CHECKSIG Unlock Script <署名A> <公開鍵A> 検証される スクリプト <署名A> <公開鍵A> OP_DUP OP_HASH160 <公開鍵Aのハッシュ> OP_EQUALVERIFY OP_CHECKSIG 署名A 公開鍵A 署名A 公開鍵A 公開鍵A 署名A 公開鍵A 公開鍵A ハッシュ 署名A 公開鍵A 公開鍵A ハッシュ 公開鍵A ハッシュ 署名A 公開鍵A 署名A 1 ※現在は SegWit に対応したスクリプトが通常送金に使われている

Slide 9

Slide 9 text

MultiSignature Lock Script 2 <公開鍵A> <公開鍵B> <公開鍵C> 3 OP_CHECKMULTISIG Unlock Script OP_0 <署名A> <署名B> 検証される スクリプト OP_0 <署名A> <署名B> 2 <公開鍵A> <公開鍵B> <公開鍵C> 3 OP_CHECKMULTISIG 0 署名A 0 署名A 署名B 0 署名A 署名B 0 署名A 署名B 2 0 署名A 0 1 公開鍵A 2 署名B 2 公開鍵A 公開鍵B 署名A 0 1 署名B 2 公開鍵A 公開鍵B 公開鍵C 署名A 署名B 2 公開鍵A 公開鍵B 公開鍵C 3

Slide 10

Slide 10 text

Lock Time Lock Script <ブロック高またはUNIXタイム> OP_CHECKLOCKTIMEVERIFY OP_DROP <公開鍵A> OP_CHECKSIG Unlock Script <署名A> OP_CHECKLOCKTIMEVERIFY:絶対時刻で指定した時点までロックする Lock Script <ブロック高またはUNIXタイム> OP_CHECKSEQUENCEVERIFY OP_DROP <公開鍵A> OP_CHECKSIG Unlock Script <署名A> OP_CHECKSEQUENCEVERIFY:相対時刻で指定した時点までロックする

Slide 11

Slide 11 text

Bitcoin と Ethereum の違い ● Bitcoin Script と Ethereum スマートコントラクトの命令の違いはわずか ● Ethereum では OP_LOOP と OP_JUMP が使える → チューリング完全と言われる所以だが、実際は GAS の制限により有限 ● 今後、Bitcoin や Bitcoin Cash でスマートコントラクトを開発するための わかりやすい言語やツールが出てくる可能性が高い ○ Bitcoin Cash は 2018/05 ハードフォークでスマートコントラクト導入 ● 実は Ethereum より有望・・・?

Slide 12

Slide 12 text

Payment Channel ● 署名したトランザクションを交換し合うことで、 複数回の支払いを高速に安く行う方法 ● ブロックチェーンには途中のやり取りを記録しない = オフチェーン ● 前提となる仕組み: ○ MultiSignature ○ Lock Time ● 種類: ○ 単方向 Payment Channel ○ 双方向 Payment Channel ○ HTCL によるマルチホップ → この応用が Ligntning Network

Slide 13

Slide 13 text

単方向 Payment Channel ● オープニング Tx ○ 自分と相手のマルチシグ宛にデポジットする ● 払い戻し用 Tx ○ デポジットから払い戻せるように相手から署名をつけてもらう ○ ロックタイム付き ○ 何もなければ使わない ● コミットメント Tx ○ 支払いのたびに、自分から相手に署名つき Tx を送る ○ 最終的なものだけブロードキャストする

Slide 14

Slide 14 text

オープニング Tx in: アリス(署名済) out: マルチシグ 10 BTC 10 BTC 払い戻し用 Tx in: マルチシグ out: アリス 10 BTC 10 BTC ロックタイム 払い戻し用 Tx in: マルチシグ   (ボブ署名済) out: アリス 10 BTC 10 BTC ロックタイム アリス ボブ オープニング Tx in: アリス(署名済) out: マルチシグ 10 BTC 10 BTC ブロードキャスト

Slide 15

Slide 15 text

アリス ボブ 最終的なものに 署名してブロードキャスト コミットメント Tx in: マルチシグ   (アリス署名済) out: アリス 10 BTC 9 BTC out: ボブ 1 BTC コミットメント Tx in: マルチシグ   (アリス署名済) out: アリス 10 BTC 8 BTC out: ボブ 2 BTC コミットメント Tx in: マルチシグ   (アリス署名済) out: アリス 10 BTC 7 BTC out: ボブ 3 BTC

Slide 16

Slide 16 text

単方向 Payment Channel の応用 双方向 Payment Channel HTCL によるマルチホップ Lightning Network

Slide 17

Slide 17 text

この本が詳しい ブロックチェーン・プログラミング 山崎 重一郎, 安土 茂亨, 田中 俊太郎 https://www.amazon.co.jp/dp/4061538314/

Slide 18

Slide 18 text

参考 ● BIP16 : P2SH の仕組み - Yenom開発者ブログ https://developers.yenom.tech/entry/2018/08/18/143918 ● ビットコインおけるトランザクションスクリプトの仕組みとその種類 https://zoom-blc.com/transaction-script ● Script - Bitcoin Wiki https://en.bitcoin.it/wiki/Script ● Bitcoinを技術的に理解する https://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222 ● ブロックチェーン・プログラミング”, 山崎 重一郎ほか https://www.amazon.co.jp/dp/4061538314/ ● 双方向のPayment Channelの仕組み https://techmedia-think.hatenablog.com/entry/2016/08/06/212453