Solidity
ERC20代幣合約中transferFrom函式的案例是什麼?
在@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 作為回報,但是:
- 這需要兩個單獨的交易,在此期間,匯率(在區塊鏈上)可能會發生變化
- 當你呼叫 Uniswap 合約函式時,它甚至不會“知道”你之前將 TKN 轉移到了合約中
approve
/的機制transferFrom
解決了這兩個問題如下:
- 您在 TKN 合約上呼叫該
approve
函式,以允許 Uniswap 合約從您的賬戶中轉移一定數量的 N 個代幣- 你呼叫
exchangeTKN
Uniswap 合約上的某個函式,指定 N 個代幣的數量;反過來,此函式呼叫transferFrom
TKN 合約上的函式,以便將 N 個代幣從您的賬戶轉移到合約,然後將 ETH 從合約發送到您的賬戶,兩者都在同一筆交易中