ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EOSIO cleos 权限链接(linkauth)完全指南:如何将自定义权限绑定到智能合约 Action

EOSIO cleos 权限链接(linkauth)完全指南:如何将自定义权限绑定到智能合约 Action 区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载导读本文基于 EOSIO 开源仓库中的官方指南 how-to-link-permission.md系统讲解如何通过cleos set action permission命令将账户中的自定义权限链接link到某个智能合约的指定 Action 上从而为该 Action 指定最小授权权限。文中既包含完整可复现的命令操作也结合本仓库源码eosio::linkauth/eosio::unlinkauth原生 Action 的实现、authorization_manager的最小权限检查逻辑、单元测试用例深入剖析权限链接的底层原理帮助你从会敲命令进阶到懂机制。什么是权限链接Link PermissionEOSIO 的账户权限体系基于权限 授权模型一个账户可以拥有多个权限如系统默认的owner、active每个权限由一组权重化的密钥或子权限构成。默认情况下调用某个合约 Action 时只要该 Action 声明的授权authorization中带有账户的active权限或其子权限即可通过检查。权限链接做的事情是把某个账户对某个合约的某个 Action单独指定一个最低要求权限minimum required permission。一旦链接建立调用该 Action 时声明的权限必须满足这个被链接的权限否则会被拒绝。例如本指南的示例场景把alice账户的自定义权限customp链接到部署在scontract账户上的hiAction。之后使用aliceactivecustomp的父权限签名可以调用hi使用alicecustomp签名也可以调用hi使用alice账户下其他不满足customp的权限如另一个平级自定义权限签名则会被拒绝。开始之前Before You Begin在执行权限链接前请确认满足以下条件安装受支持的cleos版本。cleos随 EOSIO 软件一同分发参考 安装 EOSIO 会同时安装cleos与keosd命令行工具。拥有一个 EOSIO 账户并能访问该账户active权限对应的私钥用于签名链接交易。已创建好自定义权限。若尚未创建可参考 cleos set account permission 命令文档或直接使用下方命令创建一个名为customp的自定义权限父权限为activecleos set account permission alice customp EOS58wmANoBtT7RdPgMRCGDb37tcCQswfwVpj6NzC55D247tTMU9D active -p aliceactive参数含义alice要添加自定义权限的账户名customp自定义权限的名称EOS58wmANoBtT7RdPgMRCGDb37tcCQswfwVpj6NzC55D247tTMU9D该权限对应的公钥activecustomp的父权限缺省即active-p aliceactive用于授权该交易的权限级别。成功后会看到链上日志输出eosio eosio::updateauth说明执行的是updateauth原生 Action。命令参考cleos set action permission权限链接使用的核心命令是cleos set action permission其完整用法如下cleos set action permission [OPTIONS] account code type requirement位置参数Positionals参数是否必填说明accountREQUIRED要设置/删除权限链接的账户名codeREQUIRED拥有该 Action 代码的合约账户名typeREQUIREDAction 名称注意权限必须逐个 Action 设置requirementREQUIRED删除链接时填NULL设置/更新时填执行该 Action 所要求的最低权限名常用选项Options-h,--help打印帮助信息并退出-x,--expiration交易过期时间秒默认 30s-f,--force-unique强制交易唯一会消耗额外带宽-s,--skip-sign指定是否使用已解锁钱包中的密钥签名-j,--json以 JSON 格式打印结果--json-file TEXT将 JSON 结果保存到文件-d,--dont-broadcast不广播交易到网络仅打印到 stdout--return-packed与--dont-broadcast配合输出打包后的交易-r,--ref-block TEXT用于 TAPOSTransaction as Proof-of-Stake的引用区块号或区块 ID-p,--permission TEXT用于授权的账户与权限级别格式为accountpermission默认accountactive--max-cpu-usage-ms UINT交易执行的 CPU 使用上限毫秒默认 0 表示无限制--max-net-usage UINT交易的网络使用上限字节默认 0 表示无限制--delay-sec UINT交易的延迟秒数默认 0s。链接权限操作步骤Link Procedure假设alice账户已拥有自定义权限custompscontract账户已部署包含hiAction 的智能合约部署方法可参考 如何部署智能合约。现在将alicecustomp链接到scontract的hiActioncleos set action permission alice scontract hi customp -p aliceactive参数逐项说明参数含义alice拥有待链接权限的账户名scontract拥有该智能合约代码的账户名hi要链接到权限的 Action 名称customp用于授权调用该 Action 的权限名-p aliceactive用于授权本次链接操作本身的权限链接操作需要alice的授权预期输出executed transaction: 4eb4cf3aea232d46e0e949bc273c3f0575be5bdba7b61851ab51d927cf74a838 128 bytes 141 us # eosio eosio::linkauth {account:alice,code:scontract,type:hi,requirement:customp}注意输出中的关键信息这笔交易最终在链上执行的是eosio::linkauth原生 Action其参数结构为{account:alice,code:scontract,type:hi,requirement:customp}——这四元组与命令行的四个位置参数一一对应。链接成功后aliceactive作为customp的父权限与alicecustomp均有权调用scontract::hi。一次为多个 Action 设置权限权限链接是按 Action 逐一设置的。若scontract上还有byeAction需要为它单独链接另一个权限cleos set action permission bob scontract1 bye customp2 -p bobactive其预期输出为executed transaction: 4eb4cf3aea232d46e0e949bc273c3f0575be5bdba7b61851ab51d927cf74a838 128 bytes 141 us # eosio eosio::linkauth {account:bob,code:scontract1,type:bye,requirement:customp2}更新已有链接对同一(account, code, type)三元组再次执行set action permission并指定不同的requirement即可将旧的链接要求更新为新的权限。从源码看apply_eosio_linkauth在发现已存在同名链接时会直接修改permission_link_object.required_permission字段而不会先删除再重建见 eosio_contract.cpp若新要求与旧要求完全相同则会被拒绝抛出action_validate_exceptionAttempting to update required authority, but new requirement is same as old。移除权限链接Unlink若不再需要某个链接将requirement参数置为NULL即可解除cleos set action permission bob scontract1 hi NULL -p bobactive参数含义bob要解除链接的账户名scontract1合约账户名hi要解除链接的 Action 名NULL表示删除该链接-p bobactive授权本次操作的权限。预期输出executed transaction: 50fe754760a1b8bd0e56f57570290a3f5daa509c090deb54c81a721ee7048201 120 bytes 242 us # eosio eosio::unlinkauth {account:bob,code:scontract1,type:hi}此时链上执行的是eosio::unlinkauth原生 Action参数只有三元组(account, code, type)。cleos 如何区分设置与删除在 programs/cleos/main.cpp 中set_action_permission_subcommand的回调逻辑是将requirement字符串做大小写不敏感的比较boost::iequals(requirementStr, null)若等于null则构造unlinkauth交易否则构造linkauth交易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大小写不敏感作为占位符。源码级原理解析1. linkauth / unlinkauth 是系统原生 Action权限链接并不是智能合约自定义逻辑而是 EOSIO 系统级原生 Action。其数据结构定义在 contract_types.hppstruct linkauth { account_name account; // 拥有权限的账户 account_name code; // 合约账户 action_name type; // Action 名 permission_name requirement; // 最低要求权限 static account_name get_account() { return config::system_account_name; } // eosio static action_name get_name() { return linkauth_n; } }; struct unlinkauth { account_name account; account_name code; action_name type; static action_name get_name() { return unlinkauth_n; } };两者都归属于eosio系统账户这也解释了为什么交易日志中显示eosio eosio::linkauth。2. 链接的存储与校验链上执行入口是 eosio_contract.cpp 中的apply_eosio_linkauth与apply_eosio_unlinkauthapply_eosio_linkauth依次执行要求requirement非空、要求交易声明了alice的授权、校验alice与scontract账户均存在、若requirement不是eosio.any则校验该权限确实存在于账户上激活only_link_to_existing_permission协议特性后按(account, permission)精确查找随后以(account, code, type)为键查找permission_link_object存在则更新、不存在则新建并按permission_link_object的可计费大小向alice账户收取 RAMcontext.add_ram_usage。apply_eosio_unlinkauth则以同样的三元组键删除permission_link_object并退还相应 RAM负的billable_size_vpermission_link_object。也就是说每建立一条权限链接都会占用账户少量 RAM删除链接会释放 RAM这是做权限链接规划时需要留意的资源成本。3. 执行 Action 时的最小权限检查权限链接发挥作用的地方在 authorization_manager.cpp 的lookup_linked_permission与lookup_minimum_permission先按(authorizer_account, scope, act_name)精确查找该 Action 的链接若没有精确链接则回退查找合约级默认链接——即typeAction 名为空的链接源码中通过boost::get2(key) {}实现若仍没有找到链接则默认最低权限为active若链接到eosio.any则返回空值表示不设最低权限限制。随后在交易校验循环中authorization_manager.cpp对每个声明的授权declared_auth取出其最小权限min_permission并断言声明的权限满足satisfies该最小权限否则抛出irrelevant_auth_exceptionEOS_ASSERT( get_permission(declared_auth).satisfies( min_permission, ... ), irrelevant_auth_exception, action declares irrelevant authority ${auth}; minimum authority is ${min}, ...);satisfies会沿权限树向上检查由于customp的父权限是active所以aliceactive天然满足最低权限为customp的链接而aliceowner由于是更上层权限同样可以满足。4. 通配符与 eosio.any从本仓库 config.hpp 可以看到两个特殊权限名const static name eosio_any_name { eosio.any_n }; const static name eosio_code_name { eosio.code_n };合约级默认链接通配符将type留空命令行传空串可链接该合约下所有 Action 的默认权限eosio.any将requirement设为eosio.any表示任何权限均可调用即取消最低权限限制。apply_eosio_linkauth中对eosio.any跳过权限存在性校验eosio_contract.cpplookup_minimum_permission对eosio.any返回空值authorization_manager.cpp。5. 不能链接的 Action出于安全考虑系统原生权限管理 Actioneosio::updateauth、eosio::deleteauth、eosio::linkauth、eosio::unlinkauth、eosio::canceldelay不能被链接到最低权限。这一限制实现在check_linkauth_authorization中authorization_manager.cpplookup_minimum_permission也会对这类调用直接断言拒绝authorization_manager.cpp。此外check_linkauth_authorization还要求链接操作只能由被链接权限的属主账户自己声明授权auth.actor link.account且声明授权的权限必须满足已链接的最低权限authorization_manager.cpp。测试用例佐证仓库中的单元测试完整验证了上述行为可作为学习参考unittests/auth_tests.cpp演示完整流程——alice创建spending权限后未链接前用alicespending调用eosio::reqauth失败执行link_authority(alice, eosio, spending, reqauth)后成功重复链接同一权限抛出action_validate_exceptionunlink_authority解除后再调用又恢复失败。该用例还验证了权限树继承scud的父权限spending也满足链接与合约级默认链接第三个参数为空表示链接该合约所有 Action。unittests/auth_tests.cpp验证链接后更新权限公钥旧密钥立即失效、新密钥生效说明链接记录的是权限名而非具体密钥。unittests/abi_tests.cpp验证linkauth/unlinkauth结构的 ABI 序列化与反序列化往返一致性。常见问题与注意事项为什么用active签名可以调用已链接到customp的 Action因为权限链接设定的是最低要求权限customp的父权限乃至更上层权限天然满足子权限的授权要求这是由satisfies的权限树递归判断保证的。链接会消耗 RAM 吗会。每条(account, code, type)链接都会以permission_link_object的计费大小向账户收取 RAM删除时退还。批量链接大量 Action 前请关注账户 RAM 余额。NULL必须大写吗不需要。cleos 内部对requirement做大小写不敏感匹配null、Null均会被识别为删除操作。无法链接系统原生权限 Action。对updateauth等五个系统 Action 设置链接会被链上校验拒绝。-p选项的权限必须够格。链接操作本身要求由被链接账户授权且该授权权限必须满足当前已存在的最低权限要求否则抛出irrelevant_auth_exception。总结通过cleos set action permission将自定义权限链接到智能合约 Action是 EOSIO 精细权限治理的核心手段之一它把哪个账户的哪个权限可以调用哪个合约的哪个 Action以链上状态permission_link_object的形式固化下来并在交易执行时由authorization_manager强制执行最小权限检查。掌握链接linkauth、更新、删除NULL / unlinkauth与eosio.any、合约级通配符等进阶用法后你可以为多签名、子权限、委托调用等复杂场景设计出安全、可审计的授权体系。赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐EOSIO cleos 解除权限链接实战用 set action permission ... NULL 移除动作的权限绑定unlinkauthEOSIO cleos 解除权限链接实战用 set action permission ... NULL 移除动作的权限绑定unlinkauth 导读 在区块链ONNX Runtime NuGet 包体系解析Managed 与 Native 双包架构、打包参数与生成验证流水线ONNX Runtime NuGet 包体系解析Managed 与 Native 双包架构、打包参数与生成验证流水线 本文以 ONNX Runtime 仓库中区块链CANN / pypto Tensor构造函数pypto.Tensor构造函数 产品支持情况 | 产品 | 是否支持 | |: |: :| | Atlas A3 训练系列产品/Atlas A3 推理系列产品人工智能编译器模型编译深度学习高性能计算CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表