Solidity
目前的 ERC20 批准最佳實踐?
我一直在閱讀有關使用 ERC20 批准的潛在攻擊向量的一些(舊)討論(例如:https ://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 )但我一直注意到在實踐中,大多數 DeFi 應用程序(例如 1inch 路由器或 pancake swap 路由器)只是讓使用者做這樣的事情
approve(RouterAddress, MAX_UINT);
而不是遵循似乎推薦的流程,例如
approve(RouterAddress, 0); approve(RouterAddress, required_amount);
我想知道為什麼這種做法被認為是好的。
我個人認為這是更好的方法,並且由於批准是針對路由契約的,(在我看來)這種攻擊向量的風險基本上為零。更不用說它對實際使用者來說不那麼麻煩了。但這些都是舊的討論,我想知道目前關於這個問題的想法來自 Solidity 開發人員。
我的主要問題是:理論上,如果我有一份持有 1 億美元 WETH(或其他 ERC20 代幣)的合約,那麼這樣說真的可以嗎:
approve(RouterAddress, MAX_UINT);
我理解對於普通使用者來說,批准無限量可能不是什麼大不了的事,但是持有大量資金的契約呢?它還安全嗎?如果批准是針對另一個契約本身,是否存在這種攻擊向量的威脅?任何想法都非常感謝:)
IMO 它是,只要您相信您批准的契約是好的。有限的限額肯定更安全(在這種情況下,會以某種方式發現漏洞,從而允許惡意行為者通過合約呼叫 transferFrom 到其錢包。但這似乎極不可能)但正如您所說,它們更麻煩。然而,當我編寫需要使用的程式碼時,
approve
我通常會批准我每次需要轉移的確切數量,因為每次呼叫只需要多花費幾個單位的 gas,實施起來並不困難,也不會改變使用者方面的任何事情。