阻止卡住消息的拒绝列表Skill denylist-stuck-messages

此技能用于在区块链relayer系统中,自动将卡住的消息ID添加到拒绝列表中,以防止这些消息继续处理。包括解析消息ID、用户确认、更新配置、创建GitHub PR和部署更新,适用于区块链运维和DevOps自动化。关键词:区块链、relayer、拒绝列表、卡住消息、配置管理、DevOps、自动化。

节点运维 0 次安装 0 次浏览 更新于 3/11/2026

name: denylist-stuck-messages description: 将消息ID添加到relayer的拒绝列表中。在调查卡住消息后使用/investigate-stuck-messages,或当有特定消息ID需要拒绝时使用。

阻止卡住消息的拒绝列表

将消息ID添加到relayer的拒绝列表配置中,创建PR,并部署。

何时使用

  1. 调查后:

    • 用户运行了/investigate-stuck-messages并希望拒绝找到的消息
    • 用户说“拒绝这些”或“将这些添加到黑名单”
  2. 直接拒绝请求:

    • 用户提供特定的消息ID来拒绝
    • 用户从浏览器或日志中粘贴消息ID

输入参数

/denylist-stuck-messages <message_ids> [app_context=NAME] [reason=REASON]
参数 是否必需 默认值 描述
message_ids - 空格或换行分隔的消息ID (0x…)
app_context 推断或“未知” 用于注释的应用上下文名称
reason “卡在准备队列中” 拒绝的原因(用于注释)
environment mainnet3 部署环境

示例:

/denylist-stuck-messages 0xabc123 0xdef456 app_context=USDC/mainnet-cctp-v2-standard
/denylist-stuck-messages
0xabc123
0xdef456
0x789ghi

工作流程

步骤 1: 解析消息ID

从输入中提取所有消息ID。有效格式:

  • 空格分隔:0xabc 0xdef 0x123
  • 换行分隔
  • 逗号分隔:0xabc, 0xdef, 0x123

验证每个ID:

  • 必须以0x开头
  • 必须是66个字符(0x + 64个十六进制字符)

步骤 2: 与用户确认

使用AskUserQuestion来确认:

准备为[APP_CONTEXT]拒绝X条消息:

| 消息ID |
|--------|
| 0xabc123... |
| 0xdef456... |

是否继续?

选项:

  1. “是,全部拒绝”(推荐)
  2. “让我修改列表”
  3. “取消”

步骤 3: 获取用户的GitHub句柄

如果不知道,询问GitHub句柄:

您的GitHub句柄是什么,用于分支名称?

步骤 4: 更新黑名单配置

编辑typescript/infra/config/environments/mainnet3/customBlacklist.ts

  1. 读取当前文件
  2. 将新消息ID添加到blacklistedMessageIds数组
  3. 包含注释:
    • 应用上下文名称
    • 日期(YYYY-MM-DD格式)
    • 原因

示例添加:

  // [APP_CONTEXT] [REASON] [YYYY-MM-DD]
  '0xabc123...',
  '0xdef456...',

在数组末尾附近添加条目,在闭合括号之前。

步骤 5: 创建分支和拉取请求

# 检出主分支并拉取最新
git checkout main && git pull origin main

# 创建分支
git checkout -b <github_handle>/denylist-<app_context>

# 暂存更改
git add typescript/infra/config/environments/mainnet3/customBlacklist.ts

# 提交
git commit -m "chore: 拒绝<APP_CONTEXT>卡住消息

添加了X个消息ID到拒绝列表,用于<APP_CONTEXT>路由。
原因:<REASON>

合著者:Claude Opus 4.5 <noreply@anthropic.com>"

# 推送并创建PR
git push -u origin HEAD
gh pr create --title "chore: 拒绝<APP_CONTEXT>卡住消息" --body "$(cat <<'EOF'
## 摘要
- 添加了X个消息ID到relayer的拒绝列表
- 应用上下文:`<APP_CONTEXT>`
- 原因:<REASON>

## 消息ID
<消息ID列表>

## 测试计划
- [ ] 审核消息ID是否正确
- [ ] 使用更新后的拒绝列表部署relayer

由[Claude Code](https://claude.com/claude-code)生成
EOF
)"

步骤 6: 输出Slack消息

在询问部署之前,输出Slack消息:

**Slack消息(复制/粘贴到#relayer-alerts):**

:no_entry_sign: *拒绝列表PR已创建*

应用上下文:`<APP_CONTEXT>`
已拒绝消息:X
原因:<REASON>

PR:<PR_URL>

步骤 7: 询问部署

使用AskUserQuestion

PR已创建。现在使用更新后的拒绝列表部署relayer吗?

选项:

  1. “是,立即部署”(推荐)
  2. “不,我稍后部署”

如果用户确认,运行:

pnpm --dir typescript/infra exec tsx ./scripts/agents/deploy-agents.ts -e mainnet3 --context hyperlane --role relayer

如果用户跳过,输出命令供后续使用。

步骤 8: 部署后更新Slack消息

如果已部署,更新Slack消息:

:no_entry_sign: *拒绝列表已部署*

应用上下文:`<APP_CONTEXT>`
已拒绝消息:X
原因:<REASON>

PR:<PR_URL>

按目的地分组

如果消息ID用于多个目的地(从调查输出中),在黑名单文件中分组:

  // [APP_CONTEXT] 卡住消息 [YYYY-MM-DD]
  // dest: arbitrum
  '0xabc123...',
  '0xdef456...',
  // dest: optimism
  '0x789ghi...',
  '0xjkl012...',

错误处理

  • 无效的消息ID格式:显示哪些ID无效,要求用户修复
  • Git冲突:拉取最新主分支并重试
  • PR创建失败:检查gh认证状态
  • 部署失败:显示错误,建议手动部署

先决条件

  • gh CLI已认证
  • Git配置了推送访问权限到仓库
  • 对于部署:kubectl配置了访问主网集群的权限