首页/新闻资讯/正文详情

EOSIO cleos `system canceldelay` 实战指南:取消延迟交易的命令用法与链上实现原理

发布时间:2026/9/24 23:48:32 来源:云帆数科 栏目:资讯中心
EOSIO cleos `system canceldelay` 实战指南:取消延迟交易的命令用法与链上实现原理
区块链【免费下载链接】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),仅供参考

相关推荐

如何查看AX的Actor与Worker池:kubectl ate命令完全指南
如何查看AX的Actor与Worker池:kubectl ate命令完全指南

如何查看AX的Actor与Worker池:kubectl ate命令完全指南 【免费下载链接】ax Googles open agentic orchestration runtime 项目地址: https://gitcode.com/GitHub_Trending/ax11/ax AX(Agent Executor)是 Google 开源的 Agent 编排运行… · 2026/9/24 23:48:32

google-api-php-client 使用 API Key 鉴权:setDeveloperKey 用法与底层实现解析
google-api-php-client 使用 API Key 鉴权:setDeveloperKey 用法与底层实现解析

后端 【免费下载链接】google-api-php-client A PHP client library for accessing Google APIs 项目地址: https://gitcode.com/gh_mirrors/go/google-api-php-client 点击查看 免费下载 当你的应用调用的 Google API 不涉及访问用户私有数据时,可以不… · 2026/9/24 23:48:26

ESP32轻量级应用平台:模块化固件与动态启停实践
ESP32轻量级应用平台:模块化固件与动态启停实践

1. 整体设计和框架取舍1.1 为什么要给 ESP32 做一个“应用平台”如果你玩过几块 ESP32,大概率会经历这样一个阶段:先是照着教程点灯、连 WiFi、读传感器,然后开始折腾各种各样的外设模块。这个阶段最大的痛点我估计你也有——每换一个新功能&… · 2026/9/24 23:48:20

深度学习新闻分类推荐系统:从TextCNN到个性化推荐
深度学习新闻分类推荐系统:从TextCNN到个性化推荐

简介:这份基于深度学习的新闻分类推荐系统Python实现源码,是专为课程设计与期末大作业准备的高分项目,下载后无需修改即可运行,适用于需要快速交付完整课题的高校学生。系统涵盖新闻数据预处理、文本分类模型训练、推荐逻辑展示等… · 2026/9/24 23:59:53

汽车电子底层软件开发:AUTOSAR与CAN总线实战解析
汽车电子底层软件开发:AUTOSAR与CAN总线实战解析

1. 这门“汽车电子底层软件开发就业课”到底在教什么?——不是写个LED闪烁就能上岗的很多人看到“汽车电子底层软件开发就业课”这个标题,第一反应是:不就是嵌入式C语言单片机CAN通信?刷几道LeetCode、调通一个STM32 CAN收发例程&… · 2026/9/24 23:59:53

Vim基础操作全攻略:保存退出、模式切换与高频命令实战
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保… · 2026/9/24 23:59:53

Python+CNN车牌识别实战:从数据预处理到模型训练与部署
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据… · 2026/9/24 23:59:53

AI元人文:从工具使用到思维重构的深度探索
AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决… · 2026/9/24 23:59:53

《AI Agent 场景应用 - MobileOpenClaw》第5-9节:会话上下文细化处理实战指南
《AI Agent 场景应用 - MobileOpenClaw》第5-9节:会话上下文细化处理实战指南

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、… · 2026/9/24 23:59:47

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码