ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EOSIO 中如何使用 cleos 解押 CPU 带宽资源(Unstake CPU Bandwidth)

EOSIO 中如何使用 cleos 解押 CPU 带宽资源(Unstake CPU Bandwidth) EOSIO 中如何使用 cleos 解押 CPU 带宽资源Unstake CPU Bandwidth【免费下载链接】eosAn open source smart contract platform项目地址: https://gitcode.com/gh_mirrors/eo/eos本文是 EOSIO 资源管理系列实操指南之一围绕cleos system undelegatebw命令讲解如何将此前委托stake给账户的 CPU 带宽资源解押unstake回来。文章以 docs/02_cleos/02_how-to-guides/how-to-unstake-CPU.md 为核心骨架结合仓库中 cleos 客户端源码与单元测试实现细节帮助你完整掌握解押命令的参数语义、权限要求、底层动作调用链与常见注意事项读完即可在本地节点或测试网络上安全执行 CPU 资源解押操作。核心目标与概念在 EOSIO 网络中CPU 带宽与 NET 带宽是账户执行与广播交易所需的资源通过质押stake系统代币来获得。当你需要回收这些质押资产时可以执行解押unstake操作。本指南要完成的具体目标是从自己的账户中解押 CPU 带宽资源。需要特别强调的是只有最初执行委托delegate的账户才有权解除对应资源的委托。也就是说如果账户 A 将资源委托给了账户 B那么只有 A 能够执行解押并将资源收回B 自己无法单方面解押 A 委托给它的资源。这一点既适用于自己给自己委托self-delegation的场景也适用于跨账户委托的场景。开始之前的准备在执行解押操作前请确保满足以下条件安装当前受支持的cleos版本cleos随 EOSIO 软件一起分发参照 docs/00_install/index.md 完成 EOSIO 安装后cleos即会同步安装到环境中。系统合约已部署并用于管理系统资源确保来自eosio.contracts仓库的参考系统合约reference system contracts已经部署到eosio账户上。undelegatebw动作由系统合约eosio::undelegatebw负责处理只有系统合约就位资源解押才能正常执行。理解以下基本概念什么是账户account及账户的权限体系什么是网络带宽NET bandwidth即交易数据在网络中传输所占用的带宽资源什么是 CPU 带宽CPU bandwidth即执行智能合约与交易时消耗的计算资源。操作步骤执行下面的命令从账户alice解押 0.01 SYS 的 CPU 带宽cleos system undelegatebw alice alice 0.01 SYS 0 SYS命令执行成功后你应当看到类似下面的输出executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606 184 bytes 452 us # eosio eosio::undelegatebw {from:alice,receiver:alice,unstake_net_quantity:0.0000 EOS,unstake_cpu_qu... warning: transaction executed locally, but may not be confirmed by the network yet ]输出解读executed transaction: txid一行显示交易哈希、交易字节数184 bytes与执行耗时452 us# eosio eosio::undelegatebw表示该动作由系统账户eosio处理动作名称为undelegatebw其 payload 中包含from、receiver、unstake_net_quantity、unstake_cpu_quantity四个字段warning: transaction executed locally, but may not be confirmed by the network yet是常规提示说明交易已在本地节点执行但最终确认与否取决于网络后续的打包与共识确认并非错误信息。提示如果你此前将资源委托给了其他账户例如从bob委托给alice则需要从bob发起解押把资源从alice收回具体写法参见下文跨账户解押小节与 how-to-undelegate-CPU.md。命令与参数详解cleos system undelegatebw的完整参数定义与选项说明见 system-undelegatebw.md以下进行逐项展开。位置参数Positional Arguments参数类型说明fromTEXT执行解押的账户即最初委托资源的账户receiverTEXT被收回委托资源的账户解押后资源返还的对象unstake_net_quantityTEXT要解押的 NET 带宽代币数量格式为带符号的资产量如0 SYSunstake_cpu_quantityTEXT要解押的 CPU 带宽代币数量如0.01 SYS在 cleos 源码中这四个参数在 programs/cleos/main.cpp 的undelegate_bandwidth_subcommand结构中被显式声明为必填-required()这意味着任何一次解押操作都必须完整给出这四个参数若只想解押 CPU 而不解押 NET将对应数量写为0 SYS即可。通用交易选项Options除四个位置参数外undelegatebw还支持以下与交易构造、签名和广播相关的通用选项选项说明-h, --help打印帮助信息并退出-x, --expiration TEXT设置交易过期时间秒默认 30 秒-f, --force-unique强制交易唯一性会额外消耗带宽并移除对意外重复发送相同交易的保护-s, --skip-sign指定不使用已解锁钱包中的密钥对交易签名-d, --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设置交易的延迟秒数delay_sec默认 0 秒-j, --json以 JSON 格式打印结果实际使用中--dont-broadcast适合先离线检查交易内容--permission适合以非默认权限如多签配置的权限级别发起解押。底层实现从 cleos 命令到链上动作cleos system undelegatebw并不是节点内置的功能而是 cleos 客户端对链上eosio::undelegatebw动作的封装。其调用链可以从源码中完整还原参数解析在 programs/cleos/main.cpp 中undelegate_bandwidth_subcommand注册子命令undelegatebw并声明from、receiver、unstake_net_quantity、unstake_cpu_quantity四个必填位置参数同时附加标准交易选项与签名选项默认权限fromactive。构造动作回调函数中将两个解押数量字符串通过to_asset()转换为资产类型asset然后构建动作 payloadprograms/cleos/main.cppfc::variant act_payload fc::mutable_variant_object() (from, from_str) (receiver, receiver_str) (unstake_net_quantity, to_asset(unstake_net_amount)) (unstake_cpu_quantity, to_asset(unstake_cpu_amount));发送动作最后将动作目标设置为系统账户eosio动作名为undelegatebw并交由send_actions完成签名与广播programs/cleos/main.cpp。这与delegatebw的封装方式完全对称只是动作名与字段不同。链上处理动作到达链上后由部署在eosio账户的系统合约执行。系统合约会对调用者身份、解押数量、委托关系等进行校验并按照既定规则启动资源与代币的返还流程。解押后资源并不会立即到账而是遵循系统合约规定的退款机制按周期返还具体周期与细节以所部署的系统合约版本为准本仓库的 unittests/contracts/eosio.system 中仅包含预编译的 eosio.system 合约二进制与其 ABI可在部署后通过链上行为验证。测试用例印证仓库的单元测试为undelegatebw的调用方式提供了直接证据在 unittests/eosio_system_tester.hpp 中测试辅助函数unstake(from, to, net, cpu)使用push_action(name(from), undelegatebw_n, ...)推送动作动作字段与 cleos 命令一一对应验证了由委托者本人发起、指定接收者与两类解押数量的标准调用形态在 unittests/bootseq_tests.cpp 的启动序列测试中同样通过base_tester::push_action(config::system_account_name, undelegatebw_n, ...)直接向系统账户推送该动作说明系统合约必须部署完成后undelegatebw才能正常执行与开始之前的准备一节中的前提要求一致。这些测试用例既是解押流程正确性的验证也可以作为集成测试或脚本化操作时构造同类事务的参考模板。扩展跨账户解押与相关操作跨账户解押如果此前从bob委托了 0.01 SYS CPU 带宽给alice那么解押时必须以bob的身份发起并将receiver指定为alice即从 alice 收回由 bob 委托的 CPU 资源cleos system undelegatebw bob alice 0 SYS 0.01 SYS对应输出示例executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606 184 bytes 452 us # eosio eosio::undelegatebw {from:alice,receiver:bob,unstake_net_quantity:0.0000 EOS,unstake_cpu_qu... warning: transaction executed locally, but may not be confirmed by the network yet ]注意观察动作 payload 中from与receiver的对应关系from永远是资源所有者原委托者receiver是被收回资源的账户。这与只有原委托者可以解除委托的规则直接对应。相关文档与命令委托 CPU / NET 资源的对应操作见 how-to-delegate-CPU-resource.md 与 how-to-stake-resource.md解押 NET 带宽的操作见 how-to-unstake-NET.md命令与解押 CPU 完全同构只需调整unstake_net_quantity与unstake_cpu_quantity的数值分布跨账户收回委托资源的完整说明见 how-to-undelegate-CPU.md 与 how-to-undelegate-NET.md。常见注意事项身份与权限解押动作必须以原委托者账户签名发起默认权限fromactive。如果委托者账户启用了多签或其他自定义权限需要通过--permission显式指定可用的权限级别否则交易会被系统合约拒绝。数量格式unstake_net_quantity与unstake_cpu_quantity必须使用标准的资产字符串格式如0.01 SYS且精度需与代币合约定义一致不打算解押的资源类型请显式传0 SYS。解押不是即时到账解押动作执行成功后对应代币与带宽的返还需要等待系统合约的退款周期完成不要期望命令执行后立即看到资源完全回退。交易确认输出中的executed transaction仅代表交易已在本地节点执行成功最终状态以网络共识确认结果为准可通过cleos get transaction txid或cleos get account account进一步核验账户资源余额变化。通过本指南你已经掌握了使用cleos system undelegatebw解押 CPU 带宽的完整流程、参数语义与底层动作调用机制可以将其直接应用到本地开发、测试网络或主网的资源管理实践中。【免费下载链接】eosAn open source smart contract platform项目地址: https://gitcode.com/gh_mirrors/eo/eos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表