Skip to content

fix(core): REDEEM/UNSTAKE/SLASH 未激活守卫补 amount=0+burn=0,防历史消息 retroactive 分叉#71

Merged
v0id-byte merged 1 commit into
mainfrom
fix/redop-preactivation-guards
Jul 4, 2026
Merged

fix(core): REDEEM/UNSTAKE/SLASH 未激活守卫补 amount=0+burn=0,防历史消息 retroactive 分叉#71
v0id-byte merged 1 commit into
mainfrom
fix/redop-preactivation-guards

Conversation

@v0id-byte

Copy link
Copy Markdown
Owner

背景

redOpError(packages/core/src/blockchain.ts)里两处「激活前」守卫会误伤历史合法的链上消息——与 feat/l1-anti-abuse(PR #69)里已修的 IDRELEASE 守卫(commit 12d9798)是同一 bug 类。这两处因为触及 mint/staking 共识路径,不在那轮范围;本 PR 单独、最小化地处理。

一条普通链上消息(createMessage:amount=0burn>0memo 任意)若正文恰好以协议前缀开头,在本 PR 之前的旧节点是合法接受的(burn>0 即非空操作,见 addTransaction 空交易判定 line 595)。当前守卫却会在 validateChain 重放历史链时把它判非法 → loadChain/replaceChain 拒绝整条链(retroactive 分叉)。

改动(两处纯收窄)

  1. 铸币 REDEEM(~line 207,!mintActive):
    … && tx.amount === 0… && tx.amount === 0 && (tx.burn ?? 0) === 0
    真实兑现形态是 amount=0 burn=0(见 mintActive REDEEM 分支强制 burn=0/amount=0)。

  2. 质押 UNSTAKE/SLASH(~line 198,!stakingActive,更宽——原本无任何 amount/burn 判定):
    !stakingActive && (UNSTAKE|SLASH)… && tx.amount === 0 && (tx.burn ?? 0) === 0
    真实赎回/罚没形态是 amount=0 burn=0(见 stakingActive UNSTAKE/SLASH 分支)。

两处均为纯收窄(只加 AND 条件)——只会比旧行为更宽松、绝不多拒,故:

  • 升级节点重放历史链不再把这些老消息判非法(不再 retroactive 拒整条链);
  • 真实兑现/赎回/罚没(amount=0+burn=0)仍被拦(与旧节点一致地拒空操作);
  • 对激活后共识零影响(守卫仅在未激活时触发)。
  • 无论实时链在 MINT_ACTIVATION_HEIGHT=30000 / STAKING_ACTIVATION_HEIGHT=16000 之下是否真有这类历史消息,收窄都安全。

回归测试

  • scripts/mint-selftest.ts:激活前 REDEEM| 开头的普通消息(burn>0)必须仍被接受、整链校验通过。
  • scripts/staking-selftest.ts:激活前 UNSTAKE|/SLASH| 开头的普通消息(burn>0)必须仍被接受、整链校验通过;并补「SLASH 零额新边界(amount=0+burn=0)仍被拒」对照断言。
  • 实证:临时回退两处守卫后,这三条 burn>0 消息全被「尚未激活」拒 → 回归确实咬住该 bug;恢复后全绿。

验证

🤖 Generated with Claude Code

…oactive 判非法

redOpError 里两处「激活前」守卫此前会误伤历史合法链上消息,与已修的 IDRELEASE(12d9798,
PR #69)同一 bug 类;这两处因触及 mint/staking 共识路径,当时不在那轮范围,现单独处理。

1) 铸币 REDEEM(mintActive):`!mintActive && REDEEM_PREFIX && amount===0` 会拒掉「amount=0
   + burn>0 + 正文恰好以 REDEEM| 开头」的普通消息——这类消息在本 PR 之前旧节点照收(burn>0
   即非空操作)。真实兑现的形态是 amount=0 **且 burn=0**(见 mintActive REDEEM 分支强制
   burn=0)。补 `&& (tx.burn ?? 0) === 0` 收窄守卫。

2) 质押 UNSTAKE/SLASH(stakingActive):`!stakingActive && (UNSTAKE|SLASH)` 更宽——完全没有
   amount/burn 判定,任何以 UNSTAKE|/SLASH| 开头的历史交易(含 amount>0 普通转账、burn>0 消息)
   都被拒。真实赎回/罚没的形态是 amount=0 **且 burn=0**(见 stakingActive UNSTAKE/SLASH 分支)。
   补 `&& tx.amount === 0 && (tx.burn ?? 0) === 0` 收窄守卫。

两处均为**纯收窄**(只加 AND 条件 → 只会比旧行为更宽松、绝不多拒),因此:升级节点重放历史链时
不再把这些老消息判非法(validateChain/loadChain/replaceChain 不再 retroactive 拒整条链);真实
兑现/赎回/罚没(amount=0+burn=0)仍被拦(与旧节点一致地拒空操作);对激活后共识零影响(守卫仅在
未激活时触发)。无论实时链在激活高度下是否真有这类历史消息,收窄都安全。

回归:
- mint-selftest:激活前 REDEEM| 开头的普通消息(burn>0)必须仍被接受、整链校验通过。
- staking-selftest:激活前 UNSTAKE|/SLASH| 开头的普通消息(burn>0)必须仍被接受、整链校验通过;
  并补 SLASH 零额新边界(amount=0+burn=0)仍被拒的对照断言。
经实证:回退守卫后这三条消息全被「尚未激活」拒 → 回归确实咬住该 bug。

typecheck(6 包)/smoke/staking/mint/onion/antireplay 全绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@v0id-byte

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: f72f7112ac

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@v0id-byte v0id-byte merged commit 97782e6 into main Jul 4, 2026
2 checks passed
@v0id-byte v0id-byte deleted the fix/redop-preactivation-guards branch July 4, 2026 15:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant