本文详细解释了MetaMask中的token approval概念,即授权去中心化应用(dapp)访问和移动你的代币。
目录
在 web3 中,你会遇到各种类型的交易,每种交易在 MetaMask 确认时都可以识别。
理解它们是什么以及如何解读其含义,是在 web3 中保持安全的重要部分。挑战在于,这些屏幕上显示的大量信息要么不是为人类直观阅读而设计的——例如我们识别为账户或合约地址的长十六进制数字——要么难以解读。
代币授权 是你将遇到的最常见的交易类型之一,因此了解它们至关重要。在 web3 中,尤其是在像 MetaMask 这样的 自托管 钱包中,你完全掌控一切,并对自己的所有行为承担最终责任。这就是为什么当你确认代币授权时,必须确切知道自己在签署什么。
简而言之:允许 dapp 访问并从你的钱包转移特定类型的代币。
如果你经常使用去中心化交易所(DEX)和 DeFi,这些提示通常会出现在 MetaMask 中。大多数平台依赖你将代币存入或转移给他们,原因各不相同。然而,点击“转移”、“存入”或“移动”等按钮不会有任何作用,除非你作为钱包拥有者给予了 dapp 相应的权限。
这就是代币授权必要的原因:它们使 dapp 能够代表你访问和转移你的代币。
MetaMask 中出现的代币授权提示大致如下:

让我们来分析一下。请注意:
如果你授予 dapp 访问 1,000 USDT 的权限,那么每当你要求它转移时,它就可以进行转移,而无需再次发起类似的代币授权交易。这适用于 dapp 已转移了 1,000 个代币之前,之后你需要签署另一笔交易。
但幕后发生了什么?实际上,当你批准对某个代币的访问时,在许多情况下,你是在同意 dapp 调用 transferFrom 函数,这是 ERC-20 标准中定义的函数之一。(在编程中,“调用”函数就是使用它。)它允许 dapp 将指定数量的代币从你的钱包转移到他们的钱包。数量由相应的 approve 函数决定——你猜对了——当你签署代币授权时,你为该函数提供输入值。
当你在 MetaMask 中看到授权确认时,可以亲眼看到此过程。如果你向下滚动到“查看完整交易详情”并点击,可以看到列出的“Approve”函数:

“授权给”字段为你提供了另一个机会,可以复制请求授权的合约地址,并在区块浏览器上验证其合法性。
信息
并非你遇到的每个代币都像我们上面描述的那样工作,上述描述与 ERC-20 代币相关。这种 approve + transferFrom 的机制不适用于实现了 EIP-3009 模型的代币,其中最著名的例子是稳定币 USDC。
使用 EIP-3009,签署的是 permit 交易,而不是 approve 交易。它将授权和转移捆绑在一笔交易中,这意味着你实际上无需为授权支付 Gas,只需支付转移代币的 Gas。
想要更多关于授权的信息?请参阅我们关于此主题的博客文章,深入了解。
掌控你的资产并了解哪些 dapp 可以访问它们,永远不会错。有几种方法可以撤销现有的代币授权:请参阅我们的文章了解更多详情。
通常,代币授权请求会要求访问如此多的代币,以至于实际上是无限的——只需看上面的截图,Uniswap 请求访问 1.1559 个代币。许多合法的 dapp 这样做是为了减少你每次在 dapp 上使用代币时重新授权的需求和相关交易成本。以 DEX 为例:如果你进行大量代币交换,你不希望每次都额外点击和支付 Gas 费用。
然而,请求无限数量的代币也是许多恶意网站从毫无戒心的 web3 用户那里窃取的方式。如果你已经遵守了我们所有的推荐安全提示,包括将助记词保持离线状态且绝不分享,但仍然可能被利用,这对用户来说尤其令人沮丧。
为确保你不会授予恶意行为者访问你所有代币的权限,我们建议你遵循以下关键原则(摘自我们的博客文章):
如果你不熟悉以太坊智能合约代码,setApprovalForAll 可能看起来有点令人困惑,但如果你与 dapp 交互,了解它是有价值的。
这是 ERC-721 和 ERC-1155 标准(专门针对 NFT)中的一个函数,它允许你授予或撤销其他地址管理与特定智能合约相关的你的所有 NFT 的能力。
此函数最常见的应用之一是 NFT 市场。当你在 OpenSea 等平台上出售 NFT 时,你需要允许 dapp 在成交时访问该 NFT 并将其转让给买家。此类平台通常请求访问所有该类型的 NFT(即来自同一智能合约)。对于作为用户的你来说,这通常无关紧要——我们信任像 OpenSea 这样的大型平台不会越界并移除它们不应该移除的 NFT。
而且,就像我们说的,通常事情到此为止。然而,与 web3 的许多领域一样,这为诈骗者提供了潜在突破口;要么通过利用某个现有 dapp(许多钱包已经授予它访问所有某类型代币的权限),要么通过引诱你授权给一个恶意 dapp。
这就是为什么 MetaMask 扩展在签署 setApprovalForAll 交易时,尽可能清晰地表明你同意什么。它看起来是这样的:

还要注意,你可以选择“验证合约详情”。点击此选项,你将进入一个页面,显示以下名称(如果有的话):
MetaMask 从公开可用的数据中检索此信息,如果你想进一步调查,还可以将每个合约的地址复制到剪贴板。此时需要注意哪些事项,请参阅我们的关于验证智能合约安全性的文章。
鉴于此函数允许访问与合约相关的所有代币,当你看到它时,应该想到两件事:
此函数的一个常见的非合法应用是,恶意 dapp 要求你执行 setApprovalForAll 来领取 NFT 空投:你不应该签署这种授权来接收任何东西。不要被愚弄!
我们无法保护你免受使用 web3 固有风险的影响:作为自托管钱包的拥有者,责任在于你。然而,通过这样的更改,我们正在努力为你提供所需的信息,以保持警惕并清楚了解你在做什么。
有关代币授权以及无限授权的陷阱的更多阅读,请参阅以下内容:
- 原文链接: support.metamask.io/stay...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码