- 複数の署名によって送金できるようになるマルチシグネチャについての技術的解説です
-
例えば「3つのうち2つの秘密鍵があると送金できる」ということができるようになります
- つまり、N人のうちM人の人が署名をしたら、ビットコインを送ることができる、ことができる
- 安全にビットコインを利用するための技術です
- 今後、ウォレット、交換所でメジャーになるでしょう
前提知識
- Bitcoinのトランザクションの仕組み
- Bitcoinのアドレスの作り方
- Bitcoin の Script の知識
- scriptPubKey, scriptSig, UTXO
- HASH_160 (ダブルハッシュで、SHA256してから、RIPEMD160する)
- BIP(ビットコインの改善提案)
概要
- 「3つのうち2つの秘密鍵があった場合のみ送金可能」ということができる
- マルチシグネチャには2つの方法がある
- 旧来の方法: BIP 11: M-of-N Standard Transactions
- 新しい方法: 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"]
- 必要な公開鍵(例では3つ)を用意する
- 必要な秘密鍵の数(例では2)を書く
利用例
- ウォレット
- 交換所
- エスクロー
- Koinifyのようなクラウドファンディングにて、お金を持ち逃げされないようにマイルストーンが達成されるごとに、企業、クラウドファンディング、第三者の2-of-3 multisigでファンドをリリースする
- Counterpartyのデータの保存場所(ニセの公開鍵に)としても利用されている。1-of-3 multisig で2つがニセ公開鍵で、1つがちゃんとした公開鍵
マルチシグ対応ソフトウェア
BitGo
- 公式サイト: BitGo
- マルチシグネチャ・ウォレット
- 一つの鍵はBitGoが、他の複数の鍵はユーザが持つ
- 以下からユーザを守る
- サービスのシャットダウン
- サーバのハック
- 運用者による盗難
- クライアントのマルウェア
- いつも余分な鍵があるので、パスワードを忘れても復旧できる
- 盗難対策
- 元IPアドレスのチェック
- IP ホワイトリスト
- アドレス・ホワイトリスト
- 時間/ベロシティ制限
- その他
引用元: Bitcoin storage and multi signature wallets
GreenAddress
GreenAddress.it – Free and secure online Bitcoin wallet
BIP
公式BIP
- BIP 10: Multi-Sig Transaction Distribution
- BIP 11: M-of-N Standard Transactions
- BIP 12: OP_EVAL は、却下
- BIP 13:
- BIP 16: Pay to Script Hash
- BIP 17: OP_CHECKHASHVERIFY (CHV)
BIPの説明
参考サイト
日本語ページ (日本語)
参考ページ (英語)
- Address – Bitcoin
- What are multi-signature transactions? – Bitcoin Stack Exchange
- エスクロー: Buyer-Seller Escrow, with or without third-party
参考動画
- Bitcoin 101 – Multi-Signature Addresses pt1 – Coding This Major Security Improvement – YouTube
-
Bitcoin 101 – Multi-Signature Addresses pt2 – Spending, Protocol & Coding – YouTube
上記で使われた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, エスクロー