Slide 1

Slide 1 text

Bitcoin Script によるアプリ開発 Avocado 2018.10.29 ビットコインとか勉強会#23

Slide 2

Slide 2 text

ソフトウェア開発者 博物学、神社、仏教、民俗学、生物学が好き 2017年夏からブロックチェーン勉強中 最近は Ethereum の DApps 作ったりしてます 自己紹介: Avocado(アボカド) mail: [email protected] twitter @arandoros twitter @avcdsld(ブロックチェーン関連)

Slide 3

Slide 3 text

ものを作るのが好きです 最近こんなもの作りました

Slide 4

Slide 4 text

おとしものを登録・謝礼できる Ethereum DApp https://speakerdeck.com/avcdsld/lost-items-dapp

Slide 5

Slide 5 text

神社の航空写真をひたすらつぶやく Twitter Bot https://twitter.com/shrineview

Slide 6

Slide 6 text

粘菌の LINE スタンプ https://store.line.me/stickershop/product/1397048/ja

Slide 7

Slide 7 text

我が家の便利サービス「赤ちゃんプッシュ」 https://speakerdeck.com/avcdsld/baby-push

Slide 8

Slide 8 text

ヴォイニッチ刷稿を題材にしたアート作品 http://arandoros.wixsite.com/voynich-fonts

Slide 9

Slide 9 text

本題

Slide 10

Slide 10 text

今日話すこと 1. BITBOX 使えば Bitcoin Script アプリが簡単に作れる 2. Bitcoin Script アプリの特徴と課題 3. Ethereum スマコンとの違い

Slide 11

Slide 11 text

はじめに

Slide 12

Slide 12 text

Yenom 宇佐美さんの Bitcoin Script の資料は神 https://speakerdeck.com/usatie/lets-write-bitcoin-script-number-tokyobitcoinhackathon

Slide 13

Slide 13 text

Bitcoin Hackathon のレポート記事おすすめです https://developers.yenom.tech/entry/2018/09/26/150230

Slide 14

Slide 14 text

1. BITBOX 使えば Bitcoin Script アプリが簡単に作れる

Slide 15

Slide 15 text

BITBOX とは Bitcoin.com が開発している、 Bitcoin Cash の JavaScript ライブラリ https://developer.bitcoin.com/bitbox

Slide 16

Slide 16 text

なぜ Bitcoin Cash? ● Bitcoin では凝った Bitcoin Script を実行できない ○ 現在の Bitcoin Core は標準的な形式以外は受け付けない ○ P2SH ならいけるが、Unlock Script はリテラルのみ ○ OP_CAT や OP_MUL など多くの命令は無効化されている ● Bitcoin Cash は何かを試すのに向いている ○ 高速、手数料安い ○ ノード建てなくてもすぐ試せる環境がある(BITBOX) ○ これからどんどん機能が追加される予定で、 Solidity みたいな言語も出てくるらしい ○ OP_CODE が追加されたり復活したりしてて前衛的 参考:https://developers.yenom.tech/entry/2018/05/07/110000

Slide 17

Slide 17 text

BITBOX の特徴 ● JavaScript ライブラリ ● REST サーバーがある(Bitcoin ABC ノード) ● OP コード 100% サポート ● BIP44 ウォレット ● ビルトイン コンソール

Slide 18

Slide 18 text

BITBOX の基本的な使い方を説明します ● 導入 ● BIP44 ウォレットをつくる ● アドレスに紐づく Tx を取得する ● 通常送金の Tx を送る ● 独自の Bitcoin Script の Tx を送る

Slide 19

Slide 19 text

導入

Slide 20

Slide 20 text

Node.js にて BITBOX をインストールできる npm install bitbox-sdk --global

Slide 21

Slide 21 text

REST URL を指定して、インスタンスを生成 let BITBOXSDK = require("bitbox-sdk/lib/bitbox-sdk").default; let BITBOX = new BITBOXSDK({ restURL: "https://trest.bitcoin.com/v1/" }) テストネット用の REST URL

Slide 22

Slide 22 text

BIP44 ウォレットをつくる

Slide 23

Slide 23 text

最初に、ニーモニックを生成(秘密鍵に相当) let mnemonic = BITBOX.Mnemonic.generate(128); 12個の英単語が生成される ウォレットは、生成したニーモニックを管理することになる ※ビット数は 128~256 から選べる → 12~24 個の単語

