Counterpartyについて調べていたところ、マルチシグネチャという単語が出てきました。
また、Spells of Genesisでも資金持ち逃げ、使い込みなどの防止に、マルチシグネチャを利用しているようです。
ということで、今後、暗号通貨界隈の常識になりそうなマルチシグネチャについて、Monacoinでも動くのかを試してみます。
具体的には、2-of-3マルチシグネチャアドレスを作成し、送金してみます。
3つの署名のうち、2つあれば出金できるというヤツですね。
- アドレスの作成
後で確認しやすいようにアカウントを設定しておきます。
$ monacoind getnewaddress "monamultisig" MGQuGAWjYKcRYWKZndTBocxevJMsvRDkLm $ monacoind getnewaddress "monamultisig" MAe39gF7wwh2g5MMYwmwiEYpSqjgFw7g83 $ monacoind getnewaddress "monamultisig" MVe4ucgqSPRkR1yescuuX17D7t5vcikznd
getaddressesbyaccountでちゃんと作成できているか確認します。
$ monacoind getaddressesbyaccount "monamultisig" [ "MAe39gF7wwh2g5MMYwmwiEYpSqjgFw7g83", "MVe4ucgqSPRkR1yescuuX17D7t5vcikznd", "MGQuGAWjYKcRYWKZndTBocxevJMsvRDkLm" ]
- 公開鍵の確認
monacoind validateaddress MAe39gF7wwh2g5MMYwmwiEYpSqjgFw7g83 { "isvalid" : true, "address" : "MAe39gF7wwh2g5MMYwmwiEYpSqjgFw7g83", "ismine" : true, "isscript" : false, "pubkey" : "020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a", "iscompressed" : true, "account" : "monamultisig" } monacoind validateaddress MVe4ucgqSPRkR1yescuuX17D7t5vcikznd { "isvalid" : true, "address" : "MVe4ucgqSPRkR1yescuuX17D7t5vcikznd", "ismine" : true, "isscript" : false, "pubkey" : "03e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca", "iscompressed" : true, "account" : "monamultisig" } monacoind validateaddress MGQuGAWjYKcRYWKZndTBocxevJMsvRDkLm { "isvalid" : true, "address" : "MGQuGAWjYKcRYWKZndTBocxevJMsvRDkLm", "ismine" : true, "isscript" : false, "pubkey" : "035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb438", "iscompressed" : true, "account" : "monamultisig" }
ちなみに他人のアドレスに対してvalidateaddressを実行しても、結果には公開鍵は含まれず、有効であることだけ分かります。
monacoind validateaddress MR2j3u5oNWZzAAxeHtSinHUEVNiSbkn8zJ { "isvalid" : true, "address" : "MR2j3u5oNWZzAAxeHtSinHUEVNiSbkn8zJ", "ismine" : false }
- マルチシグネチャアドレスの作成
先ほど作成したアドレスの公開鍵を利用して作成し、一番目の引数が出金時に必要な署名の数です。
$ monacoind createmultisig 2 '["020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a", "03e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca", "035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb438"]' { "address" : "3BUVYHpNB6J9X4GsXUo51d7UkfM322SspM", "redeemScript" : "5221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853ae" }
redeemScriptは後で使います。
ちなみに公開鍵ではなく、アドレスからも作れるようで、以下のように同じ結果になります。
$ monacoind createmultisig 2 '["MAe39gF7wwh2g5MMYwmwiEYpSqjgFw7g83", "MVe4ucgqSPRkR1yescuuX17D7t5vcikznd", "MGQuGAWjYKcRYWKZndTBocxevJMsvRDkLm"]' { "address" : "3BUVYHpNB6J9X4GsXUo51d7UkfM322SspM", "redeemScript" : "5221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853ae" }
- マルチシグネチャアドレスへの送金
$ monacoind sendtoaddress 3BUVYHpNB6J9X4GsXUo51d7UkfM322SspM 0.1 64e87a959a46cad0e25b9536ce0f996b56f89807a9215229d278a4e220ae68ac
ブロックエクスプローラを見ると、しっかりと着金しています。
- マルチシグネチャアドレス宛送金トランザクションの確認
オプションに1をつけるとrawではなくデコード済みが返ってきます。
$ monacoind getrawtransaction 64e87a959a46cad0e25b9536ce0f996b56f89807a9215229d278a4e220ae68ac 1 { "hex" : "0100000002ad378b21681f50fbc3cf3cc1dc5967b003733437bd0008a7bc52e44acd2ec3ce00000000fdfe0000493046022100fcdca98debaa9413cba58f2c6ef22277797e6448ee1d391d840a295cc8d65614022100ccc415a475c0a0e4d88f41e4b53f59692a7847951d171cd723f7bb803d4748f301473044022030dbe7bb6fa1271bb2dea33341497847786a74d96f8d21286f5f279ade8b9e6302207be36c17cb83e2dc441ff37ea68ce0272c5b271635de2d82c1c812c762e762b6014c6952210336e6fc63f48676949b646456adf96b1183f296bd0e700bd894174f524839798a2102ea9fa819e3e9c05580671a095ce73aee766ce39c55e084ae5ad50355a5f1d4ef2103fe8b5f8df85b57ee876c3cb4ea23dfe7063ad6fb3500c7527971c80d1c931def53aeffffffff0221976a0390f96d87a81a7941c6279fb233625f44d17dc040f594f4fd6f99d2010000006c493046022100856d3d4813fc636873ab43d13e8251ccd3e4c8e29d284d7812d2537ecf0550dd022100af0a2139aa266e52619a1ed716ebdba6239c6f4537fe3a78e4d9db6f1a1883820121020c61b05ce77a8b0d36c813d882f7e730158296c9e5ef4184ce2f30f4acab5cfcffffffff026f0a1700000000001976a9141391189829986705d972aa1b0c26de994582afb588ac809698000000000017a9146b52e73d9d62dd84f9c974c0989ebc186d90531f8700000000", "txid" : "64e87a959a46cad0e25b9536ce0f996b56f89807a9215229d278a4e220ae68ac", "version" : 1, "locktime" : 0, "vin" : [ { "txid" : "cec32ecd4ae452bca70800bd37347303b06759dcc13ccfc3fb501f68218b37ad", "vout" : 0, "scriptSig" : { "asm" : "0 3046022100fcdca98debaa9413cba58f2c6ef22277797e6448ee1d391d840a295cc8d65614022100ccc415a475c0a0e4d88f41e4b53f59692a7847951d171cd723f7bb803d4748f301 3044022030dbe7bb6fa1271bb2dea33341497847786a74d96f8d21286f5f279ade8b9e6302207be36c17cb83e2dc441ff37ea68ce0272c5b271635de2d82c1c812c762e762b601 52210336e6fc63f48676949b646456adf96b1183f296bd0e700bd894174f524839798a2102ea9fa819e3e9c05580671a095ce73aee766ce39c55e084ae5ad50355a5f1d4ef2103fe8b5f8df85b57ee876c3cb4ea23dfe7063ad6fb3500c7527971c80d1c931def53ae", "hex" : "00493046022100fcdca98debaa9413cba58f2c6ef22277797e6448ee1d391d840a295cc8d65614022100ccc415a475c0a0e4d88f41e4b53f59692a7847951d171cd723f7bb803d4748f301473044022030dbe7bb6fa1271bb2dea33341497847786a74d96f8d21286f5f279ade8b9e6302207be36c17cb83e2dc441ff37ea68ce0272c5b271635de2d82c1c812c762e762b6014c6952210336e6fc63f48676949b646456adf96b1183f296bd0e700bd894174f524839798a2102ea9fa819e3e9c05580671a095ce73aee766ce39c55e084ae5ad50355a5f1d4ef2103fe8b5f8df85b57ee876c3cb4ea23dfe7063ad6fb3500c7527971c80d1c931def53ae" }, "sequence" : 4294967295 }, { "txid" : "d2996ffdf494f540c07dd1445f6233b29f27c641791aa8876df990036a972102", "vout" : 1, "scriptSig" : { "asm" : "3046022100856d3d4813fc636873ab43d13e8251ccd3e4c8e29d284d7812d2537ecf0550dd022100af0a2139aa266e52619a1ed716ebdba6239c6f4537fe3a78e4d9db6f1a18838201 020c61b05ce77a8b0d36c813d882f7e730158296c9e5ef4184ce2f30f4acab5cfc", "hex" : "493046022100856d3d4813fc636873ab43d13e8251ccd3e4c8e29d284d7812d2537ecf0550dd022100af0a2139aa266e52619a1ed716ebdba6239c6f4537fe3a78e4d9db6f1a1883820121020c61b05ce77a8b0d36c813d882f7e730158296c9e5ef4184ce2f30f4acab5cfc" }, "sequence" : 4294967295 } ], "vout" : [ { "value" : 0.01509999, "n" : 0, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 1391189829986705d972aa1b0c26de994582afb5 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a9141391189829986705d972aa1b0c26de994582afb588ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "M9gctXWKs8hSrRbdJMRR4t9s6Yc8yHKd2s" ] } }, { "value" : 0.10000000, "n" : 1, "scriptPubKey" : { "asm" : "OP_HASH160 6b52e73d9d62dd84f9c974c0989ebc186d90531f OP_EQUAL", "hex" : "a9146b52e73d9d62dd84f9c974c0989ebc186d90531f87", "reqSigs" : 1, "type" : "scripthash", "addresses" : [ "3BUVYHpNB6J9X4GsXUo51d7UkfM322SspM" ] } } ] }
- 秘密鍵の確認
結果はマスクしてあります。
$ monacoind dumpprivkey MAe39gF7wwh2g5MMYwmwiEYpSqjgFw7g83 xxxxprivateKey1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx noojloon@noojloon-MS-7821:~$ monacoind dumpprivkey MVe4ucgqSPRkR1yescuuX17D7t5vcikznd xxxxprivateKey2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx noojloon@noojloon-MS-7821:~$ monacoind dumpprivkey MGQuGAWjYKcRYWKZndTBocxevJMsvRDkLm xxxxprivateKey3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- マルチシグネチャアドレスからの送金トランザクションを作成
マルチシグネチャアドレス宛送金のtxidと、getrawtransactionで確認したデータの中身から、voutの大きいほうのnとそのscriptPubKeyのhexを利用します。
$ monacoind createrawtransaction '[{"txid":"64e87a959a46cad0e25b9536ce0f996b56f89807a9215229d278a4e220ae68ac","vout":1,"scriptPubKey":"a9146b52e73d9d62dd84f9c974c0989ebc186d90531f87","redeemScript":"5221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853ae"}]' '{"MR2j3u5oNWZzAAxeHtSinHUEVNiSbkn8zJ":0.05}' 0100000001ac68ae20e2a478d2295221a90798f8566b990fce36955be2d0ca469a957ae8640100000000ffffffff01404b4c00000000001976a914bbe8720c230325a27efff1e236bd61008dd97e1988ac00000000
この辺は普段の処理と比べるとややローレベルな処理になるため、今まで自動的に処理されていたことも自分でやる必要があります。
この例でいうとお釣りについて一切考えずに処理しているため、0.10の入金に対して0.05の出金ということになり、差額は手数料として消えるようです。
fee0.001にするには、以下のようにお釣り用のアドレスも送金先に指定します。
{"あて先":0.05,"お釣り用":0.049}
- 送金トランザクションに署名する
$ monacoind signrawtransaction '0100000001ac68ae20e2a478d2295221a90798f8566b990fce36955be2d0ca469a957ae8640100000000ffffffff01404b4c00000000001976a914bbe8720c230325a27efff1e236bd61008dd97e1988ac00000000' '[{"txid":"64e87a959a46cad0e25b9536ce0f996b56f89807a9215229d278a4e220ae68ac","vout":1,"scriptPubKey":"a9146b52e73d9d62dd84f9c974c0989ebc186d90531f87","redeemScript":"5221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853ae"}]' '["xxxxprivateKey1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]' { "hex" : "0100000001ac68ae20e2a478d2295221a90798f8566b990fce36955be2d0ca469a957ae86401000000b500483045022006265235010d34980be0054469137987a059db6b18803d2310195d24b0fac295022100a6b6c349b6378ed4ea9b9443bbcde4d2673d42f8b3bb108669e759940e1ca243014c695221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853aeffffffff01404b4c00000000001976a914bbe8720c230325a27efff1e236bd61008dd97e1988ac00000000", "complete" : false }
一つではコンプリートしないので、もう一つ署名します。
$ monacoind signrawtransaction '0100000001ac68ae20e2a478d2295221a90798f8566b990fce36955be2d0ca469a957ae86401000000b500483045022006265235010d34980be0054469137987a059db6b18803d2310195d24b0fac295022100a6b6c349b6378ed4ea9b9443bbcde4d2673d42f8b3bb108669e759940e1ca243014c695221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853aeffffffff01404b4c00000000001976a914bbe8720c230325a27efff1e236bd61008dd97e1988ac00000000' '[{"txid":"64e87a959a46cad0e25b9536ce0f996b56f89807a9215229d278a4e220ae68ac","vout":1,"scriptPubKey":"a9146b52e73d9d62dd84f9c974c0989ebc186d90531f87","redeemScript":"5221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853ae"}]' '["xxxxprivateKey2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]' { "hex" : "0100000001ac68ae20e2a478d2295221a90798f8566b990fce36955be2d0ca469a957ae86401000000fdff0000483045022006265235010d34980be0054469137987a059db6b18803d2310195d24b0fac295022100a6b6c349b6378ed4ea9b9443bbcde4d2673d42f8b3bb108669e759940e1ca24301493046022100e6b0a31018d371bd52bdbb5047c8a2d4978404cd300b51edbdcdd84eefd5eb54022100c20925bac763d3ebf706d0481c52f70ca49aa951086b8df1c1bf6e8780f380a2014c695221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853aeffffffff01404b4c00000000001976a914bbe8720c230325a27efff1e236bd61008dd97e1988ac00000000", "complete" : true }
コンプリートしました。
- トランザクションの送信
$ monacoind sendrawtransaction 0100000001ac68ae20e2a478d2295221a90798f8566b990fce36955be2d0ca469a957ae86401000000fdff0000483045022006265235010d34980be0054469137987a059db6b18803d2310195d24b0fac295022100a6b6c349b6378ed4ea9b9443bbcde4d2673d42f8b3bb108669e759940e1ca24301493046022100e6b0a31018d371bd52bdbb5047c8a2d4978404cd300b51edbdcdd84eefd5eb54022100c20925bac763d3ebf706d0481c52f70ca49aa951086b8df1c1bf6e8780f380a2014c695221020ac51c1293db7576d703d4c4a79eac4ba7bd3a4141bc6265bc93742f6666b03a2103e0b36973abfa94708e393e1f68ca5f600646696ed41bcabf3822ed5155c405ca21035df97df1f5ff93e4ba4df6b9a2f7aa2c2f7f9909ca2609b0714e1a0d6c6fb43853aeffffffff01404b4c00000000001976a914bbe8720c230325a27efff1e236bd61008dd97e1988ac00000000 4095c488fe886b66560540fb953cab44e2ab36f70c40fc5cc9e169f1e26e459b
半分手数料で持っていかれましたが、無事出金できました。
0 コメント:
コメントを投稿