- 区块链
【免费下载链接】eos
An open source smart contract platform
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" 部分):
- 安装当前受支持的
cleos版本:cleos是 EOS(eos)仓库提供的命令行客户端,源码位于 programs/cleos,构建后即可使用。 - 部署并启用参考系统合约:解除质押实际由链上
eosio账户执行的undelegatebw动作完成,因此必须确保eosio.contracts仓库中的参考系统合约已部署到链上,用于管理系统资源。本仓库的单元测试目录中保留了该系统合约的 ABI 产物,见 unittests/contracts/eosio.system/eosio.system.abi。 - 理解以下基础概念:
- 什么是账户(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 即动作参数(from、receiver、unstake_net_quantity、unstake_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。
位置参数(全部必填)
| 参数 | 类型 | 说明 |
|---|---|---|
from | TEXT | 解除带宽的账户(发起解除质押的账户,必须是原始委托方) |
receiver | TEXT | 被收回带宽的账户(当初带宽被委托给的账户) |
unstake_net_quantity | TEXT | 要解除的网络(NET)带宽通证数量,如"0.01 SYS" |
unstake_cpu_quantity | TEXT | 要解除的 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" 聚焦于自己账户的资源赎回,from与receiver通常相同(如alice alice);而 "undelegate" 聚焦于收回委托给他人的资源,from与receiver通常不同。
源码剖析:cleos 如何构造这笔交易
从源码结构看,cleos system undelegatebw由undelegate_bandwidth_subcommand结构体注册实现(programs/cleos/main.cpp),其关键流程为:
注册子命令:通过
actionRoot->add_subcommand("undelegatebw", localized("Undelegate bandwidth"))注册undelegatebw子命令;声明四个必填位置参数:
from、receiver、unstake_net_quantity、unstake_cpu_quantity,并分别调用->required()强制必填;附加标准交易选项:调用
add_standard_transaction_options_plus_signing(undelegate_bandwidth, "from@active"),默认以from@active权限签署交易,这也是上表中-p/--permission选项默认值的来源;构造动作负载:在回调函数中构建
fc::mutable_variant_object,将两个数量参数经to_asset()转换为资产类型后,组装为:from、receiver、unstake_net_quantity、unstake_cpu_quantity发送动作:通过
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, ...)构造动作并携带与命令行一致的四个字段(from、receiver、unstake_net_quantity、unstake_cpu_quantity),这从测试侧印证了动作的数据结构;同文件 eosio_system_tester.hpp 中还展示了将delegatebw与undelegatebw组装进同一笔多动作交易的用法(先质押再解押的完整闭环)。
实操注意事项
- 数量精度与符号:数量必须使用系统通证符号(如
SYS、EOS),且不能超过账户当前为该receiver质押的对应资源总量,否则系统合约将拒绝执行。 - 权限要求:交易默认由
from@active授权。若from账户的active权限被多签或自定义权限接管,需通过-p显式指定具备授权的权限级别。 - 确认最终生效:执行后若输出带
warning: ... may not be confirmed,可稍后使用cleos get account alice或cleos system listbw alice查询alice的质押余额变化来确认已生效;相关命令参考见 system-listbw.md。 - 反向操作:如需重新质押 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
相关推荐
Wand-Enhancer:WeMod 破解工具指南
Wand Enhancer:WeMod 破解工具指南 Wand Enhancer 是一款开源的 WeMod 破解工具,通过在本地改写 WeMod/Wand 客户
区块链Loki 仓库中的 S3 Go SDK 变更日志详解:从 aws-sdk-go-v2 发布记录到 Loki S3 客户端的源码原理
Loki 仓库中的 S3 Go SDK 变更日志详解:从 aws sdk go v2 发布记录到 Loki S3 客户端的源码原理 本文以 Loki 仓库 ve
区块链文档转 Markdown 工具 markitdown:3 步把 PDF、Word 变成干净的 Markdown 笔记
文档转 Markdown 工具 markitdown:3 步把 PDF、Word 变成干净的 Markdown 笔记 手头一堆 PDF 和 Word,复制粘贴进
区块链
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考