cleos set account permission を調べる
目的
パーミッションについて調べる。
環境
nodeos v1.5.0
eosio.cdt v1.4.1
はじめに
cleos で alice アカウントの active パーミッションの鍵を alice@owner 権限で変更します。
code:invoke01.sh
cleos set account permission alice active EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo owner -p alice@owner
code:response01.txt
executed transaction: fbf9a926b35fc8e91e821aaf6ade88212ba1696b2ed9c2318eb4a8d9889cdea1 160 bytes 399 us
# eosio <= eosio::updateauth {"account":"alice","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[{"key":"EOS7...
warning: transaction executed locally, but may not be confirmed by the network yet ]
トランザクションの詳細を見ます。
code:invoke02.sh
cleos get transaction fbf9a926b35fc8e91e821aaf6ade88212ba1696b2ed9c2318eb4a8d9889cdea1
code:response.json
{
"id": "fbf9a926b35fc8e91e821aaf6ade88212ba1696b2ed9c2318eb4a8d9889cdea1",
"trx": {
"trx": {
"actions": [{
"account": "eosio",
"name": "updateauth",
"authorization": [{
"actor": "alice",
"permission": "owner"
}
],
"data": {
"account": "alice",
"permission": "active",
"parent": "owner",
"auth": {
"threshold": 1,
"keys": [{
"key": "EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo",
"weight": 1
}
],
"accounts": [],
"waits": []
}
}
}
]
}
}
}
※いらない部分を削ぎ落しています。
cleos push action で再現してみます。
code:invoke03.sh
code:response03.txt
executed transaction: ebd533fd44525acdb2fe500583a48df7cbe0783a32135faf5d4e2a972509c7b6 160 bytes 261 us
# eosio <= eosio::updateauth {"account":"alice","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[{"key":"EOS7...
warning: transaction executed locally, but may not be confirmed by the network yet ]
active パーミッションは、 parent 引数を owner パーミッションにして、 owner パーミッションでアクションを起こす必要があります。例えば、active パーミッション自身で鍵を変更しようとしても失敗します。
code:invoke04.sh
code:response04.txt
Error 3050000: Action validate exception
Error Details:
Cannot set an authority as its own parent
pending console output:
owner パーミッションは、 owner パーミッション自身で権限を変更することができます。 owner パーミッションの親は設定できないので、 parent 引数を空文字にしなければなりません。
code:change-owner-permission.sh
auth 引数の中にある accounts の中身は空になっていますが、eosio.code パーミッションを付与するときには、そのことが配列に含まれます。
code:invoke05.sh
cleos set account permission addressbook active --add-code
code:response05.txt
executed transaction: 43b900bf669824da3aa736b0eea72041b98fd5c155d998dcfb6fdbed356b6185 184 bytes 244 us
# eosio <= eosio::updateauth {"account":"alice","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[{"key":"EOS7...
warning: transaction executed locally, but may not be confirmed by the network yet ]
code:invoke06.sh
cleos get transaction 43b900bf669824da3aa736b0eea72041b98fd5c155d998dcfb6fdbed356b6185
code:response06.json
{
"id": "43b900bf669824da3aa736b0eea72041b98fd5c155d998dcfb6fdbed356b6185",
"trx": {
"trx": {
"actions": [{
"account": "eosio",
"name": "updateauth",
"authorization": [{
"actor": "alice",
"permission": "active"
}
],
"data": {
"account": "alice",
"permission": "active",
"parent": "owner",
"auth": {
"threshold": 1,
"keys": [{
"key": "EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo",
"weight": 1
}
],
"accounts": [{
"permission": {
"actor": "alice",
"permission": "eosio.code"
},
"weight": 1
}
],
"waits": []
}
}
}
]
}
}
}
※いらない部分を削ぎ落しています。
cleos push action から直接行う場合は次のようになります。
code:invoke07.sh
code:response07.txt
executed transaction: a77f1d048a052db0b972db31c49a426a707c38dc13e7b5171b11b4e004dd39ec 184 bytes 490 us
# eosio <= eosio::updateauth {"account":"alice","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[{"key":"EOS7...
warning: transaction executed locally, but may not be confirmed by the network yet ]
code:invoke08.sh
cleos get account alice
code:response08.txt
created: 2019-02-10T18:02:08.500
permissions:
owner 1: 1 EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo
active 1: 1 EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo, 1 alice@eosio.code
...
この出力を和訳すると、alice@active 権限でアクションを起こしたいならば、EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo に対応する秘密鍵で署名するか、alice アカウントにデプロイされたコントラクト内でアクションを起こす必要がある、ということです。
この accounts の中身を別のものに変えてみます。keys の中身を空にして、accounts の中に bob@active を追加します。
code:invoke09.sh
code:response09.txt
executed transaction: 612333da177fd9ba7111279e006cc9bce1299e3c09df4f9e6b2164e322ae3077 144 bytes 928 us
# eosio <= eosio::updateauth {"account":"alice","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[],"accounts"...
code:invoke10.sh
cleos get account alice
code:response10.txt
created: 2019-02-10T18:02:08.500
permissions:
owner 1: 1 EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo
active 1: 1 bob@active
...
alice@active に紐づいていた鍵がなくなり、bob@active が代わりに入りました。これは、bob@active に紐づいた鍵がなければ alice@active 権限でアクションが起こせないことを表しています。それを確かめるために次のような実験をしてみます。
まず、bob@active の秘密鍵が cleos wallet に入っていない状態にします。キーペアを生成し、
code:invoke11.sh
cleos create key --to-console
code:response11.txt
Private key: ***
Public key: EOS68FrRxGK2Y5hSvnnYpyTsSFv7D7pM5yLGrbAGiockkeK8691vm
その鍵に変更します。
code:invoke12.sh
cleos set account permission bob active EOS68FrRxGK2Y5hSvnnYpyTsSFv7D7pM5yLGrbAGiockkeK8691vm owner -p bob@owner
code:response.txt
executed transaction: 811d2fca572b06aff30fd3e87209927b851f4a7aba460881d993016faee46fcc 160 bytes 228 us
# eosio <= eosio::updateauth {"account":"bob","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[{"key":"EOS68F...
warning: transaction executed locally, but may not be confirmed by the network yet ]
code:invoke13.sh
cleos get account bob
code:response13.txt
created: 2019-02-10T18:02:07.000
permissions:
owner 1: 1 EOS7hnP2sZGr2DAwfL5fSZ8btYF99gjmeEBbKftFeWWhG4jSK3zRo
active 1: 1 EOS68FrRxGK2Y5hSvnnYpyTsSFv7D7pM5yLGrbAGiockkeK8691vm
alice@active 権限でアクションを起こしてみると、該当する署名がないと言われます。
code:response14.txt
Error Details:
transaction declares authority '{"actor":"alice","permission":"active"}', but does not have signatures for it.
cleos wallet に先ほどのキーペアを登録します。対話モードになったら、秘密鍵をコピペします。
code:invoke15.sh
cleos wallet import
code:response15.txt
imported private key for: EOS68FrRxGK2Y5hSvnnYpyTsSFv7D7pM5yLGrbAGiockkeK8691vm
alice@active 権限でアクションを起こしてみると、今度はうまくいきます。
これまでの話をまとめると、パーミッションには大きく分けて、
(1) 公開鍵を紐づけたもの
(2) 他のパーミッションを紐づけたもの
(3) あるアカウントの eosio.code パーミッションを紐づけたもの
があります。(1), (2) によって権限を与える場合は、紐づいている公開鍵に対応する秘密鍵による署名が必要です。(3) によって権限を与える場合、すなわち、インラインアクションを行う場合は、元のコントラクトを実行するために必要な権限は満たす必要はありますが、追加の署名は必要がありません。 関連ワード