ERC20
ERC20 與 ETH 的根本差異
Push 直接發送代幣
Pull 發送方先授權接收方,接收方才能動用代幣
ETH使用Push方式,ERC20 Push 與 Pull 兩種都有。
為什麼要設計 Pull 模式?
由於衍生代幣會跟其他合約互動,若使用 Push 合約無法處理被動收到的資金。為了讓合約能靈活處理被動接收的資金,而非依賴主動推送。大部分衍生代幣會與其他 DeFi 協議互動,常透過 transfer、send 或 call 被動收到 ETH/token。這些使用 Push 模式的資金不帶特定 selector,會導致呼叫 fallback 或 receive 可能使的合約無法運行正常邏輯。Pull 模式則可以由合約主動發起,進行後續邏輯
Pull 流程
Pull 模式會有兩個步驟,先 Approve ,再 TransferFrom。
Approve 代幣持有者先呼叫 approve() 函數,授權可以從自己帳戶中提取指定額度的代幣
TransferFrom被授權方再呼叫transferFrom() 函數,從授權者帳戶中提取代幣
Allowance 機制是什麼:為什麼合約不能直接扣你的錢?
ERC20 的 Pull模式中,紀錄發收方授權 approve 給接收方的額度,合約只能提取Allowance紀錄的代幣額度。
transfer / approve / transferFrom 他們的差異與原理
transfer 直接轉帳
approve 授權接收方扣錢
transferFrom 接收方扣錢
| transfer | approve | transferFrom | |
|---|---|---|---|
| 調用者身份 | 代幣持有者 | 代幣持有者 | 被授權方 |
| 錢動不動 | 真的轉帳 | 只記權限(在Allowance紀錄) | 真的轉帳 |
| 需要授權 | 無 | 無 | 必須先 approve |
| 可轉他人的錢 | 只能轉自己的 | 可以轉授權人的 | |
| 檢查 allowance | 無 | 無 | 檢查並扣除 |
| 使用場景 | 直接轉帳給別人 | 授權第三方使用你的代幣 | 第三方代你轉帳 |
無限授權 (Unlimited Approval) 的風險
為了方邊授權type(uint256).max,授權的對象可以將你授權的token用transferFrom全部轉走,ㄧ般情況可能沒事,但如果授權的地址被害錢可能就會被掃光。
為什麼錢包需要手動加入 ERC20 Token
ERC20是合約,需要呼叫合約才能顯示代幣資訊,但錢包不知道要查哪些合約地址。錢包也不會知道Token的地址,即使知道所有地址,要查詢全部合約也太過耗時,目前一般來說錢包因此錢包通常採用白名單機制(Uniswap Token Lists 等公開列表),自動查詢常見的token,其餘較小眾的要自動加入。
也就是說如果錢包開發者沒有讓錢包去向白名單要ERC20Token合約地址,你就要手動加入所有你所需要用到的Token合約地址。