这让我想起了以太坊早期的内存池时代,当时我们不得不进行非常类似的XOR calldata混淆,以阻止竞争对手重新出价哈哈 有趣的是,实际上在solanaland中仍然存在着一片西部荒野。
Michael Morrell
Michael Morrell12月4日 10:08
HumidiFi 交换指令数据混淆: - 就地基于 XOR 的流密码。 - 对称(f(f(x)) = x),并在 64 位块上操作。 算法: - 以 8 字节(u64)块处理数据。 - 对于每个块: -- 与静态 `HUMIDIFI_IX_DATA_KEY` 进行 XOR: [58, 255, 47, 255, 226, 186, 235, 195, 123, 131, 245, 8, 11, 233, 132, 219, 225, 40, 79, 119, 169, 121, 169, 58, 197, 1, 122, 9, 216, 164, 149, 97][0..7]; -- 与滚动的 `pos_mask` 进行 XOR(从 0 开始,每个块递增 0x0001_0001_0001_0001)。 - 剩余处理(如果 len % 8 != 0): - 将剩余字节填充为 64 位。 - 应用相同的 XOR(密钥 + 当前 pos_mask)。 - 将有效字节复制回原始切片。 输入布局(去混淆后): - 字节 0-7: `swap_id` (u64) - 字节 8-15: `amount_in` (u64) - 字节 16: `is_base_to_quote` (u8) - 字节 17-23:填充 - 字节 24:选择器(在反序列化之前弹出)
如果你在想“为什么要编码 calldata 而不是直接模拟”,答案很简单:模拟在计算时间上是昂贵的,但竞标是低延迟的,这意味着如果你在模拟 + 重新竞标时,到你重新竞标时,发起者已经发送了多个更新的交易。 这意味着你需要有一种方法来即时识别竞争对手的参数,以便你可以基于这些参数进行新的竞标。这就是为什么你要解析 calldata 而不是进行模拟。当每个人都在这样做时,你需要走在前面,以一种无法在没有手动逆向工程的情况下解码的方式编码 calldata。
罕见的技术评论。
4.33K