接着,按照上面我们设计的表格内容,我们先对jack的owner权限进行修改:
liuwenbin@liuwenbin:~$ cleos set account permission jack owner '{"threshold":2,"keys":[],"accounts":[{"permission":{"actor":"alice","permission":"owner"},"weight":1},{"permission":{"actor":"bob","permission":"owner"},"weight":1}],"waits":[]}' -p jack@owner executed transaction: 494777ac55fa19144027ba5fdf75dcdaab4c4d52cdcaa13c0b6ecabfe622ffd1 160 bytes 136 us # eosio <= eosio::updateauth {"account":"jack","permission":"owner","parent":"","auth":{"threshold":2,"keys":[],"accounts":[{"per... warning: transaction executed locally, but may not be confirmed by the network yet注意这里使用到了 cleos set account permission 命令。这条命令中比较重要的部分是第三个参数authority的内容。
authority的内容可以是:
NULL,代表删除权限
public key,将该权限的内容设置为一个公钥
JSON字符串,完整地复杂地设置一个账户某个权限的内容
一个文件名,同上,只不过改为将完整配置放在文件中读取
根据我们以上对jack owner权限的设计方案,是属于比较复杂的权限内容,因此这里采用的是第三种方式,及JSON字符串的方式。那么JSON字符串的格式是什么?我们例举本次生效的配置格式化如下:
{ "threshold": 2, "keys": [], "accounts": [ { "permission": { "actor": "alice", "permission": "owner" }, "weight": 1 }, { "permission": { "actor": "bob", "permission": "owner" }, "weight": 1 } ], "waits": [] }我们分别来介绍这里面的字段:
threshold目前最多只有两个账户,每个账户的权重都是1,所以threshold的取值范围是1或者2。
1:在@Jack账户上执行任何需要owner权限的操作必须由@Alice或者@Bob账户任意一个账户进行签名授权。
2:在@Jack账户上执行任何需要owner权限的操作必须由@Alice和@Bob账户进行多签名授权。
keys也可以通过JSON字符串设置秘钥,这与在命令中第三个参数直接使用公钥是相同的效果。但是要注意的是,如果该账户已经通过JSON设置了复杂的权限内容,再次修改的时候一定还需要使用原JSON数据进行增量修改,若使用命令行加公钥的方式会直接覆盖掉原JSON设置的复杂权限内容。
accounts权限是通过其他账户来授权,其中包括:
permission:某个账户actor的某个权限
weight,与上面的threshold呼应使用
我们这里就是通过设置该字段来实现的多账户签名。
设置延时时间,最大不超过max_transacton_delay的配置值。
下面来设置其active权限,active权限与owner权限不同的是threshold的值,以及
账户除了owner权限是根权限以外,active本身是其子权限,而 cleos set account permission 命令设置的权限默认都是active的子权限,注意,我们在设置active权限本身的时候,要手动指定其父权限为owner,否则会默认指向自己,报错。
liuwenbin@liuwenbin:~$ cleos set account permission jack active '{"threshold":1,"keys":[],"accounts":[{"permission":{"actor":"alice","permission":"owner"},"weight":1},{"permission":{"actor":"bob","permission":"owner"},"weight":1}],"waits":[]}' owner -p jack@owner executed transaction: 0865e7e9122354a2c29fd9ab48bb39b8a7bd758fdd7c4dc376e21ce45d8e23fb 176 bytes 461 us # eosio <= eosio::updateauth {"account":"jack","permission":"active","parent":"owner","auth":{"threshold":1,"keys":[],"accounts":... warning: transaction executed locally, but may not be confirmed by the network yet这样,jack账户的权限就全部按照以上权限设计表格设置完毕了,下面我们使用命令来验证一下目前jack账户的权限内容:
liuwenbin@liuwenbin:~$ cleos get account jack permissions: owner 2: 1 alice@owner, 1 bob@owner, active 1: 1 alice@owner, 1 bob@owner, 多签名演示 一. 部署eosio.msig合约首先要注意的是,EOS中对多签名的支持是通过eosio.msig智能合约来支持的,因此秉承eos"专人专责"的设计规范,我们先创建一个账户eosio.msig,并用该账户部署eosio.msig合约。
如果不是自己新增或者对原合约有修改的话,推荐直接使用build目录下的contract,已经生成好了相关的wast以及abi文件。
二. 部署eosio.token合约这里我们使用token合约的相关权限操作进行多签名的演示。同样的,我们也创建一个账户eosio.token并用其部署eosio.token合约。创建一个SYS token,并发放给jack,bob和alice三人分别100个。然后我们调用命令:
liuwenbin@liuwenbin:~$ cleos push action eosio.token transfer '["jack","bob","50 SYS"]' -p jack@owner executed transaction: 8166f8503a098eeab6642afe375167e18bf79d0d904015f5bba19524ce2d56d6 144 bytes 846 us # eosio.token <= eosio.token::transfer {"from":"jack","to":"bob","quantity":"50 SYS","memo":""} # jack <= eosio.token::transfer {"from":"jack","to":"bob","quantity":"50 SYS","memo":""} # bob <= eosio.token::transfer {"from":"jack","to":"bob","quantity":"50 SYS","memo":""} warning: transaction executed locally, but may not be confirmed by the network yet liuwenbin@liuwenbin:~$ cleos get currency balance eosio.token alice 100 SYS liuwenbin@liuwenbin:~$ cleos get currency balance eosio.token jack 50 SYS liuwenbin@liuwenbin:~$ cleos get currency balance eosio.token bob 150 SYS该命令执行成功,是由jack@owner权限许可的该命令操作。
三. 描述问题,引出多签名