Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BITBOXによるBitcoin Scriptアプリ開発/Development of Bitcoin Script Application by BITBOX

Ara
October 29, 2018

BITBOXによるBitcoin Scriptアプリ開発/Development of Bitcoin Script Application by BITBOX

ビットコインとか勉強会#23 の発表資料です。

最近こんなもの作りました の URL

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

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

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

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

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

おもしろい Bitcoin Script の例

● 0-of-1 マルチシグ
https://www.blockchain.com/btc/tx/fcc78d0f68a3e9b3c7dc81f050714f24c2a71af1f141131d4b4992f863d0f2bc

● XSS
https://www.blockchain.com/btc/tx/a165c82cf21a6bae54dde98b7e00ab43b695debb59dfe7d279ac0c59d6043e24

● 複雑な問題形式
https://www.blockchain.com/btc/tx/219b5815886af9c9ff74fdbe8146731534b0c1b1dc23bfd3fab81745433bbc3f

参考資料

● 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-tokyobitcoinhackathon

● 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/
https://github.com/simpleledger/slp-specifications/blob/master/bitcoinfiles.md

Ara

October 29, 2018
Tweet

More Decks by Ara

Other Decks in Programming

Transcript

  1. なぜ 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
  2. BITBOX の特徴 • JavaScript ライブラリ • REST サーバーがある(Bitcoin ABC ノード)

    • OP コード 100% サポート • BIP44 ウォレット • ビルトイン コンソール
  3. BITBOX の基本的な使い方を説明します • 導入 • BIP44 ウォレットをつくる • アドレスに紐づく Tx

    を取得する • 通常送金の Tx を送る • 独自の Bitcoin Script の Tx を送る
  4. REST URL を指定して、インスタンスを生成 let BITBOXSDK = require("bitbox-sdk/lib/bitbox-sdk").default; let BITBOX =

    new BITBOXSDK({ restURL: "https://trest.bitcoin.com/v1/" }) テストネット用の REST URL
  5. ニーモニック → 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 を参照)
  6. HDノード → アドレス生成 let address = BITBOX.HDNode.toCashAddress(node); (詳しくは BIP44 を参照)

    例:"bchtest:qqzm2vplxdpnltdn62a6az4gxjakdzcfwc2w749f96"   (これはキャッシュアドレス形式と呼ばれる)
  7. アドレスに紐づく Tx(UTXO)を取得する (async () => { try { let utxo

    = await BITBOX.Address.utxo([address]); console.log(utxo); } catch(error) { console.error(error) } })() → Tx Id、出力番号、送金額、Lock Script などが   配列で返ってくる
  8. 入力に署名 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)
  9. 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());
  10. 独自 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" と等しければ、ロック解除できる。
  11. 出力に設定(他は通常送金と同じ) 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
  12. 入力に設定(他は通常送金と同じ) 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 を設定)
  13. ここまでのまとめ • Bitcoin Cash は何かを試すのに向いている ◦ 高速、手数料安い ◦ OP_CODE いろいろ使える

    • BITBOX を使うと、簡単に実装できる ◦ ウォレットがつくれる ◦ アドレスから Tx 取得できる ◦ 独自 Bitcoin Script の Tx を送れる
  14. Bitcoin Script の利用例 • 任意のデータを記録 ◦ 存在証明 ◦ 独自トークン •

    問題を解けたら使えるコイン ◦ クイズの答えがわかったら賞金 • 特定の日時まで資産をロック ◦ 時限ロック付き送金 ◦ 応用:Payment Channel / Lightning Network
  15. おもしろい Bitcoin Script の例 • 0-of-1 マルチシグ fcc78d0f68a3e9b3c7dc81f050714f24c2a71af1f141131d4b4992f863d0f2b ◦ 誰でもロック解除できる

    • XSS a165c82cf21a6bae54dde98b7e00ab43b695debb59dfe7d279ac0c59d6043e24 ◦ スタックに値を積んだ直後に OP_DROP で値を捨てることでコメント ◦ デコード結果が XSS チェッカー: <script type='text/javascript'>document.write('<img src=\'http://www.trollbot.org/ xss-blockchain-detector.php?bc=btc&href=' + location.href + '\'>');</script> • 複雑な問題形式 219b5815886af9c9ff74fdbe8146731534b0c1b1dc23bfd3fab81745433bbc3f ◦ OP_ADD, OP_SUB, OP_TOALTSTACK などを多用 参考:『モナーでもわかるビットコイントランザクションスクリプト』@kusano_k
  16. 中間者攻撃を防ぐには・・・ でもこれって、ただの P2PK・・・ "BIT" 対策後 Unlock Script "BOX" [OP_CAT] "BITBOX"

    [OP_EQUAL] Lock Script [SHA256("BIT") を秘密鍵としたときの署名] Unlock Script [SHA256("BIT") を秘密鍵としたときの公開鍵] [OP_CHECKSIG] Lock Script
  17. 中間者攻撃を防ぐには・・・(続き) • あとは、1 of N のマルチシグと組み合わせて 特定の人しか回答できなくする、とか "BOX を足したら BITBOX

    になる文字列は何?" [OP_DROP] [SHA256("BIT") を秘密鍵としたときの公開鍵] [OP_CHECKSIG] Lock Script • 先ほどの解決策だと問題そのものがわからないので、 OP_DROP を使ってコメントを入れてみる、とか
  18. Bitcoin Script も Ethereum も プログラムは Tx に書かれている = Tx

    に書かれているデータを どう解釈するか、が違うだけ
  19. Tx に書かれているデータをどう解釈するか Ethereum スマコン • Solidity / Vyper 言語の仕様として規定 •

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

    クライアント組み込み = オンチェーンで合意 Bitcoin Script • Bitcoin Script 言語の仕様として規定 • クライアント組み込み = オンチェーンで合意 + • OP_RETURN のあとに記録したデータの解釈 ◦ カラードコインなど各プロトコルとして規定 ◦ オフチェーンで合意
  21. OP_RETURN データの解釈に合意するということ • Tx でデータを書き込む = 誰が送ったかは信頼できる(署名があるので) • データはすべてオンチェーン =

    誰でも検証できる • データ解釈プロトコルの共通認識が必要 → GitHub など皆がみられる場所にあればよい クライアント組み込みは必須ではない. ノードに負荷がかからない分、こっちのほうがいい?
  22. Bitcoin Files Protocol(BFP) • 5KB未満のファイルをアップロード/ダウンロードするための プロトコル • 先ほどの Simple Ledger

    Protocol の一部として追加された https://github.com/simpleledger/slp-specifications/blob/master/bitcoinfiles.md
  23. まとめ • Bitcoin Cash は何かを試すのに向いている ◦ 高速、手数料安い、OP_CODE いろいろ使える • BITBOX

    を使うと、簡単に実装できる ◦ ウォレット作成、Tx 取得、独自 Bitcoin Script 送信 • Bitcoin Script アプリの特徴: ◦ コイン(UTXO)に紐付く処理、任意のデータを記録 ◦ 中間者攻撃が課題。解決するには署名チェックしかない? • Ethereum スマコンとの違いは実はそんなにない ◦ 違いは Tx に書かれたデータの解釈が、クライアント組み込み か、オフチェーンか。いずれも、誰でも検証できる。
  24. 参考資料 • 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/