智能合約安全與審計

交易順序相依性

交易順序相依性是那個讓合約結果取決於交易被打包順序的底層性質,而這個順序沒有任何使用者能掌控。兩筆各自有效的交易,會因誰先落地而產生截然不同的結果,而在多數鏈上,決定順序的實體——提議者或區塊建構者——能挑選最有利可圖的那種排序。每當正確性或公平性繫於一個使用者無法釘死的順序,合約就有一個潛伏的競態條件。

搶先與三明治攻擊是漏洞利用;交易順序相依性則是它們所利用的更深層條件。經典例子包括:一筆獎勵歸誰先呼叫 claim 就歸誰;一筆兌換的成交價取決於攻擊者的交易是否先於它;以及 ERC-20 approve 競態——把額度從一個非零值改成另一個非零值時,若被授權者搶在變更之前花用,便能以舊額度與新額度兩次動用。共通主軸是:同一組交易在不同排序下產生不同的狀態。

緩解之道針對的是這個相依性,而非任何單一攻擊者。承諾—揭露移除了排序攻擊者所需的資訊。把操作設計成對順序不敏感,例如在設定新額度之前先把額度歸零、或用 TWAP 而非瞬時池為交易定價,便移除了重排序的利潤。批次拍賣與公平排序協議則試圖中和提議者的裁量權。其心態是:假設有對手掌控順序,再問你的不變量是否依然成立。

ERC-20 approve 競態:Alice 已授權 Bob 100 枚代幣,並送出一筆把額度降為 50 的交易。Bob 盯著記憶池,搶先以 transferFrom 動用舊的 100,接著在 Alice 的變更生效後再花掉新的 50,合計提走 150。安全的模式是先把額度歸零,或改用 increaseAllowance/decreaseAllowance。

搶先與三明治是症狀;交易順序相依性才是病灶。一個結果會隨著無人能釘死的記憶池排序而改變的合約,早在任何特定攻擊者現身之前,就已經是脆弱的。

又稱
TODrace condition