Flagged status follows traceable transfers; wallet split review

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Opus 5.5 committed 2026-11-03 23:36:20 +08:00
1 parent 50c119697e
commit 8e585393a7
3 files changed
+15 -2

No files matched your search

+2
View File
@@ -26,6 +26,8 @@
- 钓鱼公告:每晚 5%,报纸上"Poinbase 充值地址迁移"或黑市论坛上"混币器新地址",给的是没人用的地址,转进去就没了。 - 钓鱼公告:每晚 5%,报纸上"Poinbase 充值地址迁移"或黑市论坛上"混币器新地址",给的是没人用的地址,转进去就没了。
- PLEDGER 屏上的选择按钮(币种、手续费档位):选中的一个白底黑框黑字,四角带取景框角标,不再用方括号。 - PLEDGER 屏上的选择按钮(币种、手续费档位):选中的一个白底黑框黑字,四角带取景框角标,不再用方括号。
- 游戏内验证(第三批):手续费 1.5 CRT 扣除;拥堵时核对页手续费 ×4、慢档提示;最近列表出现投毒的"← 0x123…99 0 PSC",点它进核对页显示真实地址 0x12342499 与"有往来记录",签名后币转进投毒地址;慢档连续 13 次里 4 次"未成交",手续费照扣;论坛出现钓鱼帖;选中样式截图看过。没有在游戏里看到:报纸上的拥堵 / 钓鱼新闻(F9 面板那次没打开,代码走的是已用过的新闻接口)、剪贴板木马(只有被投毒的钱包触发,没专门测)、大额转账的 6 / 12 次确认动画(单元测试覆盖确认数)。 - 游戏内验证(第三批):手续费 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 开始。 - 存档不兼容旧版:链上的币归到新建的主钱包,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 空账户和"账户污点比例"两处改字(已编译,没重进游戏看)。 - 游戏内验证(多钱包):两件硬件钱包(一正一投毒)作用于终端,钱包页出现钱包 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 空账户和"账户污点比例"两处改字(已编译,没重进游戏看)。
+3 -2
View File
@@ -111,7 +111,8 @@ namespace Decentralized.Domain
public double Value(Func<string, double> price) => Balances.Sum(kv => kv.Value * price(kv.Key)); public double Value(Func<string, double> price) => Balances.Sum(kv => kv.Value * price(kv.Key));
/// <summary> /// <summary>
/// 转出:taint 和 basis 按转出价值占地址总价值的比例带走。Ponero 等不可追踪资产转入时,污点不随之进入目标地址。 /// 转出:taint 和 basis 按转出价值占地址总价值的比例带走;被标记的地址转出可追踪的币,收款地址也被标记。
/// Ponero 等不可追踪资产转入时,污点和标记都不随之进入目标地址。
/// </summary> /// </summary>
public static void Transfer(Wallet from, Wallet to, string asset, double amount, Func<string, double> price) public static void Transfer(Wallet from, Wallet to, string asset, double amount, Func<string, double> price)
{ {
@@ -124,7 +125,7 @@ namespace Decentralized.Domain
from.Basis -= basis; from.Basis -= basis;
to.Add(asset, amount); to.Add(asset, amount);
var spec = Assets.Get(asset); 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; to.Basis += basis;
} }
} }
@@ -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}"); 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<string, double> 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("多钱包:退款、出售回款、混币提回都回到原来的钱包", () => Test("多钱包:退款、出售回款、混币提回都回到原来的钱包", () =>
{ {
Func<string, double> price = a => a == Assets.PSC ? 100 : 1; Func<string, double> price = a => a == Assets.PSC ? 100 : 1;