Solidity

ERC20代幣合約中transferFrom函式的案例是什麼?

  • November 17, 2021

在@openZeppelin 的ERC20實現中,這裡是函式transferFrom的程式碼:

function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
   _transfer(sender, recipient, amount);
   _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
   return true;
}

function _transfer(address sender, address recipient, uint256 amount) internal virtual {
       require(sender != address(0), "ERC20: transfer from the zero address");
       require(recipient != address(0), "ERC20: transfer to the zero address");

       _beforeTokenTransfer(sender, recipient, amount);

       _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
       _balances[recipient] = _balances[recipient].add(amount);
       emit Transfer(sender, recipient, amount);
   }

amount餘額從 的餘額中減去sender並添加到 的餘額中recipient。呼叫者的津貼sender也減少了amount. 該實現讓我感到困惑,因為沒有驗證,這意味著sender並且可以是任意 2 個任意地址。如果呼叫者和呼叫者不是同一個地址怎麼辦?案例是什麼?recipient``sender``recipient``sender``msg.sender``transferFrom

案例是您允許其他人從您的帳戶進行轉賬。

其他人可以是外部擁有的賬戶或智能合約賬戶。

例如,假設您想在 Uniswap 上將一些 TKN 轉換為 ETH。

理論上,您可以將您的 TKN 轉移到 Uniswap 合約,然後在其上呼叫一些函式以向您發送 ETH 作為回報,但是:

  1. 這需要兩個單獨的交易,在此期間,匯率(在區塊鏈上)可能會發生變化
  2. 當你呼叫 Uniswap 合約函式時,它甚至不會“知道”你之前將 TKN 轉移到了合約中

approve/的機制transferFrom解決了這兩個問題如下:

  • 您在 TKN 合約上呼叫該approve函式,以允許 Uniswap 合約從您的賬戶中轉移一定數量的 N 個代幣
  • 你呼叫exchangeTKNUniswap 合約上的某個函式,指定 N 個代幣的數量;反過來,此函式呼叫transferFromTKN 合約上的函式,以便將 N 個代幣從您的賬戶轉移到合約,然後將 ETH 從合約發送到您的賬戶,兩者都在同一筆交易中

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