EOS(eos)节点操作指南:使用 cleos system undelegatebw 解除 NET 网络带宽质押(Unstake)
2026/9/23 13:03:03 网站建设 项目流程
  • 区块链

【免费下载链接】eos

An open source smart contract platform

项目地址:https://gitcode.com/gh_mirrors/eo/eos
点击查看免费下载

cleos system undelegatebw是 EOS(eos)区块链中用于解除 NET 与 CPU 带宽质押的核心命令。本篇指南聚焦于"如何从自己的账户中解除(赎回)NET 网络带宽质押",完整覆盖命令语法、全部参数与选项、实操步骤与交易输出解读,并结合仓库中cleos客户端源码与eosio.system系统合约测试代码,从底层调用链说明该命令如何将用户指令转换为链上eosio::undelegatebw动作。读完本文,你将能够安全、正确地通过命令行管理自己账户的 NET 带宽资源。

背景:NET 带宽与质押机制

在 EOS(eos)的链上资源模型中,账户使用网络带宽(NET,network bandwidth)需要先质押(stake)系统通证(如 SYS、EOS)。质押所得的资源不仅用于支付交易字节占用,还决定了账户可发出的交易体量。当业务高峰期过去、或你希望收回质押的通证用于其他用途时,就需要"解除质押"(unstake / undelegate)。

需要特别强调的事实(来自 how-to-unstake-NET.md 原文):

只有最初执行委托(delegate)的账户,才有权解除该笔委托。

也就是说,如果账户bob把 NET 带宽委托给了alice,那么只有bob能够发起undelegatebw收回这部分资源;alice无法自行解除bob的委托。这一约束由系统合约的权限校验保证,也是理解整个命令语义的关键前提。

开始之前:前置条件

执行解除质押操作前,请确认以下三点均已满足(对应原文档 "Before you begin" 部分):

  1. 安装当前受支持的cleos版本cleos是 EOS(eos)仓库提供的命令行客户端,源码位于 programs/cleos,构建后即可使用。
  2. 部署并启用参考系统合约:解除质押实际由链上eosio账户执行的undelegatebw动作完成,因此必须确保eosio.contracts仓库中的参考系统合约已部署到链上,用于管理系统资源。本仓库的单元测试目录中保留了该系统合约的 ABI 产物,见 unittests/contracts/eosio.system/eosio.system.abi。
  3. 理解以下基础概念
    • 什么是账户(account)
    • 什么是网络带宽(network bandwidth)
    • 什么是 CPU 带宽(CPU bandwidth)

核心步骤:解除 0.01 SYS 的 NET 带宽质押

原文档给出的目标场景是:从账户alice的质押中解除 0.01 SYS 的网络带宽(NET),CPU 带宽部分为 0,命令如下:

cleos system undelegatebw alice alice "0 SYS" "0.01 SYS"

命令执行后,终端输出与下面类似(注意输出中展示了动作名、动作参数摘要以及"交易仅在本地执行"的警告):

executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606 184 bytes 452 us # eosio <= eosio::undelegatebw {"from":"alice","receiver":"alice","unstake_net_quantity":"0.01 EOS","unstake_cpu_qu... warning: transaction executed locally, but may not be confirmed by the network yet ]

对输出逐字段解读:

  • executed transaction: <txid>:交易哈希,可用于在链上浏览器或cleos get transaction中追踪该笔交易;
  • 184 bytes 452 us:交易原始字节大小与本地执行耗时;
  • eosio <= eosio::undelegatebw {...}:该笔交易由eosio系统账户接收(<=左侧为收件方),执行了undelegatebw动作,右侧 JSON 即动作参数(fromreceiverunstake_net_quantityunstake_cpu_quantity);
  • warning: transaction executed locally, but may not be confirmed by the network yet:标准提醒,表明交易已广播,但还需等待区块生产者打包确认后才最终生效,并非错误信息。

命令全解:参数与选项

cleos system undelegatebw的完整定义见命令参考文档 system-undelegatebw.md,其源码注册位于 programs/cleos/main.cpp。

位置参数(全部必填)

参数类型说明
fromTEXT解除带宽的账户(发起解除质押的账户,必须是原始委托方)
receiverTEXT被收回带宽的账户(当初带宽被委托给的账户)
unstake_net_quantityTEXT要解除的网络(NET)带宽通证数量,如"0.01 SYS"
unstake_cpu_quantityTEXT要解除的 CPU 带宽通证数量,如"0 SYS"

需要注意:两个数量参数必须携带符号(token symbol)并以字符串形式传入,cleos内部会通过to_asset()将其解析为资产类型(见下文源码剖析)。若要只解除 NET 带宽,CPU 数量填"0 SYS"即可;反之,若要只解除 CPU 带宽,可参考 how-to-unstake-CPU.md 中的命令:

cleos system undelegatebw alice alice "0.01 SYS" "0 SYS"

常用选项

