EOSIO cleos get servants 命令详解:查询账户控制关系与受控账户

发布时间:2026/9/24 10:45:57

EOSIO cleos get servants 命令详解:查询账户控制关系与受控账户 区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载导读cleos get servants是 EOSIO 智能合约平台中用于查询给定账户所控制的所有账户servants即仆人账户的命令行工具。它通过调用节点上的 history_plugin 提供的get_controlled_accounts接口反向解析账户权限体系中控制账户 → 受控账户的授权关系是开发者审计账户权限结构、排查权限委托链、管理多签账户体系时的高频排查命令。阅读本文后你将掌握该命令的完整用法、JSON 返回结构、底层数据索引原理以及它与其他cleos get系列命令如cleos get accounts的本质区别。一、命令概览cleos get servants的语义是Retrieve accounts which are servants of a given account检索指定账户所控制的仆人账户。cleos get servants不带参数直接运行时命令会输出使用帮助Usage: cleos get servants account Positionals: account TEXT The name of the controlling account参数类型必填说明accountTEXT是控制账户controlling account的名称即要查询它控制了哪些账户的账户名该命令只接受一个位置参数account且为必填项若缺失CLI 框架会直接打印上述 Usage 并退出。二、典型用法与输出解析2.1 查询命令以查询账户inita所控制的账户为例cleos get servants inita2.2 返回结果命令执行成功后输出如下 JSON{ controlled_accounts: [ tester ] }返回结构只有一个核心字段controlled_accounts由受控账户名组成的数组。上述输出表示tester是inita的受控账户即inita在tester的权限结构中扮演了授权角色。2.3 空结果场景如果指定账户没有控制任何其他账户则返回空数组{ controlled_accounts: [] }这在权限审计中同样是有价值的信息表明该账户当前未作为任何其他账户权限的授权方。三、命令背后的调用链从 CLI 到插件cleos get servants并非直接查询链上状态数据库的通用查询而是依赖 history_plugin 的只读 API实现的。完整调用链如下3.1 CLI 侧定义在 programs/cleos/main.cpp 中get子命令组注册了servants子命令// get servants string controllingAccount; auto getServants get-add_subcommand(servants, localized(Retrieve accounts which are servants of a given account )); getServants-add_option(account, controllingAccount, localized(The name of the controlling account))-required(); getServants-callback([] { auto arg fc::mutable_variant_object( controlling_account, controllingAccount); std::cout fc::json::to_pretty_string(call(get_controlled_accounts_func, arg)) std::endl; });可以看到cleos get servants把位置参数account包装成controlling_account字段并通过get_controlled_accounts_func对应的 HTTP 端点发起请求最终以格式化 JSONfc::json::to_pretty_string打印结果。3.2 HTTP 端点在 programs/cleos/httpc.hpp 中定义了该端点const string history_func_base /v1/history; const string get_controlled_accounts_func history_func_base /get_controlled_accounts;即实际调用的是节点 RPC 接口POST /v1/history/get_controlled_accounts注意路径前缀是history而非chain请求体为{controlling_account: 账户名}。3.3 插件侧实现该 RPC 由 history_plugin 暴露。在 plugins/history_plugin/history_plugin.cpp 中read_only::get_controlled_accounts_results read_only::get_controlled_accounts(const get_controlled_accounts_params params) const { std::setaccount_name accounts; const auto db history-chain_plug-chain().db(); const auto account_control_idx db.get_indexaccount_control_history_multi_index, by_controlling(); auto range account_control_idx.equal_range( params.controlling_account ); for (auto obj range.first; obj ! range.second; obj) accounts.insert(obj-controlled_account); return {vectoraccount_name(accounts.begin(), accounts.end())}; }实现逻辑很清晰通过history-chain_plug-chain().db()访问节点内存中的 chainbase 状态数据库取出account_control_history_multi_index索引并以by_controlling作为查询键equal_range找出所有controlling_account params.controlling_account的记录收集每条记录的controlled_account字段到std::set自动去重、排序返回controlled_accounts数组。参数与结果的数据结构定义在 plugins/history_plugin/include/eosio/history_plugin/history_plugin.hppstruct get_controlled_accounts_params { chain::account_name controlling_account; }; struct get_controlled_accounts_results { vectorchain::account_name controlled_accounts; }; get_controlled_accounts_results get_controlled_accounts(const get_controlled_accounts_params params) const;RPC 路由注册位于 plugins/history_api_plugin/history_api_plugin.cppCHAIN_RO_CALL(get_controlled_accounts, http_params_types::params_required)其中params_required表明该接口强制要求请求体包含参数这也与测试中空参数返回错误码 3200006 的行为一致见下文第四节。四、底层数据account_control_history 索引如何构建4.1 索引对象结构get_controlled_accounts查询的索引由 plugins/history_plugin/include/eosio/history_plugin/account_control_history_object.hpp 定义每个索引对象包含三个字段字段类型含义controlled_accountaccount_name受控账户仆人账户controlled_permissionpermission_name受控账户中被授权的权限名如 owner/activecontrolling_accountaccount_name控制账户授权方该索引在by_controlling维度上以(controlling_account, id)构成复合唯一键保证按控制账户的高效范围查询同时by_controlled_authority以(controlled_account, controlled_permission, controlling_account)支持反向查询。4.2 索引数据从何而来这些记录并非链上共识状态而是history_plugin 在监听到特定系统动作时增量构建的历史索引。在 plugins/history_plugin/history_plugin.cpp 的on_system_action中if( at.act.name newaccount_n ) { const auto create at.act.data_aschain::newaccount(); add(db, create.owner.keys, create.name, owner_n); add(db, create.owner.accounts, create.name, owner_n); add(db, create.active.keys, create.name, active_n); add(db, create.active.accounts, create.name, active_n); } else if( at.act.name updateauth_n ) { const auto update at.act.data_aschain::updateauth(); ... }具体写入逻辑在add()方法history_plugin.cppstatic void add(chainbase::database db, const vectorpermission_level_weight controlling_accounts, const account_name account_name, const permission_name permission) { for (auto controlling_account : controlling_accounts ) { db.createaccount_control_history_object( { obj.controlled_account account_name; obj.controlled_permission permission; obj.controlling_account controlling_account.permission.actor; }); } }也就是说当发生newaccount创建账户动作时新账户 owner/active 权限中accounts字段即由其他账户作为权限权重的每个授权账户都会被记录为控制账户当发生updateauth更新权限动作时权限变更涉及的账户控制关系会同步更新对应 history_plugin.cpp 中的removeaccount_control_history_multi_index, by_controlled_authority(...)删除逻辑。因此可以得出关键结论cleos get servants反映的是由其他账户而非公钥参与授权形成的账户控制关系典型场景是账户 A 将自己的某个权限交由账户 B 参与多签或使用eosio newaccount的--account选项为账户指定账户级授权方。这与按公钥反查账户的cleos get accounts命令形成互补前者查账户间的授权控制后者查密钥与账户的关联。五、测试验证与常见问题5.1 仓库内自动化测试tests/plugin_http_api_test.py 对底层get_controlled_accountsHTTP 接口进行了完整验证# get_controlled_accounts with empty parameter default_cmd cmd_base get_controlled_accounts ret_json Utils.runCmdReturnJson(default_cmd) self.assertEqual(ret_json[code], 400) self.assertEqual(ret_json[error][code], 3200006) # get_controlled_accounts with empty content parameter ... # get_controlled_accounts with invalid parameter ... # get_controlled_accounts with valid parameter valid_cmd default_cmd self.http_post_str ({\controlling_account\:\test\}) ret_json Utils.runCmdReturnJson(valid_cmd) self.assertIn(controlled_accounts, ret_json)测试覆盖了四种场景空参数HTTP 400错误码 3200006缺失必需参数空内容请求体同样返回 400/3200006非法参数同样返回 400/3200006合法参数返回 JSON 中必须包含controlled_accounts字段。此外tests/Node.py 中测试框架解析节点信息时也使用servantstrans[controlled_accounts]读取该字段说明该结构被测试基础设施广泛依赖。5.2 常见问题排查现象原因处理建议命令报错Error 3200006: Invalid http request未提供account参数补全参数如cleos get servants inita返回 404 / 接口不存在节点未启用 history_plugin在 nodeos 启动参数中加入--plugin eosio::history_plugin与--plugin eosio::history_api_plugin并重启节点注意该插件需要从创世块或足够早的高度开始同步才能拥有完整历史索引返回controlled_accounts为空该账户确实没有账户级受控关系或节点历史数据不完整结合cleos get accounts 公钥交叉验证权限归属查询结果与链上权限不符索引由 history_plugin 增量维护非链上共识数据确认节点已追上最新高度且插件过滤配置filter-on/filter-out未屏蔽newaccount/updateauth动作六、与其他 get 系列命令的联动cleos get servants属于cleos get命令族通常与以下命令组合使用以完成完整的权限审计cleos get account 账户名查看账户本身的权限结构owner/active 权限及其权重cleos get accounts 公钥反查哪些账户的权限中包含指定公钥cleos get servants 账户名反查哪些账户的权限中包含指定账户本文主角。三者配合可以从账户 → 权限结构 → 公钥 → 账户多个方向交叉验证整个授权网络例如排查某个多签账户的所有实际控制者、确认某个账户是否被其他账户接管等。可参考 cleos get 命令参考目录 了解命令族全貌其底层 API 背景可查阅 history_api_plugin 文档。七、小结cleos get servants虽是一个参数极简的查询命令其背后却串起了 EOSIO 完整的账户权限 → 历史索引 → RPC → CLI链路概念上它回答指定账户控制了哪些账户这一问题是账户级授权关系而非公钥级的反向查询实现上它由 history_plugin 通过监听newaccount、updateauth系统动作增量维护account_control_history索引再经/v1/history/get_controlled_accounts暴露使用上只需一个account位置参数即可获得结构化的controlled_accountsJSON 结果适合在脚本化审计与测试框架中直接消费。理解其底层索引构建机制后也能解释为什么新部署的节点查询结果可能为空——因为该数据依赖 history_plugin 自部署以来的持续记录而非从链上状态直接还原这在实际运维排查中是必须注意的前提条件。赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐EOSIO cleos get accounts 命令详解按公钥查询关联账户EOSIO cleos get accounts 命令详解按公钥查询关联账户 导读 cleos get accounts 是 EOSIO 命令行客户端 cle区块链EOSIO cleos get currency balance 命令详解查询账户代币余额的完整指南EOSIO cleos get currency balance 命令详解查询账户代币余额的完整指南 导读 cleos get currency balanc区块链EOSIO cleos system listbw 命令详解查询账户委托带宽Delegated BandwidthEOSIO cleos system listbw 命令详解查询账户委托带宽Delegated Bandwidth 导读 cleos system lis区块链创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/24 10:45:57

《现代数字信号处理》全套PPT课件2026(中国矿业大学)

《现代数字信号处理》全套PPT课件2026(中国矿业大学) 课件内容: 第0章绪论.ppt 第1章离散时间信号与系统的时域分析.ppt 第2章离散时间信号与系统的频域分析.ppt 第3章 离散傅里叶变换.ppt 第4章快速傅里叶变换.ppt 第5章IR数字滤波器的设计.…

2026/9/24 10:45:57

PCB拼板Mark点设计指南:Allegro手动添加与SMT识别避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 10:45:57

I2C 驱动开发与原理剖析

I2C 总线是嵌入式低速外设通信的核心总线,凭借极简的双线架构、支持多从机挂载的特性,被广泛应用于传感器、OLED 显示屏、EEPROM 等外设设备的数据交互场景。相较于软件模拟 I2C,硬件 I2C 由片上外设硬件自动生成标准通信时序,无需…

2026/9/24 11:36:01

深度学习与知识图谱协同建模实战:波士顿房价预测新范式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 11:36:01

别再问显卡支不支持Vulkan:GPU-Z与双显卡排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 11:36:01

RK3588+RK1820嵌入式AI大模型实战:模型选型与RKNN部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码