ERC20

Yan Ru Su

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合約地址。