区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载导读在 EOSIO 区块链上权限链接permission link机制允许账户为某个智能合约的具体 action 单独指定一个最低授权权限从而把合约调用的鉴权从默认的active/owner权限中剥离出来。本文以 eos 仓库中的官方操作指南为基础讲解如何通过cleos set action permission命令配合关键字NULL解除unlink一个已链接的权限级别并深入仓库源码揭示该命令在cleos客户端、链上unlinkauth原生动作与authorization_manager校验逻辑中的完整执行链路。读完本文你将能独立完成为指定合约动作解除权限绑定、恢复默认授权行为的完整操作并理解解除操作的底层原理与失败场景。前置条件Before you begin在动手解除权限链接之前需要满足以下条件安装当前受支持的cleos版本cleos随 EOSIO 软件一同分发安装 EOSIO 即会同时安装cleos与keosd两个命令行工具安装指引见 docs/00_install/index.md。理解以下基础概念账户AccountEOSIO 上的身份实体所有权限与合约动作都挂载在账户之下权限级别Permission Level账户内部的授权层级最常用的是owner、active也可以自定义子权限如customp动作Action智能合约暴露的可调用操作例如转账合约的transfer动作。核心概念什么是解除权限链接EOSIO 的权限链接是一张动作 → 最低权限的映射表。当你执行cleos set action permission alice hodlcontract transfer customp -p aliceactive时链上实际产生的是一个eosio::linkauth动作其数据为{account:alice,code:hodlcontract,type:transfer,requirement:customp}含义是只有持有不低于customp权限的签名才被允许以账户alice的身份调用hodlcontract合约的transfer动作。解除权限链接就是把这张映射删除此后该动作不再有专门的最低权限要求恢复为 EOSIO 的默认行为——即由调用时使用的权限直接决定能否执行通常对应账户的active权限。与之对应的操作是建立权限链接完整的操作指南见 docs/02_cleos/02_how-to-guides/how-to-link-permission.md。链接与解除使用同一条命令区别仅在于最后一个位置参数是权限名还是NULL。命令总览与参数说明解除权限链接使用的命令是cleos set action permission完整命令格式如下cleos set action permission [OPTIONS] account code type requirement其中参数类型是否必填说明accountTEXT必填要设置/删除权限动作链接的账户codeTEXT必填拥有该动作代码的合约账户即合约部署所在的账户typeTEXT必填动作名称。注意权限必须按动作逐个设置requirementTEXT必填传入NULL表示删除链接传入权限名表示设置或更新该动作所需的最低权限常用选项选项说明-h, --help打印帮助信息并退出-x, --expiration设置交易过期时间秒默认 30 秒-p, --permission授权本次操作所用的账户与权限级别格式为accountpermission默认accountactive-j, --json以 JSON 格式打印结果-d, --dont-broadcast不广播交易到网络仅打印到 stdout--return-packed与--dont-broadcast配合使用输出打包后的交易-r, --ref-block设置用于 TAPOS 的参考区块号或区块 ID--max-cpu-usage-ms交易执行的 CPU 用量上限毫秒默认 0 表示不限制--max-net-usage交易的网络用量上限字节默认 0 表示不限制--delay-sec设置交易的延迟秒数默认 0 秒完整的官方命令参考文档见 docs/02_cleos/03_command-reference/set/set-action-permission.md。解除权限链接的标准步骤以下步骤演示如何解除账户alice对合约hodlcontract的transfer动作的权限链接cleos set action permission alice hodlcontract transfer NULL各参数含义alice 持有被解除权限链接的账户名hodlcontract 拥有该智能合约代码的合约账户名transfer 要解除链接的动作名NULL 删除该动作上已有的权限链接。如果不显式指定-p命令默认以aliceactive作为授权签名。更严谨的写法是显式声明授权权限cleos set action permission alice hodlcontract transfer NULL -p aliceactive该命令执行成功后会在终端打印类似如下的输出executed transaction: 50fe754760a1b8bd0e56f57570290a3f5daa509c090deb54c81a721ee7048201 120 bytes 242 us # eosio eosio::unlinkauth {account:alice,code:hodlcontract,type:transfer}可以看到链上实际执行的是eosio::unlinkauth原生动作载荷中只有account、code、type三个字段不再包含requirement字段——这正是解除链接与建立链接linkauth带requirement字段在链上数据层面的本质区别。解除链接后发生了什么解除成功后transfer动作不再受自定义最低权限的约束对合约动作的调用将回到默认授权流程若alice是普通用户账户调用时使用其active权限即可正常执行若alice是合约账户且该动作是合约自己发起的如内联动作则不再需要链接到eosio.code权限按常规授权处理。底层原理cleos 如何把NULL变成unlinkauthcleos set action permission的实现在 programs/cleos/main.cpp 中核心逻辑位于set_action_permission_subcommand结构体programs/cleos/main.cpp#L959-L988permissions-callback([this] { name account name(accountStr); name code name(codeStr); name type name(typeStr); bool is_delete boost::iequals(requirementStr, null); if (is_delete) { send_actions({create_unlinkauth(account, code, type)}, signing_keys_opt.get_keys()); } else { name requirement name(requirementStr); send_actions({create_linkauth(account, code, type, requirement)}, signing_keys_opt.get_keys()); } });这段代码揭示了几个关键细节NULL的判断是大小写不敏感的客户端使用boost::iequals(requirementStr, null)做忽略大小写的字符串比较因此NULL、null、Null均被识别为删除操作并据此构建unlinkauth动作NULL不允许作为权限名使用一旦命中删除分支requirement字符串就不会再被解析为name类型避免与真实权限名混淆构建动作由辅助函数完成create_unlinkauthprograms/cleos/main.cpp#L768-L771会构造一个chain::action其authorization取自get_account_permissions(tx_permission, {account, config::active_name})即默认使用目标账户的active权限作为本交易的授权声明。链上校验authorization_manager 如何验证解除操作unlinkauth动作在链上由系统合约eosio处理。在 eos 仓库中动作处理器通过宏注册于 libraries/chain/controller.cpp#L278-L279SET_APP_HANDLER( eosio, eosio, linkauth ); SET_APP_HANDLER( eosio, eosio, unlinkauth );对应的鉴权检查实现在 libraries/chain/authorization_manager.cpp 的check_unlinkauth_authorizationlibraries/chain/authorization_manager.cpp#L412-L424中void authorization_manager::check_unlinkauth_authorization( const unlinkauth unlink, const vectorpermission_level auths )const { EOS_ASSERT( auths.size() 1, irrelevant_auth_exception, unlink action should only have one declared authorization ); const auto auth auths[0]; EOS_ASSERT( auth.actor unlink.account, irrelevant_auth_exception, the owner of the linked permission needs to be the actor of the declared authorization ); const auto unlinked_permission_name lookup_linked_permission(unlink.account, unlink.code, unlink.type); EOS_ASSERT( unlinked_permission_name, transaction_exception, cannot unlink non-existent permission link of account ${account} for actions matching ${code}::${action}, ... ); }从中可以提炼出解除操作在链上必须满足的三条硬性规则只能有一个授权声明unlinkauth动作必须且只能带一个authorization授权者必须是链接归属账户授权声明的actor必须等于unlink.account即只有账户本人或其授权的子权限签名才能解除自己账户下的链接链接必须真实存在若该账户对该动作本就没有权限链接交易会被transaction_exception拒绝并报错cannot unlink non-existent permission link——这解释了为什么对从未链接过的动作重复执行NULL操作会失败而不是静默成功。此外同文件中的check_linkauth_authorizationlibraries/chain/authorization_manager.cpp#L375-L410还对建立链接设置了限制在fix_linkauth_restriction协议特性生效后不能对eosio系统合约的updateauth、deleteauth、linkauth、unlinkauth、canceldelay等敏感系统动作设置最低权限链接。这也意味着这些系统动作同样不应也不被允许被随意链接后再解除相关限制会直接影响你规划权限链接方案的边界。常见场景与注意事项解除后权限恢复默认解除链接只删除动作 → 最低权限的映射不会删除任何权限本身。若要删除自定义权限应使用cleos set account permission见 docs/02_cleos/03_command-reference/set/set-account-permission.md或cleos set account permission ... NULL的权限删除用法。对未链接的动作执行解除会失败正如链上校验规则所述cannot unlink non-existent permission link是正常防护不属于命令执行错误。区分解除链接与删除权限两者是不同层级的操作——前者只影响单个合约动作的鉴权映射后者影响账户的整个权限结构误删权限可能导致账户失去控制能力操作前应谨慎核对账户与权限名。大小写不敏感但建议规范书写客户端按忽略大小写的方式识别NULL社区与官方文档统一使用大写NULL以保持可读性。合约内联动作场景如果某合约动作此前被链接到eosio.code以便合约以自身身份发起内联动作解除链接后该内联调用将不再被该最低权限放行需改用其他授权方式如直接使用active。相关资源官方操作指南本文主题文档docs/02_cleos/02_how-to-guides/how-to-unlink-permission.md建立权限链接指南docs/02_cleos/02_how-to-guides/how-to-link-permission.md命令参考docs/02_cleos/03_command-reference/set/set-action-permission.mdcleos 客户端实现programs/cleos/main.cpp链上鉴权校验libraries/chain/authorization_manager.cpp动作处理器注册libraries/chain/controller.cpp赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐notebooklm-py 的 Web batchexecute RPC 参考混淆方法 ID、线格式 Payload 与 UI 选择器对照notebooklm py 的 Web batchexecute RPC 参考混淆方法 ID、线格式 Payload 与 UI 选择器对照 本文基于 docs区块链EOS 多签账户配置实战使用 cleos set account permission 构建多重签名权限EOS 多签账户配置实战使用 cleos set account permission 构建多重签名权限 导读 本指南讲解如何在 EOS 区块链上通过 cle区块链EOSIO 账户密钥更新实战使用 cleos 修改账户权限密钥EOSIO 账户密钥更新实战使用 cleos 修改账户权限密钥 本指南以 eos 仓库官方 How To 文档 how to update account k区块链创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考