向EOS区块链发起一些事务,比如说转账,需要得到账户的授权。
账号交易可以通过权限转移做到。
新权限和action的绑定关系,可增加了eos网络权限的灵活性,通过单个权限的绑定,可将一个账户的权限分层管理,甚至一个公司的所有人都可以使用一个EOS账户来进行权限分离。
9 K4 } |' c1 a
账户的授权是如何授权的?账户的权限里有一个阈值属性,当你的解锁状态的钱包中的有一把私钥能对应到那个权限所绑定的公钥上,而且权重刚好大于等于阈值时,那么就能成功签名,向区块链发送事务。
权限配置
首先当一个账户创建的时候,具备了两种基本权限。每个权限绑定到一个公钥上(单签名账户)或多个公钥上(多签名账户),除了绑定公钥也可以绑定到另一个有效的账户上:
owner:账号主权限,声明的这个账号的归属。只有极少数事务需要使用到owner权限。建议把拥有这个权限的私钥进行冷存储。不要分享给任何人。owner可以用来恢复其他权限。) Q$ f, B$ {% k- T& F) v7 y' B# E8 b0 |
active:活动权限,顾名思议,这个权限,一般用来做一些转账、投票、发起事务等常规操作。0 m, _0 S4 N! e
除了以上两种默认权限,还可以对账户自定义新的权限(计划在未来的账户管理软件中加入支持)。这种权限的可扩展性,非常灵活,给软件开发者提供了很多可能的使用场景。
权限的权重(weight)与阈值(threshold)
单签名账户(默认权限配置的账户)
owner和active权限分别有一个值为1的阈值。+ t0 y! \2 i# i* ~4 \2 {
owner和active所绑定的公钥,则分别有一个值为1的权重。' P' N3 V$ P0 |% w! Q
怎么理解阈值和权重
举个例子来讲吧,把owner这个权限比作一扇门,打开这扇门需要一把正确的钥匙。而owner所绑定的那个公钥对应的那把私钥就是正确的钥匙。' D! z' C0 E$ C$ \8 q* q
因此单签名账户就是权限的阈值和钥匙的权重都为1的一种账户类型。使用某个权限,只需要一把对应的私钥就行了3 T+ I6 W5 Y& y z/ i b6 |
多重签名账户
顾名思义,就是一个权限绑定了多个账户或公钥,权重之和大于等于owner权限的阈值,才能使用这个权限。9 J$ o5 g: @" Z; h
使用一个权限,可能需要不只一个公钥的签名了,也可能是两个、三个、五个。& i+ b0 U7 E! a$ Y; m
命令操作
EOS版本号:v1.0.6' B. w- @; C& t. N( n" t3 n$ p
环境:私有链
操作系统:centos7
参考资料:https://developers.eos.io/eosio-cleos/reference#cleos-set-account1 i9 k: g+ g+ o# }9 K( m1 n" y
查看账号权限- K$ |2 b" I1 |- G, G
cleosgetaccounteosioddztest- X# q% e m" O; R
permissions:
owner1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9
active1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9
memory:2 r! q7 T. X/ @* s% x- B' Q
quota:unlimitedused:2.66KiB
netbandwidth:
used:unlimited! [2 V& d2 g+ A. u
available:unlimited
limit:unlimited o+ r: ^: v+ K3 @
cpubandwidth:
used:unlimited( {4 o8 i1 X. {: K2 E& ^- w: v! i
available:unlimited
limit:unlimited
设置权限# J7 P# P; \4 b3 Y# @
//修改权限
cleossetaccountpermission$ACCOUNT_NAME$PERMISSION_NAME$PUBKEY_OR_ACCOUNT_NAMEactive-psandwichfarm@active- g0 V+ Y" P J0 _: T
参数
accountTEXT-为其设置/删除权限授权的帐户' F! |; L/ l L
permissionTEXT-设置/删除权限的权限名称
authorityTEXT-[delete]NULL,[create/update]公钥,JSON字符串或定义权限的文件名 Z) e" H2 _$ W9 i, V" ?* N5 W ^
parentTEXT-[创建]此父母权限的权限名称(默认为:“active”)
选项5 e" N9 P& j' o7 b
-h,–help打印此帮助信息并退出* F/ A S& J) Q! X. h- Z. ^/ f
-x,–expirationTEXT-设置交易到期之前的秒数,默认为30秒. z. ]9 O+ n. P) H% Z5 f+ P& X
-s,–skip-sign指定是否应使用解锁的钱包密钥来签署交易; G* }$ w( p H0 U. q: w8 z, v4 h
-d,–dont-broadcast-不要向网络广播交易(只需打印到标准输出)5 \- k/ j% G4 q: j# X
-p,–permissionTEXT-要授权的帐户和权限级别,如’account@permission’(默认为’account@active’)3 l: _* l% w1 C7 m7 t* K
–max-cpu-usage-msUINT-设置CPU使用预算的毫秒数上限,用于执行交易(默认为0,表示无限制)
–max-net-usageUINT-为交易设置净使用预算的上限(以字节为单位)(默认为0,表示无限制)
用法
要修改帐户的权限,您必须拥有该帐户的权限和您正在修改的权限。7 Q6 z2 r0 P. M) k8 ~2 K/ \! |# G
//example
//修改权限
cleossetaccountpermissioneosioddztestactiveEOS69bTRDpiVr9wymPY3uKK9K28N1kh7kxR1wn6ynhbpWAasJKW1Kowner-peosioddztest@active3 r; i& O9 F; ~- _
//再次查看eosioddztest权限,发现active已经改变& O2 W* X- b" I; s( Z; ?
cleosgetaccounteosioddztest
permissions:
owner1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9/ ~" ]! |. a, C9 n) o
active1:1EOS69bTRDpiVr9wymPY3uKK9K28N1kh7kxR1wn6ynhbpWAasJKW1K' x2 A( l4 y0 M( B1 V1 v& K- b1 k% ^
memory:$ Q. o% U( a/ h) B$ C* t
quota:unlimitedused:2.66KiB
netbandwidth:
used:unlimited1 J0 h2 M5 @& A! a
available:unlimited
limit:unlimited
cpubandwidth:
used:unlimited
available:unlimited
limit:unlimited( m) |9 O0 J! R! r% X* E
权重和阈值模式5 E$ m ~7 D5 x) g! T
//修改权限
cleossetaccountpermissioneosioddztestactive'{"threshold":1,"keys":[],"accounts":[{"permission":{"actor":"trustwallets","permission":"active"},"weight":1}]}'owner-peosioddztest@active
查看权限,发现action已经改变为权重模式,如看详情可以-j,使用json方式* m7 {/ j3 z( {$ i5 \# R
cleosgetaccounteosioddztest6 m& Y: Q/ M' V* c
permissions:1 q3 f( N; w# a4 _
owner1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9
active1:1trustwallets@active,
memory:% ]$ `1 t' j+ J, F0 k& b8 e
quota:unlimitedused:2.643KiB6 s% f: d2 U8 T, Y! R* v! |
netbandwidth:
used:unlimited$ z9 V% U6 q1 n: D9 R$ d
available:unlimited6 M! x9 ^. L! @, _6 J* L
limit:unlimited. P+ R4 |% e* Z( P8 t
cpubandwidth:; G# D- D) Y& s6 X! }
used:unlimited& b) ^& I* E1 @2 X
available:unlimited
limit:unlimited
参数7 c9 D5 Y5 Z7 |' y, z* _
accounts+ B# |% F" `. _6 ?: G# M3 d
{
"threshold":100,/*签名需要权重值达到多少的一个整数*/" |0 }- Y, i5 z1 T% W. g
"keys":[],/*包含eos风格的公约和权重*/
"accounts":[]/*包含eos账号和权限,权重*/
}
keys/ ]$ p0 v$ b" a/ Z L0 s& t$ \0 k
{7 k4 Q4 i7 T# ~* s
"permission":{
"actor":"sandwich",
"permission":"active"
},: `* R; @, I6 {7 {4 k
"weight":75
}
添加权限
cleossetaccountpermissioneosioddztesttest'{"threshold":1,"keys":[{"key":"EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9","weight":1}],"accounts":[]}'active: l7 B. y: f% L
查看权限多了一个test' ^3 N7 U" b+ H' ] B
cleosgetaccounteosioddztest4 C0 \" D4 C3 ~ A
permissions:
owner1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9
active1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9
test1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9
memory:
quota:unlimitedused:2.99KiB( E h( I( X* E6 i/ A0 P; T
netbandwidth:
used:unlimited4 U+ z, W1 f7 w
available:unlimited i8 I! k. B0 r0 C2 ^- O$ H0 G; k
limit:unlimited$ a1 E8 Z8 Q7 @5 M. ?
cpubandwidth:
used:unlimited
available:unlimited
limit:unlimited
删除权限0 f4 m" _8 p2 ?- G- Q8 w
//删除权限1 z$ K$ B9 W) P' W6 o# T
cleossetaccountpermissioneosioddztesttest'NULL'active
cleosgetaccounteosioddztest
permissions:
owner1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f90 [, Z5 J3 ~" l' _1 f- I
active1:1EOS8Lbyk31K78BaMGuP8WHiC1tL8tphrQjRir8pGccxxbg9zVA4f9
memory:( f# x+ k$ H3 H" Y( h1 `/ l. P
quota:unlimitedused:2.99KiB5 e* ?8 d: P) n) S0 C
netbandwidth:
used:unlimited
available:unlimited
limit:unlimited
cpubandwidth:
used:unlimited
available:unlimited
limit:unlimited
权限绑定action/ D# S+ e4 o7 m& \1 f9 n9 c
//将之前创建的test权限绑定交易事件" |8 {, y, U7 q% D0 Z/ _, r
cleossetactionpermissioneosioddztesteosio.tokentransfertest* @. S! D& F: e
//使用test权限进行交易
cleospushactioneosio.tokentransfer'["eosioddztest","trustwallets","100.0000EOS","transfer"]'-peosioddztest@hello1 A8 |$ W% e3 s
成为第一个吐槽的人