Slide 24

Slide 24 text

ニーモニック → HDノードを導出 let seed = BITBOX.Mnemonic.toSeed(mnemonic); let masterNode = BITBOX.HDNode.fromSeed(seed, "testnet"); let node = BITBOX.HDNode.derivePath(masterNode, "m/44'/145'/0'/0/0"); (詳しくは BIP44 を参照)

Slide 25

Slide 25 text

HDノード → アドレス生成 let address = BITBOX.HDNode.toCashAddress(node); (詳しくは BIP44 を参照) 例:"bchtest:qqzm2vplxdpnltdn62a6az4gxjakdzcfwc2w749f96"   (これはキャッシュアドレス形式と呼ばれる)

Slide 26

Slide 26 text

アドレスに紐づく Tx を取得する

Slide 27

Slide 27 text

アドレスに紐づく Tx(UTXO)を取得する (async () => { try { let utxo = await BITBOX.Address.utxo([address]); console.log(utxo); } catch(error) { console.error(error) } })() → Tx Id、出力番号、送金額、Lock Script などが   配列で返ってくる

Slide 28

Slide 28 text

通常送金の Tx を送る

Slide 29

Slide 29 text

まず、ビルダーをつくる let builder = new BITBOX.TransactionBuilder("testnet"); テストネットだと必要

Slide 30

Slide 30 text

入力を設定 let builder = new BITBOX.TransactionBuilder("testnet"); builder.addInput(txId, voutNum); 入力に使う Tx Id と 出力番号

Slide 31

Slide 31 text

出力を設定 let builder = new BITBOX.TransactionBuilder("testnet"); builder.addInput(txId, voutNum); builder.addOutput(address, sendAmount); 送信先アドレスと送金額(手数料を引いた額. 単位 satoshi)

Slide 32

Slide 32 text

入力に署名 let builder = new BITBOX.TransactionBuilder("testnet"); builder.addInput(txId, voutNum); builder.addOutput(address, sendAmount); builder.sign(vinNum, keyPair, redeemScript, builder.hashTypes.SIGHASH_ALL, originalAmount);

Slide 33

Slide 33 text

入力に署名 let builder = new BITBOX.TransactionBuilder("testnet"); builder.addInput(txId, voutNum); builder.addOutput(address, sendAmount); builder.sign(vinNum, keyPair, redeemScript, builder.hashTypes.SIGHASH_ALL, originalAmount); 署名する入力番号 空の変数 (署名結果が入る) 署名の種類(検証時に影響する) 秘密鍵/公開鍵のペア BITBOX.HDNode.toKeyPair(node) で取得 入力の額(単位 satoshi)

Slide 34

Slide 34 text

Tx を送る let builder = new BITBOX.TransactionBuilder("testnet"); builder.addInput(txId, voutNum); builder.addOutput(address, sendAmount); builder.sign(vinNum, keyPair, redeemScript, builder.hashTypes.SIGHASH_ALL, originalAmount); BITBOX.RawTransactions. sendRawTransaction(builder.build().toHex());

Slide 35

Slide 35 text

独自 Bitcoin Script の Tx を送る

Slide 36

Slide 36 text

独自 Lock Script(のバイト列)をつくる let script = BITBOX.Script.encode([ Buffer.from("BOX", "ascii"), BITBOX.Script.opcodes.OP_CAT, Buffer.from("BITBOX", "ascii"), BITBOX.Script.opcodes.OP_EQUAL ]) この例だと、何かの文字列と "BOX" を繋げた結果が "BITBOX" と等しければ、ロック解除できる。

Slide 37

Slide 37 text

出力に設定(他は通常送金と同じ) let builder = new BITBOX.TransactionBuilder("testnet"); builder.addInput(txId, voutNum); builder.addOutput(script, sendAmount); builder.sign(vinNum, keyPair, redeemScript, builder.hashTypes.SIGHASH_ALL, originalAmount); BITBOX.RawTransactions. sendRawTransaction(builder.build().toHex()); 通常送金で address を渡していた部分を 独自 Lock Script に変えればOK

Slide 38

Slide 38 text

