這讓我想起了以太坊早期的 mempool 時代,那時我們不得不進行非常類似的 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