cleos multisig でトランザクションにマルチシグする
概要
トランザクションにマルチシグしたいときの cleos multisig の使い方。
以下、CryptoKylin テストネットで行います。まずは、トランザクションを準備する propose を行います。今回は、送信者と受信者の双方が承認したら、EOS トークンが送信できるようにしました。
code:propose.sh
code:trx-proposed.txt
executed transaction: a8894ff889899ff16ebd0ccb85f229b82dda1d8f70b327d8e5927d4bc62cb455 240 bytes 1103 us
# eosio.msig <= eosio.msig::propose {"proposer":"mokemokecore","proposal_name":"testmsig","requested":[{"actor":"leohioleohio","permissi...
warning: transaction executed locally, but may not be confirmed by the network yet ]
proposal_name は、トランザクションに短い名前を付けることができます。命名規則はアカウント名と同様に、ドット、1~5、a~z のみから成る 12 字以内の文字列です。
requested_permissions はマルチシグのために集めなければならないパーミッションの配列です。ここで指定したすべてのパーミッションから approve (後述)が行われないと、トランザクションが実行されません。
trx_permissions, contract, action, data は、すべて action 構造体変数を作るのに必要です。action 構造体における authorization, account, name, data メンバにそれぞれ対応します。
proposer は、誰の (active) 権限で propose を行うかを指定します。proposer はマルチシグされたトランザクションが実行されるまで、マルチインデックステーブルの RAM を負担します。
proposal_expiration は、トランザクションが期限切れになるまでの時間を hours 単位で指定します。これは transaction 構造体変数の expiration メンバに対応します。デフォルトでは 24 時間後が指定されます。
propose されたトランザクションの一覧は review で確認することができます。proposer と proposal_name で トランザクション を見つけることができます。 code:review.sh
code:restmsig-trx.json
{
"proposer": "mokemokecore",
"proposal_name": "testmsig",
"transaction_id": "77beca1874ff91d39ad7a4cd62b93f9abb9399dd4005845a2f9a005fb51dccb8",
"packed_transaction": "7c99b05c000000000000000000000100a6823403ea3055000000572d3ccdcd01a02e450a52a9209500000000a8ed323229a02e450a52a92095405da32a52d7a88a0a0000000000000004454f53000000000873656e6420454f5300",
"transaction": {
"expiration": "2019-04-12T13:58:20",
"ref_block_num": 0,
"ref_block_prefix": 0,
"max_net_usage_words": 0,
"max_cpu_usage_ms": 0,
"delay_sec": 0,
"context_free_actions": [],
"actions": [{
"account": "eosio.token",
"name": "transfer",
"authorization": [{
"actor": "mokemokecore",
"permission": "active"
}
],
"data": {
"from": "mokemokecore",
"to": "leohioleohio",
"quantity": "0.0010 EOS",
"memo": "send EOS"
},
"hex_data": "a02e450a52a92095405da32a52d7a88a0a0000000000000004454f53000000000873656e6420454f53"
}
],
"transaction_extensions": []
}
}
approve で署名を加えます。
code:approve.sh
code:approved.txt
executed transaction: fc6418454f5ed9a7dc9323e466546553972c41eb4f9c76e3e71f6eccfb8f64a7 128 bytes 720 us
# eosio.msig <= eosio.msig::approve {"proposer":"mokemokecore","proposal_name":"testmsig","level":{"actor":"mokemokecore","permission":"...
warning: transaction executed locally, but may not be confirmed by the network yet ]
proposer と proposal_name でトランザクションを指定し、 permission に加えたいパーミッションを指定します。
この時点では、片方の署名しか集まっていないので、exec (後述)で実行しようとしても拒否されます。もう片方の署名を加えてもらうよう相方に伝えましょう。
code:approve2.sh
code:approved2.txt
executed transaction: 9fa779219243b38c639e19ceab9e58505a37c79e88652958fae7f970ded968cf 128 bytes 686 us
# eosio.msig <= eosio.msig::approve {"proposer":"mokemokecore","proposal_name":"testmsig","level":{"actor":"leohioleohio","permission":"...
warning: transaction executed locally, but may not be confirmed by the network yet ]
必要な署名がそろったので exec でマルチシグされたトランザクションを実行します。
code:exec.sh
code:executed.txt
executed transaction: 9d0419bd4ab72e3e5e93d34ee845ceb46b495c7ac0a2d2a875b51aac7681bc52 160 bytes 957 us
# eosio.msig <= eosio.msig::exec {"proposer":"mokemokecore","proposal_name":"testmsig","executer":"leohioleohio"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
proposer と proposal_name でトランザクションを指定し、署名した人のうちの誰かが実行者 executor としてトランザクションを実行します。これが成功すると、マルチシグされた トランザクション が正常に実行されていることが確認できます。 以上でマルチシグを実現することができました。
もし、マルチシグを予定していたトランザクションを取り消したい場合には、 cancel を使います。
code:cancel.sh
proposer と proposal_name でトランザクションを指定し、proposer の権限で実行できます。期限が切れていたら誰でも取り消し可能になります。
approve を取り消す場合は、unapprove があります。引数は approve と同じです。
code:unapprove.sh
※もし、cleos の wallet の中に必要なパーミッションに対応するキーペアがすべて入っているなら、
code:multisig.sh
cleos -u https://api-kylin.eoslaomao.com:443 push action eosio.token transfer '{"from": "mokemokecore", "to": "leohioleohio", "quantity": "0.0010 EOS", "memo": "send EOS"}' -p mokemokecore@active leohioleohio@active のようにパーミッションを並べればマルチシグできます。
関連ワード