独自 Unlock Script(のバイト列)をつくる let script = BITBOX.Script.encode([ Buffer.from("BIT", "ascii") ]) "BIT" という文字列をスクリプトとする

Slide 39

Slide 39 text

入力に設定(他は通常送金と同じ) let builder = new BITBOX.TransactionBuilder("testnet"); builder.addInput(txId, voutNum, builder.DEFAULT_SEQUENCE, script); builder.addOutput(address, sendAmount); builder.sign(vinNum, keyPair, redeemScript, builder.hashTypes.SIGHASH_ALL, originalAmount); BITBOX.RawTransactions. sendRawTransaction(builder.build().toHex()); addInput の引数に、独自 Unlock Script を追加すれば OK (第3引数は sequence number. 0xffffffff を設定)

Slide 40

Slide 40 text

・・・という感じで とても簡単に実装できます

Slide 41

Slide 41 text

ここまでのまとめ ● Bitcoin Cash は何かを試すのに向いている ○ 高速、手数料安い ○ OP_CODE いろいろ使える ● BITBOX を使うと、簡単に実装できる ○ ウォレットがつくれる ○ アドレスから Tx 取得できる ○ 独自 Bitcoin Script の Tx を送れる

Slide 42

Slide 42 text

2. Bitcoin Script アプリの特徴と課題

Slide 43

Slide 43 text

Bitcoin Script アプリの特徴 ● 処理がコイン(UTXO)に紐づいている ● やれることは基本的に 「ロック解除できるか/できないか」 ● ただし、任意のデータを記録できるので、 ブロックチェーン外で処理系の合意を取れれば ある意味なんでもできる

Slide 44

Slide 44 text

Bitcoin Script の利用例 ● 任意のデータを記録 ○ 存在証明 ○ 独自トークン ● 問題を解けたら使えるコイン ○ クイズの答えがわかったら賞金 ● 特定の日時まで資産をロック ○ 時限ロック付き送金 ○ 応用:Payment Channel / Lightning Network

Slide 45

Slide 45 text

おもしろい Bitcoin Script の例 ● 0-of-1 マルチシグ fcc78d0f68a3e9b3c7dc81f050714f24c2a71af1f141131d4b4992f863d0f2b ○ 誰でもロック解除できる ● XSS a165c82cf21a6bae54dde98b7e00ab43b695debb59dfe7d279ac0c59d6043e24 ○ スタックに値を積んだ直後に OP_DROP で値を捨てることでコメント ○ デコード結果が XSS チェッカー: document.write('<img src=\'http://www.trollbot.org/ xss-blockchain-detector.php?bc=btc&href=' + location.href + '\'>'); ● 複雑な問題形式 219b5815886af9c9ff74fdbe8146731534b0c1b1dc23bfd3fab81745433bbc3f ○ OP_ADD, OP_SUB, OP_TOALTSTACK などを多用 参考:『モナーでもわかるビットコイントランザクションスクリプト』@kusano_k

Slide 46

Slide 46 text

問題を解く系の Bitcoin Script の課題 中間者攻撃が課題 Tx をブロードキャストしたとたん 答えをパクられて、宛先を変えた Tx を送信される

Slide 47

Slide 47 text

問題を解く系の Bitcoin Script の課題 中間者攻撃を防ぐには… Lock Script に署名チェック を入れるしかないのでは?

Slide 48

Slide 48 text

中間者攻撃を防ぐには・・・ でもこれって、ただの P2PK・・・ "BIT" 対策後 Unlock Script "BOX" [OP_CAT] "BITBOX" [OP_EQUAL] Lock Script [SHA256("BIT") を秘密鍵としたときの署名] Unlock Script [SHA256("BIT") を秘密鍵としたときの公開鍵] [OP_CHECKSIG] Lock Script

Slide 49

Slide 49 text

中間者攻撃を防ぐには・・・(続き) ● あとは、1 of N のマルチシグと組み合わせて 特定の人しか回答できなくする、とか "BOX を足したら BITBOX になる文字列は何?" [OP_DROP] [SHA256("BIT") を秘密鍵としたときの公開鍵] [OP_CHECKSIG] Lock Script ● 先ほどの解決策だと問題そのものがわからないので、 OP_DROP を使ってコメントを入れてみる、とか

Slide 50

Slide 50 text

3. Ethereum スマコンとの違い

