EOSIO cleos set account permission 命令详解:账户权限的创建、更新与删除实战
区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载cleos set account permission是 EOSIO 链上账户权限管理的核心命令用于创建、更新或删除账户的自定义权限permission并通过--add-code/--remove-code开关管理智能合约执行内联操作所需的eosio.code权限。本文以官方命令参考文档为主体结合本仓库cleos客户端源码与链端原生合约实现完整讲解命令语法、全部选项、三种典型用法并深入剖析权限更新在链上的校验规则与 RAM 计费原理帮助你准确、安全地完成账户权限配置。命令概览cleos set account permission [OPTIONS] account permission [authority] [parent]account要设置权限的目标账户名必填。permission要设置/删除权限的名称必填。authority定义该权限的授权结构可以是公钥、JSON 字符串或 JSON 文件名删除权限时传NULL。parent该权限的父权限名称创建时默认为active。注意方括号[]内的参数和选项均为可选项。该命令的用途正如命令帮助信息所描述Set parameters dealing with account permissions即设置或更新区块链上的账户状态围绕账户权限展开操作对应源码 programs/cleos/main.cpp 中的set_account_permission_subcommand子命令实现。位置参数详解参数类型必填说明accountTEXT是要设置/删除权限授权的账户permissionTEXT是要设置/删除授权的权限名称authorityTEXT视情况[delete]传NULL[create/update]传公钥、JSON 字符串或定义授权结构的文件名[code]传合约名parentTEXT创建时该权限的父权限名默认active源码中对这四个位置参数的定义与命令文档完全一致programs/cleos/main.cpp。需要特别注意的是如果不配合--add-code/--remove-code使用authority参数是必须提供的否则 cleos 会直接报错退出对应断言位于 programs/cleos/main.cppEOSC_ASSERT( (add_code ^ remove_code) || !authority_json_or_file.empty(), ERROR: authority should be specified unless add or remove code permission );选项Options完整说明选项说明-h,--help打印帮助信息并退出--add-code向指定权限授权中添加eosio.code权限--remove-code从指定权限授权中移除eosio.code权限-x,--expiration设置交易过期时间秒默认 30 秒-f,--force-unique强制交易唯一会消耗额外带宽同时消除重复发送相同交易的保护-s,--skip-sign指定不使用解锁钱包中的密钥对交易签名-j,--json以 JSON 格式打印结果--json-fileTEXT将结果以 JSON 格式保存到文件-d,--dont-broadcast不将交易广播到网络仅打印到 stdout--return-packed与--dont-broadcast配合返回打包packed后的交易-r,--ref-blockTEXT设置用于 TAPOSTransaction as Proof-of-Stake的参考区块号或区块 ID-p,--permissionTEXT用于授权交易的账户与权限级别格式accountpermission默认accountactive--max-cpu-usage-msUINT交易执行 CPU 用量上限毫秒默认 0 表示无限制--max-net-usageUINT交易网络用量上限字节默认 0 表示无限制--delay-secUINT交易延迟秒数默认 0 秒其中--add-code与--remove-code为互斥选项同时指定会报错programs/cleos/main.cpp命令文档中的-p默认授权级别为accountactive与源码中add_standard_transaction_options(permissions, accountactive)的默认值一致programs/cleos/main.cpp。使用前提Requirements安装受支持的cleos版本cleos随 EOSIO 软件一同分发参见 EOSIO 安装指南安装后同时获得cleos与keosd命令行工具。可以访问一个 EOSIO 区块链节点。拥有 EOSIO 账户及该账户的私钥私钥存放在解锁的 keosd 钱包中用于交易签名。实战示例以下示例均可在连接本地或远程 nodeos 节点后直接执行。示例 1更新active权限的公钥cleos set account permission alice active EOS5zG7PsdtzQ9achTdRtXwHieL7yyigBFiJDRAQonqBsfKyL3XhC -p aliceowneralice要更新密钥的账户名。active要更新密钥的权限名。EOS5zG7PsdtzQ9achTdRtXwHieL7yyigBFiJDRAQonqBsfKyL3XhC新授权对应的公钥。-p aliceowner用于授权本次交易的权限级别。由于active的父权限是owner降低active权限必须使用比它更高的owner权限授权。执行成功后的输出示例executed transaction: ab5752ecb017f166d56e7f4203ea02631e58f06f2e0b67103b71874f608793e3 160 bytes 231 us # eosio eosio::updateauth {account:alice,permission:active,parent:owner,auth:{threshold:1,keys:[{key:E...从输出可以看到cleos实际向链上发送的是eosio::updateauth原生动作数据载荷中包含account、permission、parent与完整的auth结构。示例 2为合约账户的active权限添加eosio.codecleos set account permission alice active --add-code -p aliceactivealice要添加eosio.code的账户。active要添加eosio.code的权限。--add-code指示命令添加eosio.code。-p aliceactive用于授权交易的权限。eosio.code权限用于授权合约账户以自身名义发起内联动作inline action例如合约内部调用转账、投票等操作。执行后同样产生eosio::updateauth交易auth.accounts中将出现aliceeosio.code权限条目。示例 3为alice账户添加自定义权限cleos set account permission alice customp EOS58wmANoBtT7RdPgMRCGDb37tcCQswfwVpj6NzC55D247tTMU9D active -p aliceactivealice要添加自定义权限的账户。customp自定义权限的名称。EOS58wmANoBtT7RdPgMRCGDb37tcCQswfwVpj6NzC55D247tTMU9D自定义权限的公钥。active自定义权限的父权限。-p aliceactive用于授权交易的权限。执行成功后的输出示例executed transaction: 69c5297571ce3503edb9a1fd8a2f2a5cc1805ad19197a8751ca09093487c3cf8 160 bytes 134 us # eosio eosio::updateauth {account:alice,permission:customp,parent:active,auth:{threshold:1,keys:[{key:EOS...创建的自定义权限可通过cleos get account alice查看并可通过cleos set action permission即eosio::linkauth将其与具体合约动作绑定实现细粒度的操作授权。扩展用法使用 JSON 定义完整授权结构当权限需要多签、账户权重或延迟等待等复杂结构时可直接传入 JSON 字符串或 JSON 文件cleos set account permission alice active { threshold: 2, keys: [ {key: EOS5zG7PsdtzQ9achTdRtXwHieL7yyigBFiJDRAQonqBsfKyL3XhC, weight: 1}, {key: EOS58wmANoBtT7RdPgMRCGDb37tcCQswfwVpj6NzC55D247tTMU9D, weight: 1} ], accounts: [ {permission: {actor: bob, permission: active}, weight: 1} ], waits: [] } -p aliceowner上述授权结构表示阈值threshold为 2需要满足签名权重之和达到 2 才能通过授权。cleos 会通过parse_json_authority_or_key解析并校验该结构——若是公钥则直接构造单钥授权若是 JSON 则反序列化为authority并执行链上同款校验要求 keys/accounts/waits 有序、阈值有效且可满足校验失败会抛出Authority failed validation错误programs/cleos/main.cpp。扩展用法删除权限将authority传为NULL即可删除指定权限cleos set account permission alice customp NULL -p aliceactivecleos 检测到null后不再构造updateauth而是直接发送eosio::deleteauth原生动作programs/cleos/main.cpp。扩展用法移除eosio.codecleos set account permission alice active --remove-code -p aliceactive--remove-code会从现有授权中移除eosio.code条目若移除后授权结构变为空无 keys、无 accounts、无 waitscleos 会自动改为发送deleteauth删除整个权限programs/cleos/main.cpp。底层原理从 cleos 到链上执行的完整链路cleos 端的权限处理逻辑set_account_permission_subcommand的回调函数programs/cleos/main.cpp完整实现了以下流程互斥与参数校验--add-code与--remove-code不可同时使用非 code 模式下authority必须给出。删除分支authority为NULL时构造create_deleteauth动作。父权限自动推导未显式指定parent时cleos 会调用链上get_account查询该账户现有权限若目标权限已存在则沿用其原父权限若为新权限则默认activeprograms/cleos/main.cpp。code 模式处理--add-code/--remove-code会先获取现有权限的授权结构在auth.accounts中按序插入或删除{actor, eosio.code}条目新增条目的权重会被提升到与阈值threshold相等以保证该权限可单独满足授权programs/cleos/main.cpp。如果目标权限尚不存在--add-code会创建一个阈值为 1、仅含eosio.code的全新权限。发送交易最终通过create_updateauth构造eosio::updateauth动作见 programs/cleos/main.cpp打包发送默认授权级别为accountactive。链端 updateauth / deleteauth 的校验规则交易上链后由链端原生合约处理。apply_eosio_updateauthlibraries/chain/eosio_contract.cpp执行以下关键校验权限名不能为空且不能以eosio.开头该前缀为系统保留权限不能设置其自身为父权限active权限的父权限必须是owner且不可更改owner权限没有父权限其他所有权限必须指定非空父权限若授权中包含等待waits等待时长不得超过链配置的max_transaction_delay通过validate(auth)校验授权结构合法性并对涉及的 RAM 用量差异进行计费add_ram_usage。apply_eosio_deleteauthlibraries/chain/eosio_contract.cpp则要求不能删除active与owner权限若该权限仍被 linkauth 链接到某个动作必须先解除链接unlink才能删除否则抛出Cannot delete a linked authority异常删除后账户 RAM 得到退还负的add_ram_usage。授权校验Authorization Checkeosio::updateauth与eosio::deleteauth作为原生动作其授权检查由 libraries/chain/authorization_manager.cpp 中的check_updateauth_authorization/check_deleteauth_authorization完成动作只能声明一个授权且该授权的actor必须是受影响账户本身更新已存在的权限时用于授权的最低权限是该权限本身创建新权限时最低授权权限为父权限——这也是示例 1 中修改active必须用-p aliceowner的原因此外updateauth、deleteauth、linkauth、unlinkauth、canceldelay等原生动作不允许被链接link为某个自定义权限的最低权限libraries/chain/authorization_manager.cpp。常见错误与注意事项场景提示解决办法同时使用--add-code与--remove-codeERROR: Either --add-code or --remove-code can be set二者只能选其一非 code 模式省略authorityERROR: authority should be specified unless add or remove code permission补充公钥或 JSON 授权删除active/owner权限Cannot delete active authority/Cannot delete owner authority这两个内建权限不可删除删除仍被链接的权限Cannot delete a linked authority...先用cleos set action permission ... NULL解除链接修改active却用active授权updateauth action declares irrelevant authority...使用-p accountowner权限名以eosio.开头Permission names that start with eosio. are reserved更换权限命名此外authority参数支持传文件名文件内容为 JSON 授权结构便于将复杂授权配置化、版本化管理配合-d --dont-broadcast可以先在本地预览待广播的交易而不上链。延伸阅读cleos set 命令总览set子命令code、abi、contract、account、action的完整入口。set action permissionlinkauth创建自定义权限后如何将其与合约动作绑定。cleos set contract部署合约时配合eosio.code权限实现合约间内联调用。EOSIO 安装指南获取cleos、keosd及 nodeos 环境。账户与权限协议文档了解owner、active与自定义权限的层次模型与授权判定规则。赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐EOS 多签账户配置实战使用 cleos set account permission 构建多重签名权限EOS 多签账户配置实战使用 cleos set account permission 构建多重签名权限 导读 本指南讲解如何在 EOS 区块链上通过 cle区块链EOSIO cleos set abi 命令完全指南账户 ABI 的创建、更新与底层原理EOSIO cleos set abi 命令完全指南账户 ABI 的创建、更新与底层原理 cleos set abi 是 EOSIO 智能合约平台中用于在链上区块链EOSIO cleos 解除权限链接实战用 set action permission ... NULL 移除动作的权限绑定unlinkauthEOSIO cleos 解除权限链接实战用 set action permission ... NULL 移除动作的权限绑定unlinkauth 导读 在区块链上一篇WVP-PRO视频监控平台构建企业级国标GB28181监控系统的技术实践下一篇MMCV安装真的那么难吗三大挑战的完美解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考