Back to Blog

便利與安全的權衡:ERC20 的無限授權機制

August 17, 2021
12 min read

摘要

在以太坊中,ERC20 代幣被公司或使用者廣泛用於構建去中心化應用程式(DApps)。許多 ERC20 代幣具有巨大的價值並在加密貨幣市場中流通。此外,隨著 DeFi 生態系統的繁榮發展,ERC20 代幣的交易變得越來越頻繁。根據 ERC20 標準,呼叫 approve() 方法是為了授權 DApps 或其他使用者提取代幣。在現實中,許多 DApps 要求使用者提供「無限授權」,而這種設計引發了嚴重的問題。一系列事件接連發生,導致使用者與 DApps 本身皆蒙受巨大損失。

0xffffff. 前言

作為一個被長期討論的話題,「無限授權」(Unlimited Approval)隨著 DeFi 的蓬勃發展以及一些安全事件的發生而浮出水面。受到許多安全事件的啟發,我們再次嘗試從不同面向對「無限授權」進行全面調查。同時,我們也受邀參加 第 29 屆區塊鏈村會議 並討論此議題。

閱讀建議:

  • 如果您是以太坊新手,我們強烈建議閱讀整篇部落格。
  • 如果您是以太坊專家,且對於無限授權已具備相關經驗,您可以從 0x2 節開始閱讀。

0x0. 背景

在深入探討「什麼是無限授權?」之前,我想先為您回顧「什麼是 ERC20 代幣的授權(Approval)?」。

ERC20 代幣

在以太坊中,除了以太幣(Ether)之外,還有各種代幣在加密貨幣市場中流通並具有巨大的價值。ERC20 是最受歡迎的代幣標準。根據我們不完整的統計,在 CoinGecko(一家代幣價格聚合網站)和 Uniswap(目前最著名的去中心化交易所之一)上,已記錄了超過 5,600 個及 44,000 個 ERC20 代幣。

授權機制

授權過程主要涉及三個實體(發送者 sender支出者 spender代幣合約 token contract),以及 ERC20 標準中的兩個函數(approvetransferFrom)和兩個變數(balanceOfallowance)(如下圖所示)。

為了理解授權過程,我們提供下圖並說明 approvetransferFrom 函數如何改變代幣合約的狀態。

  1. (步驟 1) 作為初始狀態,發送者 在合約中持有 100 個代幣,而 支出者 沒有任何由 發送者 批准的 allowance(授權額度)。
  2. (步驟 2) 發送者 呼叫 approve 函數,授予 支出者 100 個代幣的權限。因此,allowance[sender][spender] 從 0 增加到 100,而發送者的 balanceOf 不會發生變化。
  3. (步驟 3) 最後,支出者 呼叫 transferFrom 將 80 個代幣從 發送者 移至自己帳戶。結果,發送者支出者balanceOf 皆已更新(分別為 20 和 80),支出者的授權額度降至 20。

現實中的三種授權類型

在現實世界中,根據授權金額,我們可以將所有授權分為三種類型。

  • 零授權(Zero Approval): 授權金額等於零。這基本上意味著使用者/發送者試圖撤銷其對特定平台/支出者的授權額度。
  • 無限授權(Unlimited Approval): 授權金額等於 uint256 的最大值(0xffff...ffff)或代幣的總供應量。這種授權類型常被許多 DeFi 平台(如交易所、借貸平台)使用。
  • 其他授權(Other Approval): 這種授權類型涵蓋了其餘情況。使用者通常基於平台或錢包所支援的修改功能進行此類授權。

0x1. 現實世界中的事件

前述提到的授權問題也導致了一些現實世界的事件。在我們的演講中,我們詳細介紹了其中兩個故事(UniCat、Bancor Finance)。如果您想了解更多關於這些事件的資訊,可以簡單地追蹤下方提供的連結:

0x2. 一些測量數據

在本節中,我們將從鏈外與鏈上兩個面向提供詳細的調查結果。為了更好地了解「無限授權」的現狀,我們以前端使用者的角色進行了測量。

現實中的授權過程

上圖顯示,前端使用者可能需要六個步驟才能完成一次授權交易。共有個主要實體(前端使用者、錢包、平台、代幣合約)。現在,讓我們一步步解析這個流程:

步驟 1, 2 : 首先,大多數前端(行動裝置、網站)使用者將他們的錢包連接到選定的平台並發送服務請求。

步驟 3: 接著,從平台到使用者的錢包,平台會構建帶有必要數據(最重要的是授權金額)的授權交易,並將其發送到使用者的錢包進行確認。

步驟 4, 5: 在收到授權交易後,錢包會為使用者顯示相應的資訊,並等待使用者的確認。

步驟 6: 一旦使用者確認交易,錢包就會將該交易發送到網路進行驗證。此外,經過驗證的交易將修改代幣合約的狀態(Allowance[User][Platform])。