Slide 51

Slide 51 text

Bitcoin Script 処理がコインに紐づく Ethereum スマコン 関数を世界にデプロイ 漠然としたイメージ

Slide 52

Slide 52 text

だいぶ違うようにみえる

Slide 53

Slide 53 text

けれど

Slide 54

Slide 54 text

Bitcoin Script も Ethereum も プログラムは Tx に書かれている = Tx に書かれているデータを どう解釈するか、が違うだけ

Slide 55

Slide 55 text

Tx に書かれているデータをどう解釈するか Ethereum スマコン ● Solidity / Vyper 言語の仕様として規定 ● クライアント組み込み = オンチェーンで合意 Bitcoin Script ● Bitcoin Script 言語の仕様として規定 ● クライアント組み込み = オンチェーンで合意

Slide 56

Slide 56 text

Tx に書かれているデータをどう解釈するか Ethereum スマコン ● Solidity / Vyper 言語の仕様として規定 ● クライアント組み込み = オンチェーンで合意 Bitcoin Script ● Bitcoin Script 言語の仕様として規定 ● クライアント組み込み = オンチェーンで合意 + ● OP_RETURN のあとに記録したデータの解釈 ○ カラードコインなど各プロトコルとして規定 ○ オフチェーンで合意

Slide 57

Slide 57 text

OP_RETURN データの解釈に合意するということ ● Tx でデータを書き込む = 誰が送ったかは信頼できる(署名があるので) ● データはすべてオンチェーン = 誰でも検証できる ● データ解釈プロトコルの共通認識が必要 → GitHub など皆がみられる場所にあればよい クライアント組み込みは必須ではない. ノードに負荷がかからない分、こっちのほうがいい?

Slide 58

Slide 58 text

OP_RETURN データに対する 最近のプロトコル(BCH)

Slide 59

Slide 59 text

Simple Ledger Protocol(SLP) ● BCH で独自トークンを作るプロトコル ● これまでの多くのプロトコルよりシンプルで、拡張性が高い https://simpleledger.cash/

Slide 60

Slide 60 text

Bitcoin Files Protocol(BFP) ● 5KB未満のファイルをアップロード/ダウンロードするための プロトコル ● 先ほどの Simple Ledger Protocol の一部として追加された https://github.com/simpleledger/slp-specifications/blob/master/bitcoinfiles.md

Slide 61

Slide 61 text

まとめ ● Bitcoin Cash は何かを試すのに向いている ○ 高速、手数料安い、OP_CODE いろいろ使える ● BITBOX を使うと、簡単に実装できる ○ ウォレット作成、Tx 取得、独自 Bitcoin Script 送信 ● Bitcoin Script アプリの特徴: ○ コイン(UTXO)に紐付く処理、任意のデータを記録 ○ 中間者攻撃が課題。解決するには署名チェックしかない? ● Ethereum スマコンとの違いは実はそんなにない ○ 違いは Tx に書かれたデータの解釈が、クライアント組み込み か、オフチェーンか。いずれも、誰でも検証できる。

Slide 62

Slide 62 text

参考資料 ● Bitcoin.com Developer Platform | BITBOX https://developer.bitcoin.com/bitbox ● BITBOXのハンズオン資料 https://gist.github.com/cgcardona/1c3eeae3da1cecfe88bfa6406e859881 ● 第2回Bitcoin Hackathonも大好評でした!! - Yenom開発者ブログ https://developers.yenom.tech/entry/2018/09/26/150230 ● Let's Write Bitcoin Script #TokyoBitcoinHackathon - Speaker Deck https://speakerdeck.com/usatie/lets-write-bitcoin-script-number-tokyobitcoin hackathon ● BitcoinとBitcoinCashの違い.pdf https://drive.google.com/file/d/1L_D5SSPsA2618p7QeJwIJbty1M1T-7xH/view ● モナーでもわかるビットコイントランザクションスクリプト http://sanya.sweetduet.info/monatxscript/ ● No Matter How You Slice It — Token Assets Are Coming to Bitcoin Cash - Bitcoin News https://news.bitcoin.com/no-matter-how-you-slice-it-token-assets-are-coming-to-bitcoin-cash/ ● Simple Ledger Protocol – Tokenize Anything. https://simpleledger.cash/