From 8e585393a7b54ceb56cfc65b5930bbb341b84b01 Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Tue, 3 Nov 2026 23:36:20 +0800 Subject: [PATCH] Flagged status follows traceable transfers; wallet split review Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 2 ++ src/Decentralized.Domain/Wallet.cs | 5 +++-- tests/Decentralized.Domain.Tests/Program.cs | 10 ++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a42540..d359a16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ - 钓鱼公告:每晚 5%,报纸上"Poinbase 充值地址迁移"或黑市论坛上"混币器新地址",给的是没人用的地址,转进去就没了。 - PLEDGER 屏上的选择按钮(币种、手续费档位):选中的一个白底黑框黑字,四角带取景框角标,不再用方括号。 - 游戏内验证(第三批):手续费 1.5 CRT 扣除;拥堵时核对页手续费 ×4、慢档提示;最近列表出现投毒的"← 0x123…99 0 PSC",点它进核对页显示真实地址 0x12342499 与"有往来记录",签名后币转进投毒地址;慢档连续 13 次里 4 次"未成交",手续费照扣;论坛出现钓鱼帖;选中样式截图看过。没有在游戏里看到:报纸上的拥堵 / 钓鱼新闻(F9 面板那次没打开,代码走的是已用过的新闻接口)、剪贴板木马(只有被投毒的钱包触发,没专门测)、大额转账的 6 / 12 次确认动画(单元测试覆盖确认数)。 +- 被标记的钱包转出可追踪的币(CRC、PSC、CRT、CRA),收款钱包也被标记(含 Poinbase 账户);Ponero 不带标记。之前分成多钱包后,混币器在制裁期提回的币转进 Poinbase 就不再被标记,出金审查少了 30% 的加成。 +- 多钱包分流复核(ops `research/walletsim`,真实 Wallet / Exchange 类,每种做法 300 局 × 60 天):把干净和脏收入分到两个钱包、每天按 9.9% 污点比例往 Poinbase 掺脏币,可以零风险每天洗出约 36 污点(60 天约 2200),上限约等于干净出金量的 11%;同样的进账用单钱包出金能洗出更多污点(2400–4100),但会被没收、脏币多时会记罪证。没有干净收入时分流洗不出任何东西;而阶段 5 之前就能做到的"银行存入干净信用点稀释"60 天洗出 1350。结论:多钱包没有打开新的大口子,零风险的涓流来自 10% 以下审查项为 0 的这道坎,阶段 5 之前就存在。 - 存档不兼容旧版:链上的币归到新建的主钱包,Poinbase 账户从 0 开始。 - 游戏内验证(多钱包):两件硬件钱包(一正一投毒)作用于终端,钱包页出现钱包 2、钱包 3,标记看不出来;同时打开两台 PLEDGER;主钱包向钱包 3 转 100 PSC,核对页显示"自己的钱包:钱包 3",污点 5000 按 10000/16000 带走 3125;过一夜钱包 3 被转空(约 9393),晨间日志有记录;银行存入 500 进 Poinbase,提 200 CRC 到主钱包,再从主钱包向充值地址转 100 CRC,Poinbase 300 → 400,带过去污点 31。商城平台现货出现硬件钱包(158)。没有在游戏里验证:用鼠标拖拽(用探查通道执行了同一个"物品作用于物品"接口)、杰克逊柜台上的钱包和它的标价、Poinbase 空账户和"账户污点比例"两处改字(已编译,没重进游戏看)。 diff --git a/src/Decentralized.Domain/Wallet.cs b/src/Decentralized.Domain/Wallet.cs index dd235cb..f9bae3e 100644 --- a/src/Decentralized.Domain/Wallet.cs +++ b/src/Decentralized.Domain/Wallet.cs @@ -111,7 +111,8 @@ namespace Decentralized.Domain public double Value(Func price) => Balances.Sum(kv => kv.Value * price(kv.Key)); /// - /// 转出:taint 和 basis 按转出价值占地址总价值的比例带走。Ponero 等不可追踪资产转入时,污点不随之进入目标地址。 + /// 转出:taint 和 basis 按转出价值占地址总价值的比例带走;被标记的地址转出可追踪的币,收款地址也被标记。 + /// Ponero 等不可追踪资产转入时,污点和标记都不随之进入目标地址。 /// public static void Transfer(Wallet from, Wallet to, string asset, double amount, Func price) { @@ -124,7 +125,7 @@ namespace Decentralized.Domain from.Basis -= basis; to.Add(asset, amount); var spec = Assets.Get(asset); - if (spec == null || spec.Traceable) to.Taint += taint; + if (spec == null || spec.Traceable) { to.Taint += taint; if (from.Flagged) to.Flagged = true; } to.Basis += basis; } } diff --git a/tests/Decentralized.Domain.Tests/Program.cs b/tests/Decentralized.Domain.Tests/Program.cs index 755fc47..b15853c 100644 --- a/tests/Decentralized.Domain.Tests/Program.cs +++ b/tests/Decentralized.Domain.Tests/Program.cs @@ -853,6 +853,16 @@ internal static class Program Check(Math.Abs(v - 6000) < 1e-6 && w.Balances.Count == 0 && w.Frozen.Count == 0 && w.Taint == 0 && w.Basis == 0, $"全部转走(含冻结),污点和成本清零:{v}"); }); + Test("被标记的钱包转出可追踪的币,收款方也被标记;Ponero 不会", () => + { + Func price = x => 1; + var f = new Wallet { Address = "f", Flagged = true }; f.Add(Assets.CRC, 100); f.Add(Assets.Ponero, 100); + var p1 = new Wallet { Address = "p1" }; var p2 = new Wallet { Address = "p2" }; + Wallet.Transfer(f, p1, Assets.CRC, 10, price); + Wallet.Transfer(f, p2, Assets.Ponero, 10, price); + Check(p1.Flagged && !p2.Flagged, "CRC 带标记,Ponero 不带"); + }); + Test("多钱包:退款、出售回款、混币提回都回到原来的钱包", () => { Func price = a => a == Assets.PSC ? 100 : 1;