マルチシグネチャアドレス
(multisignature address)
の作成方法・送金方法
2014年4月20日
モナーコインで遊ぶ会@東京
 名前:とく(@Mona_toku)
 20歳 学生
 回路屋さん
マイコン
FPGA など
かる〜く自己紹介
最近ソフトウェア系の話題などに興味がわく
スクリプト言語やサーバー・Webプログラミングの勉強をする
1
マルチシグネチャアドレスについての
 文献・ソースが少ない(英語よめませーん)
 活用したサービスが少ない
 アドレス作成に公開鍵暗号の知識が少っしだけ必要
出金の仕組みが複雑
2
講演の経緯
ぜひ理解して、マルチシグネチャアドレスの
サービスの開発や利用を!
マルチシグネチャアドレスについて
いくつか質問!!
どの程度知られているのかな?
3
1. 「マルチシグネチャアドレス」というワードを
聞いたことがある
4
2. マルチシグネチャアドレスがどういうものか
知っている
3. マルチシグネチャアドレスを作成したこと
がある
4. マルチシグネチャアドレスで送金をしたこと
がある
5. マルチシグネチャアドレスを利用したWeb
サービスなどを考えたことがある
マルチシグネチャアドレス
5
説明上の用語・略語
マルチシグアドレス
着金 出金
説明の便宜上、アドレスをお財布とおいている。
公開鍵 秘密鍵
マルチシグアドレスとは
6
7
通常のアドレス
鍵が1個掛けられており、
出金には対応した鍵が1個必要
マルチシグアドレス
鍵がM個掛けられているが、
出金は対応した鍵がN個で可能
例では・・・
鍵が3個掛けられているが、
出金は対応した鍵が2個で可能
(N≦M)
2−of−3
マルチシグアドレス
 Mの設定できる値
0<M≦16
 Nの設定できる値
0<N≦M
8
MとNの設定できる値
マルチシグアドレスの作成方法
いきなり技術的な話!
開発者・サービス提供者向け!
9
とりあえず財布つくってみよう!!
10
その前に・・・
1. 秘密鍵と公開鍵のペア
2. 自ウォレットで作成された通常のアドレス
3. インポートされた通常のアドレス
これらに該当するものを鍵をかける数(M)だけ
用意する
1.はWIF(Wallet Import Format)の知識が必要
わりかし簡単な2.の方法
で説明!
 鍵をかける数(M)だけのアドレスを作成
getnewaddressコマンドで作成出来る
(このアドレスが公開鍵として使用される
[validateaddressで参照可能])
 作成したアドレスの秘密鍵を取り出す
dumpprivkeyコマンドで取得
(出金承認時に必要)
11
マルチシグアドレスの作成準備
さぁ!アドレス作成!!
12
13
createmultisigコマンド
addmultisigaddressコマンド
createmultisig <nrequired> <‘[“key”,”key”,…]’>
addmultisigaddress <nrequired> <‘[“key”,”key”,…]’> [account]
createmultisig N ‘[“address1”, “address2”,…]’
addmultisigaddress N ‘[“address1”, “address2”,…]’ [label]
わかりやすく〜
N:出金時必要な鍵(署名)の数
adderss:アドレス(公開鍵でもOK!)
label:ウォレットに表示されるlabelのこと
(開発を行う上ではaccount)
実際に、やってみる。
14
address:マルチシグアドレス
redeemScript:出金時に必要!!
償還スクリプト
createmultisig 2 '["MAQDRBoRei2U8pHWc1XGcmgWy8AK4dBUP7",
"MDfxu3scxRP9syLnxMZQ1h3pvASmnHQjGm",
"MMwG8XGMEMGQTMazJec4MrckynuigiHeKQ"]’
{
"address" : "3QxBKdzTusR3LahTLCzkHFy6R8vYMNZfH4",
"redeemScript" : "5221033cb51d0ace038b613390a43bf9e3fdc12ce32fb03
cf87f1257d3462231693cfa2103ebda741dcaace3d7c59bb0dc3462d51764b5
424277edbf4a12781e3b3451e35521023203603ea470f93ea288b47ad1f3e5d
8ed1554f013addd6f10c6d4e0dd05825553ae”
}
マルチシグアドレスで出金!
15
入金は通常と同じだよ!
出金の前に・・・
Walletにすべての秘密鍵がインポートされている場合
16
マルチシグアドレスでは残高が記憶できない!?
(みたい・・・)
listunspentコマンドを使用し
着金情報を取得する
 コマンドからtxid、vout、scriptPubKeyを取得
 同時にredeemScriptも取得することが出来る
