Transactions

是否可以批量批准 + 轉移 ERC-20 代幣?

  • October 10, 2021

在我們的dapp中,我們目前有以下使用者流程:

  1. 批准 Sablier 合約以花費最多 x ERC20 代幣
  2. 將 x ERC20 代幣轉入 Sablier 合約

這不是超級糟糕的使用者體驗,但如果使用者只簽署一項交易肯定會更好。

我知道“啟用最大值”策略,您要求使用者批准具有驚人高價值的令牌,但我認為它不安全。

有沒有一種方法可以讓我們也吃蛋糕?即在一筆交易中同時進行審批和轉賬嗎?也許用 CREATE2?

可以使用 Create2 操作碼在一個原子呼叫事務中批量批准+轉移

檢查此連結以獲取更多資訊 https://medium.com/coinmonks/on-efficient-ethereum-transactions-introducing-homework-6ae4f21801ed

您可以讓使用者創建一個交易,該交易按照上述文章中的說明部署交易合約,然後在執行後自毀它,接管自毀的 gas 退款

根據我的說法,這種操作在與這種操作相關的天然氣成本方面仍然不好

Homework Github 有使用指南 https://github.com/0age/HomeWork#usage

注意:HomeWork 程式碼是高度實驗性的,仍處於開發階段,在生產中使用它是有風險的

有任何問題都可以加入 HomeWork discord https://discord.gg/qqmKtNm

在大多數以某種方式與使用者代幣餘額互動的 Dapp 中都可以看到這種特殊行為。Uniswap1inchBancor和更多領先的 Dapps 要求使用者在單獨的交易中批准代幣轉移,然後才能執行代幣的實際轉移。

之所以需要這樣做,是因為 ERC-20 代幣的設計。當合約收到 ETH 時,該交易的發送方對合約可用。然而,這對於 ERC20 代幣是不可能的——接收合約必須代表使用者轉移代幣才能知道它從哪裡收到代幣。顯然,使用者必須先授權接收合約才能移動他/她的代幣。

正如您在問題中所寫,有可能允許接收契約無限制地訪問使用者資金。這樣,每個使用者和每個令牌只需要一個授權交易。不幸的是,目前這是解決我們為最終使用者創建盡可能少的交易的問題的最佳通用解決方案,並且得到大多數 Dapps 的支持。從安全的角度來看,這不是一個好的解決方案。

在原始CREATE操作碼中,合約地址是部署者帳戶和 nonce 的函式,因此無法準確預測。該CREATE2指令後來通過 EIP-1014 添加並改變了合約的部署方式。CREATE2使得計算未來部署的合約的地址成為可能。這允許與尚未部署的合約“互動”。但是,CREATE2並不能真正幫助您解決問題。

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