Successfully reported this slideshow.
Your SlideShare is downloading. ×

ビットコインにおける「マルチシグ」とは

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
GC in C++0x
GC in C++0x
Loading in …3
×

Check these out next

1 of 12 Ad

More Related Content

Recently uploaded (20)

Advertisement

ビットコインにおける「マルチシグ」とは

  1. 1. マルチシグとは 作:ジョナサン・アンダーウッド ビットバンク社 技術顧問
  2. 2. ・デジタル署名とは ・スクリプトとは ・ビットコインの署名確認「OP_CHECKSIG」 ・複数の公開鍵を使った「OP_CHECKMULTISIG」 ・Raw Output vs. P2SH ・署名時の取引の扱い ・鍵の管理の問題 ・実演 概要
  3. 3. ・楕円曲線の場合、 r と s という2つの値を合わせて「デジタル署名」と言います。 ・生成アルゴリズム:(楕円曲線の方程式は基本的に大文字=点、小文字=整数を表します。)   - r = Rx = kG mod p   - s = k-1 (z + dr) mod n       -G, p, n は定数、 z は署名したいメッセージのハッシュ、 d は秘密鍵(整数)       -k が秘密鍵のような乱数で全ての取引ごとに新しく生成する必要があります。 ・この2つの値と公開鍵(Q)を使って確認したい場合は下記のように確認します。   - w = s-1 mod n   - u1 = zw mod n   - u2 = rw mod n   - R = u1 G + u2 Q   - Rx == r ならば OK、 違えば NG デジタル署名とは
  4. 4. ・scriptPubkey - Outputとも呼ばれ、ビットコインを開放するための条件を課すパズルのようなもの。 ・scriptSig - Inputとも呼ばれ、ビットコインを施錠する scriptPubkeyの解答を提出するもの。 ビットコインをもらうと、 scriptPubkeyがブロックチェーンに入ります。 ビットコインを送ると、 scriptSigがブロックチェーンに入ります。 なのに承認する時は実行する順番が逆 scriptSig ⇒ scriptPubkey で実行されます。 例: scriptSig: ①OP_PUSHDATA 304402201e815830e3cdc6854643a96d0784863263a6c81907e3e156b8177bb0e58c1622 02206dd641de7908b832bc907d849f08901db02e46376f50d048183bc9b1e7578ab601 ②OP_PUSHDATA 02d7697f67f07afc87e7bb19bdcd08607c7f87fbe934bb83a0af2245fc2725fe66 scriptPubkey: ③OP_DUP ④OP_HASH160 ⑤OP_PUSHDATA f8a60ea80148db1dd98a463151d315eb816d1035 ⑥OP_EQUALVERIFY ⑦OP_CHECKSIG スクリプトとは
  5. 5. スクリプト実行時(イメージ)
  6. 6. OP_CHECKSIG <SIG_A> ・実行された時、スタックの上にある2つのものを拾って、 1つ目を公開鍵と見なし、2つ目を署名と見なし、 署名の確認作業を行い、正の場合「1」、誤の場合「0」をスタックの上に残します。 ①PUSH_DATA <SIG_A> ②PUSH_DATA <PUBKEY_A> ③CHECKSIG <SIG_A> <PUBKEY_A> <SIG_A>は <PUBKEY_A> の有効な署名か? YES 1 NO 0 スタック スタック 1 スタック
  7. 7. OP_CHECKMULTISIG <SIG_C> <SIG_A> <OP_0> ・実行された時、スタックの上にあるOPの数字を拾い、それだけの数のものを  スタックの上から拾って行き、すべて公開鍵と見なす。 ・更にスタックにあるOPの数字を拾い、それだけ(+1)の数のものを拾い、  有効な署名が足りるまで公開鍵に対して確認し続ける。    <OP_0> <SIG_A> <SIG_C> <OP_2> <PUBKEY_A> <PUBKEY_B> <PUBKEY_C> <OP_3> <OP_CHECKMULTISIG> スタック スタック <OP_3> <PUBKEY_C> <PUBKEY_B> <PUBKEY_A> <OP_2> <SIG_C> <SIG_A> <OP_0>
  8. 8. OP_CHECKMULTISIG  2 スタック <OP_CHECKMULTISIG> <OP_3> <PUBKEY_C> <PUBKEY_B> <PUBKEY_A> <OP_2> <SIG_C> <SIG_A> <OP_0> 1 正 2 誤 3 正 2達成! 署名の順番が大事! ? バグがあり、OP_2 + 1して3つのものを   スタックから拾います。 <OP_0>が主流 1 スタック
  9. 9. Raw Output vs. P2SH ・1つの署名だと公開鍵がハッシュに守られる。 ・でもマルチシグになると、公開鍵を全て晒さないといけなかった。 解決法:「scriptPubkeyは後で出すから、このハッシュだけ持っといて。」 それがPay To Script Hash = スクリプトのハッシュに対して支払う = P2SH Raw Output: <OP_0> <SIG_A> <SIG_C> <OP_2> <PUBKEY_A> <PUBKEY_B> <PUBKEY_C> <OP_3> <OP_CHECKMULTISIG> P2SH: <OP_0> <SIG_A> <SIG_C> <redeemScript> <OP_HASH160> <redeemScriptHash> <OP_EQUAL> scriptSig scriptPubkey scriptPubkeyscriptSig
  10. 10. 署名時の取引の扱い ・01000000 // バージョン 02 // 入力の数 c16ea48590……. // 参照先の取引ID(ハッシュ) 00000000 // 参照先の出力索引 ここ P2SH: <redeemscript> Raw Output: <scriptPubkey> ffffffff // Sequence 48590c16ea……. // 参照先の取引ID(ハッシュ) 05000000 // 参照先の出力索引 00 // 現在署名中じゃないためOP_0を1個 ffffffff // Sequence 01 // 出力の数 6aa5090a00000000 // satoshis単位のビットコイン送金額 17a91436347564bb1c2c57a9221ca667191f0b125ff1f487 // scriptPubkey 00000000 // nLockTime 01000000 // SIG_HASH タイプ
  11. 11. 鍵の管理の問題 ・現在主流のP2SH型マルチシグだと、相手の公開鍵を持っていないと  redeemscriptを知らないということになり、署名すらできなくなってしまう。 ・最近マルチシグを使うウォレットが急増しつつも、ワンフレーズでバックアップ可能な  シングルシグネチャHDウォレットの利便性の方が高い。 ・よって、殆どのサービスは利便性を向上する目的で、公開鍵の生成を  サーバで行うサービス型マルチシグが多いです。(Bitgo, GreenAddressなど) ・バックアップが一番簡単なマルチシグウォレットは現在、GreenAddress、だが設定  が複雑で少し信用する必要がある。 ・完全非集権型を目指しているマルチシグウォレット:   Copay  Electrum 使い勝手はよくなりつつあるのだが、まだまだバックアップの利便性が低い。。。
  12. 12. 実演 ・Androidとパソコンをお持ちの方:「Copay」のアプリを検索して ダウンロードして、お互いにペアリングして マルチシグを組んでみましょう。 PC: https://copay.io/ ・ペアを組んだら(testnet用ウォレット)、  ビットコインを少し送ります。 ・ビットコインもらったら他のペアなどに送って下さい。 ・実演中は歓談スタイルで質疑応答に答えます。 ・ある程度の時間になれば三原が懇親会の合図をします。 御清聴ありがとうございました アンドロイドアプリDLページ

×