(在接下來的章節中,我們將首先介紹每一種測量(鏈外和鏈上)的動機。然後,我們將展示我們在不同面向的測量結果與發現。)

鏈外調查

動機

在現實的授權過程中,我們可以輕易地發現前端使用者是直接與錢包和平台的用戶介面進行互動的。因此,我們選擇了 15 個知名錢包和 24 個 DeFi(去中心化金融)平台進行鏈外調查。

(調查結果匯總於下方的兩張圖中。)

此外,我們主要考慮他們在授權方面的解釋說明與靈活性:

  • 解釋說明
  • 錢包:1) 錢包是否顯示了授權交易的健全資訊(包括使用者、支出者、代幣和授權金額);2) 錢包是否給予特別警告或告知使用者關於「無限授權」的風險。
  • 平台:(準則 1)平台是否在其網頁 UI 上為授權交易提供了健全的解釋;(準則 2)平台是否通知使用者授權交易的存在;(準則 3)平台是否通知使用者有兩筆交易會依序執行。
  • 靈活性:無論是在錢包還是平台中,UI 是否提供修改授權金額的功能。

(在接下來的章節中,我們將展示上述兩個面向在錢包和平台上的表現結果。我們為錢包和平台分別選擇了兩個案例。)

0x222. 錢包:Metamask 與 Coinbase

我們將展示我們對 Coinbase 錢包和 Metamask (Chrome 擴充功能) 錢包的調查結果。根據 Google Play 商店的資訊(如下圖),CoinbaseMetamask 的安裝量都超過了 100 萬次。在某種程度上,Coinbase 從客戶那裡獲得了更多的評論,並且評分更高。

關於這兩個錢包的調查,我們使用它們來測試 Compound 平台上的代幣交換(swap)功能。請注意,Compound 平台預設為使用者進行無限授權。

錢包 1:Metamask

如下圖所示,當使用者查看由 Compound 構建的授權交易時,他們基本上可以看到完整資訊,包括支出者地址、批准簽名和授權金額(步驟 2)。此外,Metamask 甚至允許使用者透過「編輯」(Edit)按鈕來修改他們的授權金額(步驟 2、3、4)。

錢包 2:Coinbase

與 Metamask 錢包相比,Coinbase 錢包根本沒有呈現任何重要資訊。使用者只能在確認授權交易後才能查看更多詳情(下圖)。請注意,步驟 2、3、4 僅在授權交易處於「待定」或「已完成」模式期間之後才會顯示。因此,Coinbase 錢包隱藏了授權交易的必要資訊,並且沒有為授權金額提供任何修改功能。

0x223. 平台:Bancor 與 Curve Finance

在本節中,我們將比較 BancorCurve Finance。如下圖所示,根據 defipulse 的最新統計數據(2021 年 8 月 7 日),Curve FinanceBancor 是按總鎖倉量(TVL)計算的第一和第五大 DEX(去中心化交易所)。

為了對這兩個平台進行調查,我們將使用 Metamask 錢包來測試這兩個平台提供的交換功能。

平台 1:Bancor

當我們在 Bancor 上測試交換功能時,它解釋了進行授權交易的必要性(下圖),甚至為使用者提供了兩種選擇(無限/有限授權)。除了無限授權外,Bancor 中的有限授權只需要使用者在交換時實際將要使用的那筆 allowance 金額。

平台 2:Curve Finance

然而,在 Curve Finance 上發生了一件「有趣」的事。如下圖所示,當我們要求進行交換時,Curve Finance 的 UI 顯示**「請批准交換 10 USDT」**(下圖),但是 Metamask 收到的卻是一筆無限授權的交易。這絕對是向使用者傳達了誤導性資訊。

後來,當我們試圖與 Curve Finance 確認這一點時,他們承認了我們的擔憂,並表示這是因為**「使用者不喜歡每一次交易都要重新授權」**(下圖)。

Curve Finance 類似,Yearn Finance 的 UI 也存在相同的問題。(我們也在我們的 演講 中提及並展示了證據。)

0x23. 鏈上調查

0x231. 動機

為了進一步了解鏈上「無限授權」的情況,我們收集了所有交易(截至 2021 年 4 月 30 日)以繼續我們的研究。如下圖所示,如今「無限授權」的數量成長得非常快。在我們的調查中,我們發現 UniswapV2 的推出似乎是刺激「無限授權」成長的主要因素。並且,我們將根據我們的測量結果在這一點上進行更多說明。

同時,為了代表代幣和平台來探索「無限授權」(因為它們是與此問題最具關聯性的術語,而非使用者本身),我們將從兩個面向來進行調查:

  • 「無限授權」的分佈
  • 風險分析

0x232. 「無限授權」的分佈

