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

12
マルチシグとは 作:ジョナサン・アンダーウッド ビットバンク社 技術顧問

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

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

マルチシグとは作:ジョナサン・アンダーウッド ビットバンク社 技術顧問

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

・デジタル署名とは・スクリプトとは・ビットコインの署名確認「OP_CHECKSIG」・複数の公開鍵を使った「OP_CHECKMULTISIG」・Raw Output vs. P2SH・署名時の取引の扱い・鍵の管理の問題・実演

概要

Page 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 = u1G + u2Q  - Rx == r ならば OK、 違えば NG

デジタル署名とは

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

・scriptPubkey - Outputとも呼ばれ、ビットコインを開放するための条件を課すパズルのようなもの。・scriptSig - Inputとも呼ばれ、ビットコインを施錠する scriptPubkeyの解答を提出するもの。

ビットコインをもらうと、 scriptPubkeyがブロックチェーンに入ります。ビットコインを送ると、 scriptSigがブロックチェーンに入ります。なのに承認する時は実行する順番が逆

scriptSig ⇒ scriptPubkey で実行されます。

例:scriptSig:①OP_PUSHDATA 304402201e815830e3cdc6854643a96d0784863263a6c81907e3e156b8177bb0e58c162202206dd641de7908b832bc907d849f08901db02e46376f50d048183bc9b1e7578ab601②OP_PUSHDATA 02d7697f67f07afc87e7bb19bdcd08607c7f87fbe934bb83a0af2245fc2725fe66scriptPubkey:③OP_DUP ④OP_HASH160 ⑤OP_PUSHDATA f8a60ea80148db1dd98a463151d315eb816d1035 ⑥OP_EQUALVERIFY ⑦OP_CHECKSIG

スクリプトとは

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

スクリプト実行時(イメージ)

Page 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>の有効な署名か?

YES1

NO0

スタック スタック

1

スタック

Page 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>

Page 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

スタック

Page 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

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

署名時の取引の扱い・01000000 // バージョン

02 // 入力の数

c16ea48590……. // 参照先の取引ID(ハッシュ)00000000 // 参照先の出力索引

ここ P2SH: <redeemscript> Raw Output: <scriptPubkey>ffffffff // Sequence48590c16ea……. // 参照先の取引ID(ハッシュ)05000000 // 参照先の出力索引

00 // 現在署名中じゃないためOP_0を1個

ffffffff // Sequence01 // 出力の数

6aa5090a00000000 // satoshis単位のビットコイン送金額

17a91436347564bb1c2c57a9221ca667191f0b125ff1f487 // scriptPubkey00000000 // nLockTime01000000 // SIG_HASH タイプ

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

鍵の管理の問題・現在主流のP2SH型マルチシグだと、相手の公開鍵を持っていないと redeemscriptを知らないということになり、署名すらできなくなってしまう。・最近マルチシグを使うウォレットが急増しつつも、ワンフレーズでバックアップ可能な シングルシグネチャHDウォレットの利便性の方が高い。・よって、殆どのサービスは利便性を向上する目的で、公開鍵の生成を サーバで行うサービス型マルチシグが多いです。(Bitgo, GreenAddressなど)・バックアップが一番簡単なマルチシグウォレットは現在、GreenAddress、だが設定 が複雑で少し信用する必要がある。

・完全非集権型を目指しているマルチシグウォレット:  Copay  Electrum

使い勝手はよくなりつつあるのだが、まだまだバックアップの利便性が低い。。。

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

実演・Androidとパソコンをお持ちの方:「Copay」のアプリを検索してダウンロードして、お互いにペアリングしてマルチシグを組んでみましょう。PC: https://copay.io/

・ペアを組んだら(testnet用ウォレット)、 ビットコインを少し送ります。

・ビットコインもらったら他のペアなどに送って下さい。

・実演中は歓談スタイルで質疑応答に答えます。

・ある程度の時間になれば三原が懇親会の合図をします。 御清聴ありがとうございました

アンドロイドアプリDLページ