出金の前に・・・
Walletにすべての秘密鍵がインポートされていない場合
17
マルチシグアドレスでは残高が記憶できない!?
(みたい・・・)
着金に関するトランザクション(txid)を
すべて記憶する必要がある
 出金したユーザからtxidを通知してもらう
 トランザクションを作成し、出金するユーザに署名
してもらう
1. createrawtransactionコマンドを使い
トランザクション情報の作成
1. signrawtransactionコマンドを使い
トランザクション情報に署名
1. sendrawtransactionコマンドを使い
トランザクションを実行!
18
マルチシグアドレスの
出金の流れ
19
1. createrawtransaction
通常:createrawtransaction [{"txid":txid,"vout":n},...] {address:amount,...}
マルチシグ:createrawtransaction [{"txid":txid,"vout":n, "scriptPubKey":"hex",
"redeemScript":"hex"},...] {address:amount,...}
着金の情報 出金の情報
 着金の情報
 txid:トランザクションID
 vout:出金情報番号(index)
 scriptPubKey:検証用スクリプト
 redeemScript:償還スクリプト
 出金の情報
 address:出金先アドレス
 amount:出金金額
20
着金の情報の詳細・説明
vout
vin txid
vout
・・・
txid
vout
・・・
txid
vout
・・・
1
txid
value
scriptPubKey
・・・
2
txid
value
scriptPubKey
・・・
3
txid
value
scriptPubKey
・・・
createrawtransaction
txid:97dc7aa76e7d0ee5f83a635d05ab2eb0984cf3fd69ffc916c391a5b4dec7e3c7
gettrawtransaction
で見れるよ!
実際に、やってみる。
21
createrawtransaction ‘[{"txid":"97dc7aa76e7d0ee5f83a635d05ab2e(ry・・・",
"vout":0,
"scriptPubKey":"a914ff28fa4840a1edddf196f(ry・・・",
"redeemScript":"5221033cb51d0ace038b6133(ry・・・"}]'
'{"MXC8hYF6ScqqgSWGY2L3Emz9n4ownkW8gq":0.08}'
0100000001c7e3c7deb4a591c316c9ff69fdf34c98b02eab055d633af8e50e7d6
ea77adc970000000000ffffffff0100127a00000000001976a914ff80af5e0a8a3a
420276514a85a644c32d79208d88ac00000000
HEXでエンコードされた
トランザクション情報
1. createrawtransactionコマンドを使い
トランザクション情報の作成
1. signrawtransactionコマンドを使い
トランザクション情報に署名
1. sendrawtransactionコマンドを使い
トランザクションを実行!
22
マルチシグアドレスの
出金の流れ
23
2. signrawtransaction
signrawtransaction <hex string> [{"txid":txid,"vout":n,
"scriptPubKey":hex,"redeemScript":hex},...]
[<privatekey1>,...] 着金の情報
秘密鍵
 hex string
 HEXでエンコードされたトランザクション情報
 着金の情報
 createrawtransactionで使用したものと同じ
 秘密鍵
 WIF形式の秘密鍵(複数指定可)