选项说明
-h, --help打印帮助信息并退出
-p, --permission TEXT指定授权账户与权限级别,格式account@permission,默认account@active
-x, --expiration TEXT交易过期时间(秒),默认 30 秒
-d, --dont-broadcast不向网络广播交易,仅打印到标准输出(用于离线预检)
-s, --skip-sign跳过使用钱包解锁密钥签名(配合-d可用于仅构造交易)
-f, --force-unique强制交易唯一,会消耗额外带宽并移除重复交易保护
-r, --ref-block TEXT指定 TAPOS(Transaction as Proof-of-Stake)参考区块号或区块 ID
--max-cpu-usage-ms UINT交易执行 CPU 预算上限(毫秒),默认 0 表示不限制
--max-net-usage UINT交易净用量预算上限(字节),默认 0 表示不限制
--delay-sec UINT延迟交易秒数,默认 0 秒(配合多签场景使用)
-j, --json以 JSON 格式打印结果

system undelegatebw(收回他人委托)的区别

仓库中另有 how-to-undelegate-NET.md,其目标是"为账户或应用解除(Undelegate)资源",典型命令为:

cleos system undelegatebw bob alice "0 SYS" "0.01 SYS"

from=bob(原始委托方)、receiver=alice(当初的接收方),把bob委托给alice的 NET 带宽收回。两条命令底层动作完全相同(都是undelegatebw),区别仅在于语义场景:本文的 "unstake" 聚焦于自己账户的资源赎回fromreceiver通常相同(如alice alice);而 "undelegate" 聚焦于收回委托给他人的资源fromreceiver通常不同。

源码剖析:cleos 如何构造这笔交易

从源码结构看,cleos system undelegatebwundelegate_bandwidth_subcommand结构体注册实现(programs/cleos/main.cpp),其关键流程为:

  1. 注册子命令:通过actionRoot->add_subcommand("undelegatebw", localized("Undelegate bandwidth"))注册undelegatebw子命令;

  2. 声明四个必填位置参数fromreceiverunstake_net_quantityunstake_cpu_quantity,并分别调用->required()强制必填;

  3. 附加标准交易选项:调用add_standard_transaction_options_plus_signing(undelegate_bandwidth, "from@active"),默认以from@active权限签署交易,这也是上表中-p/--permission选项默认值的来源;

  4. 构造动作负载:在回调函数中构建fc::mutable_variant_object,将两个数量参数经to_asset()转换为资产类型后,组装为:

    from、receiver、unstake_net_quantity、unstake_cpu_quantity
  5. 发送动作:通过create_action(accountPermissions, config::system_account_name, "undelegatebw"_n, act_payload)生成动作(接收方为系统账户eosio),最终由send_actions签名并广播。

也就是说,一条cleos system undelegatebw命令最终在链上等价于:由from账户以from@active权限向eosio系统合约发送一次undelegatebw动作,动作参数与命令的四个位置参数一一对应。

系统合约侧与测试验证

undelegatebw动作的实际资源回收逻辑由部署在eosio账户的系统合约执行。本仓库虽不包含系统合约的 C++ 源码,但可通过以下证据确认其接口约定:

  • 系统合约 ABI 中声明了undelegatebw动作(见 unittests/contracts/eosio.system/eosio.system.abi);
  • 单元测试框架 unittests/eosio_system_tester.hpp 提供了对应的unstake测试辅助函数,直接以push_action(name(from), "undelegatebw"_n, ...)构造动作并携带与命令行一致的四个字段(fromreceiverunstake_net_quantityunstake_cpu_quantity),这从测试侧印证了动作的数据结构;同文件 eosio_system_tester.hpp 中还展示了将delegatebwundelegatebw组装进同一笔多动作交易的用法(先质押再解押的完整闭环)。

实操注意事项

  1. 数量精度与符号:数量必须使用系统通证符号(如SYSEOS),且不能超过账户当前为该receiver质押的对应资源总量,否则系统合约将拒绝执行。
  2. 权限要求:交易默认由from@active授权。若from账户的active权限被多签或自定义权限接管,需通过-p显式指定具备授权的权限级别。
  3. 确认最终生效:执行后若输出带warning: ... may not be confirmed,可稍后使用cleos get account alicecleos system listbw alice查询alice的质押余额变化来确认已生效;相关命令参考见 system-listbw.md。
  4. 反向操作:如需重新质押 NET 带宽,使用 how-to-delegate-NET-resource.md 与cleos system delegatebw(参数定义见 system-delegatebw.md)。

小结

解除 NET 带宽质押只需一条命令:cleos system undelegatebw <from> <receiver> "0 SYS" "0.01 SYS"。其本质是向eosio系统合约发送undelegatebw动作,且仅允许原始委托方执行。通过 programs/cleos/main.cpp 的源码与 unittests/eosio_system_tester.hpp 的测试辅助函数,可以清晰还原这条命令从 CLI 参数到链上动作的完整调用链,从而在排查资源问题时做到心中有数。

  • 区块链

【免费下载链接】eos

An open source smart contract platform

项目地址:https://gitcode.com/gh_mirrors/eo/eos
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询