Solidity

目前的 ERC20 批准最佳實踐?

  • December 12, 2021

我一直在閱讀有關使用 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,實施起來並不困難,也不會改變使用者方面的任何事情。

引用自:https://ethereum.stackexchange.com/questions/106459