Tech

[ビットコインの技術] マルチシグネチャの技術的説明

  • このエントリーをはてなブックマークに追加
  • 複数の署名によって送金できるようになるマルチシグネチャについての技術的解説です

  • 例えば「3つのうち2つの秘密鍵があると送金できる」ということができるようになります

    • つまり、N人のうちM人の人が署名をしたら、ビットコインを送ることができる、ことができる
  • 安全にビットコインを利用するための技術です
    • 今後、ウォレット、交換所でメジャーになるでしょう

前提知識

  • Bitcoinのトランザクションの仕組み
  • Bitcoinのアドレスの作り方
  • Bitcoin の Script の知識
    • scriptPubKey, scriptSig, UTXO
    • HASH_160 (ダブルハッシュで、SHA256してから、RIPEMD160する)
  • BIP(ビットコインの改善提案)

概要

  • 「3つのうち2つの秘密鍵があった場合のみ送金可能」ということができる
  • マルチシグネチャには2つの方法がある
    1. 旧来の方法: BIP 11: M-of-N Standard Transactions
    2. 新しい方法: BIP 16: P2SH (Pay To Script Hash)
  • 最大15公開鍵まで可能
  • 秘密鍵の数 <= 公開鍵の数 なら大丈夫

基本用語

ビットコインアドレスについての基礎知識として以下のことを知っている必要があります。

  • m-of-n
    • m: minimum number of signature: 最低必要な署名の数
    • n: number of public key: 公開鍵の数
  • P2PKH
    • Pay To Public Key Hashの略
    • 「公開鍵のハッシュ値に支払う」の意味
    • 1ではじまるビットコイン・アドレス
  • P2SH
    • Pay To Script Hashの略
    • 「Scriptのハッシュ値に支払う」の意味
    • 3ではじまるビットコイン・アドレス
    • アドレス・フォーマットについては、BIP13を参照 BIP 13
  • redeemScript (serialized script)
    • (2 of 3の場合)3つの公開鍵から2つの秘密鍵チェックするScriptをハッシュ化したもの

P2SHについて

  • 公式 BIP 16

  • 固定長 20byteのハッシュ: QRコードからスキャンしたり、コピペするのに十分な位短い

仕様

OP_HASH160 [20byteのハッシュ値] OP_EQUAL

520-byte制限

  • 520バイト以上はスタックに入れられない
  • P2SH は、最大15の公開鍵まで入れられる
    • 計算: 3 bytes + 15 pubkeys * 34 bytes/pubkey = 513 bytes
  • OP_CHECKMULTISIG オペコードは、最大20までの公開鍵しか受付けない

2つのScriptの種類

OP_0は、歴史的経緯から必ず最初につける。
OP_0は、有名なバグ。スタックから一つ多くpopしてします。修正にはハードフォークが必要になって、今までのものがinvalidになってしまうので、現在でも修正されていない。

P2PKHの場合

2-of-3の場合の例

scriptPubkey

2 <公開鍵1> [公開鍵2] [公開鍵3] 3 OP_CHECKMULTISIG

scriptSig

OP_0 <署名1> [署名2]

P2SHの場合

2-of-3の場合の例

redeemScript (上記のscriptPubkeyと一緒)

2 <公開鍵1> [公開鍵2] [公開鍵3] 3 OP_CHECKMULTISIG

上記の検証するScriptの20byteのハッシュを、OP_HASH160する

scriptSig: OP_0 <署名1> [署名2] 3 {[公開鍵] OP_CHECKMULTISIG}
scriptPubKey: OP_HASH160 [{2 <公開鍵1> [公開鍵2] [公開鍵3] 3 OP_CHECKMULTISIG}の20byteのハッシュ ] OP_EQUAL

署名が一つの場合

scriptSig: [署名] {[公開鍵] OP_CHECKSIG}
scriptPubKey: OP_HASH160 [{[公開鍵] OP_CHECKSIG}の20byteのハッシュ ] OP_EQUAL

Scriptのオペコード

  • OP_CHECKMULTISIG