(dumprivkeyで取り出したもの)
実際に、やってみる。
24
signrawtransaction 0100000001c7e3c7deb4a591c316c9ff69fdf34c98(ry・・・
' [{"txid":"97dc7aa76e7d0ee5f83a63(ry・・・",(ry・・・}] '
' ["TQQoLcRqWnR7NySfQooRXFQ4Kg45w7ocUa(ry・・・"] '
{
"hex" : "0100000001c7e3c7deb4a591c316c9ff69fdf34c98b02eab055d633af8e50e7d6ea77adc9700000000b60049304602
2100ad0e6b9e8e1db6525f876d95967d13450d736ca9e2c869bf631d249fef809567022100e4f58ae538ae964ed3c6d2391c6f794d
e603ede3f5e55c78fa09ca0b56a55c4e014c695221033cb51d0ace038b613390a43bf9e3fdc12ce32fb03cf87f1257d3462231693cfa2
103ebda741dcaace3d7c59bb0dc3462d51764b5424277edbf4a12781e3b3451e35521023203603ea470f93ea288b47ad1f3e5d8ed155
4f013addd6f10c6d4e0dd05825553aeffffffff0100127a00000000001976a914ff80af5e0a8a3a420276514a85a644c32d79208d88ac
00000000",
"complete" : false
}
署名(鍵)が2個必要なため
まだ送金ができない
実際に、やってみる。2
25
signrawtransaction 0100000001c7e3c7deb4a591c316c9ff69fdf34c98b0(ry・・・
' [{"txid":"97dc7aa76e7d0ee5f83a63(ry・・・",(ry・・・}] '
' ["TQ8jEssUoEPhG5fiQC1KUaK7xsqKbE4qRRwbb(ry・・・"] '
{
"hex" : ”00100000001c7e3c7deb4a591c316c9ff69fdf34c98b02eab055d633af8e50e7d6ea77adc9700000000fdff000049304
6022100ad0e6b9e8e1db6525f876d95967d13450d736ca9e2c869bf631d249fef809567022100e4f58ae538ae964ed3c6d2391c6f794
de603ede3f5e55c78fa09ca0b56a55c4e01483045022011e269a4780d6dd6228585d978882f1a40156e4cfe68112a1f5d6ce4a3603b3a
022100f34a2d341b6ccb47ebc56d14c59e60db025f8f4f8173b196e976bba5131bc2be014c695221033cb51d0ace038b613390a43bf9e3
fdc12ce32fb03cf87f1257d3462231693cfa2103ebda741dcaace3d7c59bb0dc3462d51764b5424277edbf4a12781e3b3451e35521023203
603ea470f93ea288b47ad1f3e5d8ed1554f013addd6f10c6d4e0dd05825553aeffffffff0100127a00000000001976a914ff80af5e0a8a3a
420276514a85a644c32d79208d88ac00000000",
"complete" : true
}
署名(解除)完了!!
1. createrawtransactionコマンドを使い
トランザクション情報の作成
1. signrawtransactionコマンドを使い
トランザクション情報に署名
1. sendrawtransactionコマンドを使い
トランザクションを実行!
26
マルチシグアドレスの
出金の流れ
27
3. sendrawtransaction
sendrawtransaction <hex string>
 hex string
 HEXでエンコードされたトランザクション情報
(今回は署名が完了した物)
だけ!!
実際に、やってみる。
28
sendrawtransaction 0100000001c7e3c7deb4a591c316c9ff69fdf34c98b(ry・・・
99b5cd179b85f38538c44ca15e520ecdf10e50dc126d498b9c04fc599db0161e
マルチシグアドレスから送金処理
を行ったトランザクションのID
 マルチシグネチャアドレスの説明
 マルチシグネチャアドレスの作成
 マルチシグネチャアドレスから送金の処理
29
まとめ
 できれば2−of−3の仕組みを説明したかった
なぁ・・・
 マルチシグネチャアドレス、わかればそんなに
難しくないw!!
 マルチシグネチャアドレスをWebサービスなどに
是非ご検討を!!
30
最後に
ご清聴ありがとうございました!

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