而我们想要的版本,是能从最早的时间从污染源头开始扩散。 一开始 有 Bite(B, C)的事件。 B 是from, 如果B不是感染源的话, 这条可以略过。 然后A 成为感染源, Bite (A->B), 这时B才会被感染, C只有在后面被其他感染源 Bite to 的时候,才会被感染 ## 实际实现 ### 特殊地址 先确定一些特殊地址, 特殊地址在下面的判断中起到不同的作用: `DEX module account` : `23M5ttkmR6KcnxentoqchgBdUjzMDSzFoUyf5qMs7FsmRMvV ` `stable asset pool` : `23M5ttkp2zdM8qa6LFak4BySWZDsAVByjepAfr7kt929S1U9` `fee moudle account` : `23M5ttkmR6Kco2CnDJKTSdBmBnYpbezUpTMeBsewEsjdui9F` `免疫地址`(这些特殊的地址属于不会感染的人,不可能成为point, 被僵尸咬就无事发生): 和 + 在block#1639493 之前(不包含), 是除去 dex module account 和 stable asset pool之后的其他系统模块地址 + 在block#1639493 之后(含), 是除去 dex module account 外的 所有 系统模块地址 `CEX归集地址` : (这些地址被传染后, 再去咬人不会传染人(插入point和direct), 再去咬僵尸也不会有咬的记录(direct)): ### 流程 从最早的区块#1638216开始取event, 按最早-》最近开始遍历 ### 特殊行为 1.感染源出现 ``` /// Claim rewards. incentives.ClaimRewards { who: T::AccountId, pool: PoolId, reward_currency_id: CurrencyId, actual_amount: Balance, deduction_amount: Balance, } ``` 如果 pool 是 aUSD-iBTC池子, reward_currency_id 是 aUSD, actual_amount > 大于 0!, 且 who 的 point 还不存在, 则 插入 who point, point 的数据域写入特殊标记 origin, 写入 感染的当前区块 (每个point 出现时都要写入 height) 2.1. 咬人 ``` balances.Transfer { from: T::AccountId, to: T::AccountId, amount: T::Balance }, /// 或者, 两者都只是要 from, to Transfer { currency_id: T::CurrencyId, from: T::AccountId, to: T::AccountId, amount: T::Balance, }, ``` 咬人行为出现, 先判断 from 是不是僵尸 (有没有point)? 1. 如果 from point 虽然存在, 但 from 是在 CEX 归集地址 或者 安全地址中 (原本安全地址不有point的, 但stable asset pool 会成为point, 之后才免疫,所以依然会存在),也和2一样就跳过了。 再判断 to point 存不存在? i. 存在, 如果没有 from potin -> to point 的direct, 就加一条 ii. 不存在,判断 to 如果不在 免疫地址中, to 感染, 插入 point 和 direct, 数据域里记录感染高度, 如果 to 是 CEX 归集地址, 额外在 数据域里标记一个 CEX 2. 没有的话 略过 2.2 咬人 特殊 ``` cdpEngine.CloseCDPInDebitByDEX { collateral_type: CurrencyId, owner: T::AccountId, sold_collateral_amount: Balance, refund_collateral_amount: Balance, debit_value: Balance, }, ``` 视为特殊的transfer, from 是 dex module, to 是 owner, 如果transfer 如果产生direct, direct 的数据域可以特殊标志一下 2.3 ``` dex.AddLiquidity { who: T::AccountId, currency_0: CurrencyId, pool_0: Balance, currency_1: CurrencyId, pool_1: Balance, share_increment: Balance, }, ``` 添加流动性,who会 transfer tokens to Dex module, 获得 Lp token, 但 Lp token 是 deposit 给 who 的, 需要视为特殊的 transfer, from 是 dex module, to 是 who ### 补充行为: 1. 最后 point 里会有 cex, stable asset pool, cex 统一标记 cex, stable asset pool 也标记一下, 2. 图里存在的所有point, 最后再排除掉, cex point , 且和 cex 1层相连的 point (cex的归集地址),这些地址虽然被污染, 但我们不可能回退掉了。