Word オペコード Hex Input Output 説明
OP_CHECKMULTISIG 174 0xae x 署名1 署名2 … <署名の数> 公開鍵1 公開鍵2 <公開鍵の数> True/False (以下に記載)

OP_CHECKMULTISIGの説明(その内訳すかも)

Compares the first signature against each public key until it finds an ECDSA match. Starting with the subsequent public key, it compares the second signature against each remaining public key until it finds an ECDSA match. The process is repeated until all signatures have been checked or not enough public keys remain to produce a successful result. All signatures need to match a public key. Because public keys are not checked again if they fail any signature comparison, signatures must be placed in the scriptSig using the same order as their corresponding public keys were placed in the scriptPubKey or redeemScript. If all signatures are valid, 1 is returned, 0 otherwise. Due to a bug, one extra unused value is removed from the stack.

引用元:
Script – Bitcoin

マルチシグネチャのメリット

セキュリティ

  • 銃を突きつけられて、プライベートキーを教えろと言われて1人奪われてもコインは盗まれない

デメリット

  • 手間が増える

マルチシグネチャ・アドレスの作り方

マルチシグネチャの生成方法 (2 of 3の場合)

% bitcoind createmultisig 2 ["公開鍵1", "公開鍵2", "公開鍵3"]
  1. 必要な公開鍵(例では3つ)を用意する
  2. 必要な秘密鍵の数(例では2)を書く

利用例

  • ウォレット
  • 交換所
  • エスクロー
  • Koinifyのようなクラウドファンディングにて、お金を持ち逃げされないようにマイルストーンが達成されるごとに、企業、クラウドファンディング、第三者の2-of-3 multisigでファンドをリリースする
  • Counterpartyのデータの保存場所(ニセの公開鍵に)としても利用されている。1-of-3 multisig で2つがニセ公開鍵で、1つがちゃんとした公開鍵

マルチシグ対応ソフトウェア

BitGo

  • 公式サイト: BitGo
  • マルチシグネチャ・ウォレット
  • 一つの鍵はBitGoが、他の複数の鍵はユーザが持つ
  • 以下からユーザを守る
    1. サービスのシャットダウン
    2. サーバのハック
    3. 運用者による盗難
    4. クライアントのマルウェア
  • いつも余分な鍵があるので、パスワードを忘れても復旧できる
  • 盗難対策
    1. 元IPアドレスのチェック
    2. IP ホワイトリスト
    3. アドレス・ホワイトリスト
    4. 時間/ベロシティ制限
    5. その他

引用元: Bitcoin storage and multi signature wallets

GreenAddress

GreenAddress.it – Free and secure online Bitcoin wallet

BIP

公式BIP

BIPの説明

参考サイト

日本語ページ (日本語)

マルチシグネチャアドレスの作成・送金方法

参考ページ (英語)

参考動画

上記で使われたpython コード
wobine/blackboard101

ステートレス/ステートフルについて

  • ビットコインでは、署名自体をDecentralizedな形で基本的にできない(ステートレスという意味で)です。
    • なので、ビットコインでは署名をオンラインで集めたりする実装が多いです。
    • Ethereumは、状態を保存できる(ステートフル)なので、Aさんが署名して、Bさんが署名して…ということがEthereumのコントラクト上ですることが可能です。

謝辞

2014年5月21日に行われた、暗号通貨技術勉強会 v0.0.2 にて、マックワイド・ジェームズ氏、個人的にTokyo Bitcoin meetupにてジョナサン・アンダーウッド氏に理解の手助けをして頂きました。ありがとうございました。

暗号通貨の技術に興味ある方は、下記ユーザグループへどうぞ。

Cryptocurrency Tech Japan: 日本暗号通貨技術の会

検索用語

  • bitcoin, bip, ビットコイン
  • multi-signature, multi-sig, multisig
  • マルチ・シグネチャー、マルチシグ、マルチシグネチャ
  • ウォレット(wallet): BitGo, GreenAddress, Copay
  • escrow, エスクロー
  • このエントリーをはてなブックマークに追加