為了幫助理解以下圖表,我們將首先解釋圖中提到的每個術語:

  • Y 軸(最大授權比率):數值越大 -> 所有授權交易中「無限授權」的百分比越高
  • X 軸(活躍度):數值越大 -> 平台或代幣越活躍。活躍度取決於授權交易的數量以及第一次和最後一次授權交易之間的時間差
  • 點大小:尺寸越大 -> 該代幣或平台涉及的授權交易數量越多

(下方的兩張圖僅顯示了參與授權交易最頻繁的前 1000 個代幣/平台)

(平台)

(代幣)

平台: 觀察平台的圖表,UniswapV2 在這三個術語上明顯主導了其他任何平台。這就是為什麼我們聲稱**「UniswapV2 的推出似乎是刺激『無限授權』成長的主要因素」**。

代幣: 至於分佈情況,USDC、USDT 和 DAI 在上述定義的三個術語中表現最好。這些代幣都是穩定幣,這是有道理的,因為穩定幣通常用於加密市場的交易。至於其他標出的代幣(前 10 大代幣),它們在最大授權比率上非常相似。

0x233. 風險分析

根據先前的結果,我們選擇了 USDC、USDT、DAI(前 3 大代幣)和兩個平台(Bancor、UniCat)來進行風險分析。同時,我們也定義了兩個術語(如下圖所示)來幫助釐清被授權代幣的風險。

風險金額(Risk Amount)

  • 對於代幣,風險金額等於透過呼叫 transferFrom 函數可能被轉移的代幣總額。
  • 對於平台,風險金額等於透過呼叫 transferFrom 函數可能被轉移的單一代幣的總額。

風險率(Risk Rate)

  • 對於特定代幣,風險率代表風險金額占該代幣總供應量的百分比。

代幣: 如下圖所示,USDC 和 USDT 在這一年半的時間裡表現得相當穩定(它們的風險率約為 10%)。DAI 在年中經歷了劇烈下降,最終趨於穩定(同樣約為 10%,但波動較大)。這種現象可能顯示了一些特定事件或 DAI 的運作機制。因此,我們仍需進行一些工作來探究其原因。

平台: 關於平台的風險分析,我們將呈現 Bancor(使用 BNT 代幣)和 UniCat(使用 UNI 代幣)的風險金額趨勢圖(如下圖)。

Bancor 的趨勢圖顯示了瞬間的成長與下降。這實際上完美解釋了團隊有多麼迅速地將他們可被利用的代幣從有缺陷的合約轉移到安全的地方。

至於 UniCat 的趨勢圖,我們證實了一些明顯的下降實際上是由 UniCat 的後門攻擊所引起的。

0x3. 現有解決方案

如前所述,「無限授權」是生態系統中長期存在的話題。透過各種討論,實際上已經提出了一些改進授權過程的解決方案:

  • ERC777
  • EIP2612

在進入解決方案之前,我們想再次提醒您「無限授權」的根本動機:

  • approve/transferFrom 都需要兩筆交易。
  • 自定義授權迫使使用者在每次交易或存入前都要進行授權(這意味著需要支付更多的交易手續費)。
  • 平台希望透過要求一次性的無限授權來使使用者體驗最大化。

0x31. ERC777

作為 2017 年提出的代幣標準,ERC777 具有以下幾點用於改進 ERC20 代幣的授權過程:

  • 使用者可以「授權」操作員(如交易所)以期望的金額轉移其代幣。
  • 使用者不必重複提交授權交易。
  • 使用者不必擔心「無限授權」的風險。

總之,透過 ERC777,使用者可以與任何授權操作員實現原子化購買。

然而,ERC777 的缺點也很明顯:

交易手續費較高,因為該標準中應用了 hooks(更多 細節)。 使用者必須選擇值得信任的操作員(這又把問題丟回給了使用者)。

0x32. EIP2612

關於 EIP2612,在該提案中,作者指出使用者可以使用簽名訊息進行交易驗證,這樣使用者就不需要支付任何交易費用來修改他們的 allowance。更直接地說,使用 EIP2612 後,授權交易變成了免費的。此外,該提案目前正被 UniswapV3 用於借貸提供者代幣

0x4. 結論

總之,「無限授權」確實降低了使用者執行多次授權交易的成本。然而,透過我們的調查,一些平台和錢包在便利性與安全性的博弈中仍然假裝無害。更糟糕的是,其中一些甚至試圖透過顯示錯誤資訊來誤導使用者。因此,我們建議平台和錢包應確實考慮開發更安全的 UI 或協議,從一開始就保護使用者,而非使用「無限授權」。作為 DeFi 的使用者,安全意識的建立不應是從遭受攻擊後才開始,而應從一開始就具備。我們相信,構建一個安全且繁榮的以太坊環境,不僅是社群的責任,更是我們每一個人的責任。

關於我們

https://www.blocksecteam.com

[email protected]

Twitter: https://twitter.com/BlockSecTeam

Medium: https://blocksecteam.medium.com/