区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载导读cleos system canceldelay是 EOSIO 生态中用于**取消尚未执行的延迟交易delayed transaction**的标准命令行工具。在节点上提交带--delay-sec延迟参数的交易、或合约通过eosio::check之外的延迟调度机制排队交易后只要交易尚未到达延迟窗口或仍在延迟期间授权账户即可通过本命令将其从链上撤销。读完本文你将掌握cleos system canceldelay的完整参数语义、可复制的实战命令、其底层canceldelayaction 的数据结构与链端授权校验逻辑从而能在自己的测试网或业务场景中准确、安全地管理延迟交易。延迟交易机制简述为什么需要 canceldelay在 EOSIO 区块链中交易可以设置一个delay_sec延迟秒数。当一笔交易的delay_sec 0时节点不会立即执行它而是将其放入生成的交易generated transaction索引中待到delay_until时间点再真正入块执行。从链核心实现看延迟交易会被调度进generated_transaction_multi_index并设置delay_until published delay以及基于全局配置的deferred_trx_expiration_window过期窗口相关调度逻辑见 transaction_context.cpp。延迟交易常见于通过cleos提交交易时附带--delay-sec选项例如多签multisig提案执行前的等待期合约内部使用eosio::transaction延后执行的业务动作需要人为留出反悔窗口的资源操作如代理、转账等。由于延迟交易在真正执行前一直处于待命状态业务上可能因为参数错误、条件变化或安全原因需要撤销它——这就是canceldelay存在的意义。该命令对应的 action 由系统账户eosio提供属于内置系统合约能力在链核心中以SET_APP_HANDLER(eosio, eosio, canceldelay)注册见 controller.cpp因此无需部署任何额外合约即可使用。命令语法与位置参数cleos system canceldelay canceling_account canceling_permission trx_id [OPTIONS]cleos system canceldelay接受三个必填位置参数其语义与canceldelayaction 的字段一一对应参数类型说明canceling_accountTEXT原延迟交易授权authorization中出现的账户名即谁来执行取消canceling_permissionTEXT原延迟交易授权中出现的权限名与canceling_account共同构成取消所需的权限级别trx_idTEXT原始延迟交易的交易 IDTransaction ID命令同时提供与标准 cleos 交易提交一致的选项集。下表基于本仓库命令参考文档 system-canceldelay.md 完整整理选项说明-h, --help打印帮助信息并退出-x, --expiration TEXT设置交易过期前的秒数默认 30 秒-f, --force-unique强制交易唯一会消耗额外带宽并取消防止重复提交同一交易的保护-s, --skip-sign指定不使用钱包中已解锁的密钥对交易进行签名-d, --dont-broadcast不将交易广播到网络仅打印到 stdout-r, --ref-block TEXT设置用于 TAPOSTransaction as Proof-of-Stake的参考区块号或区块 ID-p, --permission TEXT指定授权账户与权限级别格式为accountpermission默认值为canceling_accountcanceling_permission--max-cpu-usage-ms UINT设置交易执行 CPU 预算上限毫秒默认 0 表示不设上限--max-net-usage UINT设置交易网络使用预算上限字节默认 0 表示不设上限--delay-sec UINT设置本笔取消交易的delay_sec秒数默认 0 秒-j, --json以 JSON 格式打印执行结果注意-p/--permission的默认值并非常见的accountactive而是由位置参数推导出的canceling_accountcanceling_permission。这一点在 cleos 源码中通过add_standard_transaction_options_plus_signing(cancel_delay, canceling_accountcanceling_permission)显式声明见 main.cpp。实战用法完整可复制的命令示例1. 创建一笔带延迟的交易准备场景要获得一个可被取消的延迟交易首先需要提交一笔设置了延迟秒数的交易。以最简单的转账为例cleos push action eosio.token transfer [alice, bob, 1.0000 EOS, delay test] \ -p aliceactive \ --delay-sec 300命令输出中会包含这笔交易的transaction_id即后续取消所需的trx_id并且交易不会立即生效而是在 300 秒后进入执行队列。2. 取消这笔延迟交易在延迟窗口内使用原交易授权中的账户与权限执行取消cleos system canceldelay alice active transaction_idalice→canceling_account即原延迟交易授权中的账户active→canceling_permission即原延迟交易授权中的权限transaction_id→ 原延迟交易的交易 ID。若原延迟交易使用非默认权限例如alicepay授权则取消时也必须使用完全一致的accountpermission组合cleos system canceldelay alice pay transaction_id -p aliceactive上面的-p aliceactive用于给这笔取消动作本身签名默认取canceling_accountcanceling_permission即alicepay若你的钱包中没有该权限对应的密钥可显式指定其他有权限的级别。3. 常见调试组合先预览不广播确认 payload 无误cleos system canceldelay alice active transaction_id -d -j在无钱包环境下手动签名配合外部签名流程cleos system canceldelay alice active transaction_id -s --dont-broadcast显式设置交易过期时间避免默认 30 秒窗口内因网络原因提交失败cleos system canceldelay alice active transaction_id -x 120链上实现原理从 CLI 到链端处理的完整链路1. CLI 侧payload 构造cleos中canceldelay子命令定义在 main.cpp 的canceldelay_subcommand结构中。其回调逻辑把三个位置参数组装为一个canceldelayactionauto canceling_auth permission_level{name(canceling_account), name(canceling_permission)}; fc::variant act_payload fc::mutable_variant_object() (canceling_auth, canceling_auth) (trx_id, trx_id); auto accountPermissions get_account_permissions(tx_permission, canceling_auth); send_actions({create_action(accountPermissions, config::system_account_name, canceldelay_n, act_payload)}, signing_keys_opt.get_keys());可以看到该 action 的接收方固定为系统账户config::system_account_name即eosioaction 名为canceldelaypayload 仅含两个字段canceling_auth由账户名 权限名构成的permission_level和trx_id交易授权默认取canceling_auth本身即用谁的权限取消就由谁签名。2. 数据结构canceldelay action 的 ABI 定义canceldelayaction 的数据结构定义于 contract_types.hppstruct canceldelay { permission_level canceling_auth; transaction_id_type trx_id; static account_name get_account() { return config::system_account_name; } static action_name get_name() { return canceldelay_n; } };其中permission_level即{actor, permission}二元组transaction_id_type即 32 字节的交易哈希。系统合约 ABI 也正式注册了该 action见 eosio_contract_abi.cpp 与 eosio_contract_abi.cpp。3. 链端处理内置处理器由于系统合约以内置native方式实现canceldelay的链端处理函数是apply_eosio_canceldelay位于 eosio_contract.cppvoid apply_eosio_canceldelay(apply_context context) { auto cancel context.get_action().data_ascanceldelay(); context.require_authorization(cancel.canceling_auth.actor); const auto trx_id cancel.trx_id; context.cancel_deferred_transaction(transaction_id_to_sender_id(trx_id), account_name()); }其核心动作是require_authorization(canceling_auth.actor)标记并强制要求canceling_auth.actor参与了本 action 的授权将trx_id通过transaction_id_to_sender_id转换为延迟交易的 sender_id调用cancel_deferred_transaction在链上删除对应的待执行延迟交易。4. 授权校验只有原交易授权人才能取消取消操作并非任意账户可为链端会在授权阶段严格校验取消者与原延迟交易之间的绑定关系。校验逻辑见 authorization_manager.cpp 的check_canceldelay_authorization其要点包括单一授权canceldelayaction 只能声明一个 authorization权限满足签名所用的权限必须满足canceling_auth所要求的权限交易存在以trx_id在generated_transaction_multi_index中必须能查找到对应的延迟交易且sender为空账户即系统级延迟交易否则报tx_not_found——即没有该交易 ID 的延迟交易无法取消授权匹配canceling_auth必须出现在原延迟交易内某个 action 的 authorization 列表中否则报错canceling_auth in canceldelay action was not found as authorization in the original delayed transaction。这意味着取消者必须恰好是原延迟交易某个 action 的授权账户与权限不能是任意第三方同时若原交易已经执行完毕或已过期移除取消同样会失败。注意事项与限制时机窗口只有仍处于延迟期尚未执行且未过期的延迟交易可以被取消。交易已入块执行、或超出deferred_trx_expiration_window过期窗口后链上不再保留该交易取消将报cannot cancel trx_id…, there is no deferred transaction with that transaction id。授权一致性canceling_accountcanceling_permission必须与原延迟交易中某个 action 的授权完全一致含权限级别否则校验不通过。延迟交易的延迟交易--delay-sec选项同样适用于canceldelay命令本身——即你可以在取消动作上也叠加延迟但这在大多数场景下没有必要。无需部署合约canceldelay由eosio系统账户的内置处理器提供任何 EOSIO 节点含测试网、本地单节点开箱即用。性能与带宽与普通交易一样取消交易同样受 CPU/网络预算约束可通过--max-cpu-usage-ms与--max-net-usage显式设置上限。延伸阅读本命令所属的完整命令族索引见 system 命令参考其中同样列出了system newaccount、system buyram、system delegatebw等系统合约操作延迟交易的调度与计费逻辑可深入阅读 transaction_context.cpp延迟交易的前置 net 计费与 transaction_context.cppschedule_transaction的入队与过期设置合约侧取消延迟交易的原语cancel_deferred由 WebAssembly 接口暴露定义于 webassembly/transaction.cpp供智能合约在业务逻辑中自行实现同类取消能力。赞分享区块链【免费下载链接】eosAn open source smart contract platform项目地址https://gitcode.com/gh_mirrors/eo/eos点击查看免费下载相关推荐EOSIO 账户创建完全指南cleos create account 命令详解与链上实现原理EOSIO 账户创建完全指南cleos create account 命令详解与链上实现原理 导读 在 EOSIO 区块链中账户是承载资产、权限与智能合约交区块链EOSIO cleos 命令参考全指南链上交互、钱包管理与资源操作实战EOSIO cleos 命令参考全指南链上交互、钱包管理与资源操作实战 本指南以开源智能合约平台 EOSIO 的官方命令参考文档 docs/02_cleos区块链EOSIO cleos system unregprod 命令详解注销区块生产者与链上治理实操EOSIO cleos system unregprod 命令详解注销区块生产者与链上治理实操 本篇技术指南围绕 EOSIO 开源智能合约平台中 cleos区块链上一篇Sunshine游戏串流服务器打造个人游戏云的终极指南下一篇AMD Ryzen调试工具SMU Debug Tool5分钟掌握核心参数调节技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
