approve 是 ERC20 代币才有的一种操作,在操作一些很不熟悉的 DeFi 产品的时候,我们需要了解下到底 approve 做了什么,以及如何在体验完了那些可能不安全的产品后撤销 approve。

作者:开放金融基金会(DeFi.org),专注于去中心化金融生态的非营利组织

到处都有的 approve

可能才看到 approve 这个词语,你会觉得和自己没有任何关系。但如果你是 Defi 产品的用户,那么你一定执行过很多次 approve 操作了。

比如在 MakerDao 里面, unlock Daiunlock MKR 的操作都是 approve :

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

比如在 Compound 里面的 enable 操作:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

比如在 Uniswap 里面的 unlock 操作 :

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

上面提到的这些都是 approve 操作,它们的共同点是,当你要进行这些操作的时候,在 MetaMask 弹出来的窗口里面,我们会看到写了一个 APPROVE

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

上面提到的这些 Defi 产品,都是比较可信的,也正因为如此,原本其实很危险的 approve 操作 也可以变得很无所谓了。

但在操作一些很不熟悉的 Defi 产品的时候,我们需要了解下到底 approve 做了什么,以及如何在体验完了那些可能不安全的产品后,撤销 approve

这篇教学会讲到的内容

  • 到底 approve 做了什么?
  • 如何撤销 approve

到底 approve 做了什么?

approveERC20 Token 才有的一种操作。如果你已经玩过一些 Defi 产品了,那你用过最多的一款 ERC20 Token 很大概率可能是 Dai,我们下面就以 Dai 为例来说明。

眼睛男想从自己的账户,转一些 Dai 给胡子男:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

上面这个操作,眼镜男其实是和 Dai 这个 ERC20 的智能合约在交互,他向智能合约发起这样的请求: 请从 眼镜男 的账户里转一个 Dai 给 胡子男,如图:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

智能合约收到了眼镜男的请求,会做一些验证:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

这里我们写了其中的两个验证条件:

  • 眼镜男的账户里,必须要有足够多的 Dai
  • 发起请求的,是眼镜男本人

这里我们要特别注意这里提到的第二个条件,因为这是 approve 产生的深层原因。

我们来看一下,眼镜男 如果尝试使用一个 Defi 产品,比如 uniswap: 眼镜男想要用 1 Daiuniswap 上换一点 ETH。这个过程其实是这样:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

眼镜男向 uniswap 的智能合约发起这样的请求,uniswap 的智能合约会做什么呢? 它当然首先要从 眼镜男 的账户里面拿到 1 Dai,所以 uniswap 会向 Dai 的智能合约 发起请求,要求 将眼镜男账户上的 1 Dai,转到 uniswap 的账户上

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

和上面一样, Dai 的智能合约需要验证两件事情:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

而这里的第二条就不成立了,因为这个请求并不是直接由 眼睛男 发起的,而是由 uniswap 发起的。

不过没有关系的是,Dai 的智能合约会尝试验证另一个条件,如果是成立的,也可以让这个操作成功:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

看到这里,你就明白 approve 的含义了。

approveERC20 Token 都有的一个功能:

  • 允许另外一个帐号(可以是个人帐号,也可以是智能合约帐号)使用你的部分资产

看到这里,你大概能明白,为什么 approve 是件很危险的事情了,你是否会很担心,uniswap 能够随便操纵你的资产?

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

虽然你 approveuniswap 可以随便操纵你的 Dai,但是 uniswap 的代码是开源的,你可以阅读它的代码,发现它的代码里面,规定了在什么样的情况下可以操纵你的 Dai

那么,结合上面的内容,我们马上能够得到这样一些结论:

  • 如果一个 Defi 产品的智能合约不是开源的,却又要求你 approve,你一定要非常慎重。
  • 即使一个 Defi 产品的智能合约是开源的,如果它没有经过较多的第三方审计,那么还是可能出现 bug,导致你的资产能够随意被操纵。所以,如果你长时间不会操纵,可以先 撤销你的 approve

用例子来研究 approve 操作

在演示如何 撤销你的 approve 之前,我们先以 uniwap 为例子,看下 approve 操作背后发生的事情:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

uniswappool 的时候,需要首先 approve dai(也就是允许 uniwap 的智能合约操纵你的 Dai),也就是点击这里的 unlock,然后会看到弹出的 MetaMask 窗口:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

你应该已经注意到那个很大的数了,1.157920892373162e+59,对于不熟悉的朋友,我们简单地说名下,这个表示的是 1.157920892373162 乘以 10 的 59 次方。 当然,你的账户里面肯定没有那么多 Dai,这里只是告诉 Dai 的合约说: 我们最多允许 uniswap 的智能合约 操纵我们的 1.157920892373162 乘以 10 的 59 次方 个 Dai,由于我们的账户里面没有那么多 Dai,那么这个其实等价于说: 我们允许 uniswap 的智能合约操纵我们账户里面的所有的 Dai.

我们点击 confirm,确认这笔交易,然后,我们等待交易确认,在 uniswap 的右上角,我们点击我们的地址:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

在弹出的菜单里面,我们点击这里的交易链接,跳转到 etherscan 来仔细看下 approve 操作:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

我们首先注意到,这里的 approve 操作,我们是向 Dai 的智能合约发起的这个请求,所以你会看到 Dai 的智能合约地址出现在了 To 后面。

接着,我们点击这里的 Click to see More,可以看到这里面的更多的细节:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

我们来简单地说下 input data 的部分:

  • Function: approve(address guy, uint256 wad): 简单地说来,当我们向智能合约发起请求的时候,我们需要指明我们要做什么。这里表示的是,我们要进行 approve 操作(如果用更加准确地术语: 这笔以太坊交易调用了 Dai 智能合约的 approve 函数)。
  • 这里的 [0] 后面的内容,也就是 00000000000000000000000009cabec1ead1c0ba254b09efb3ee13841712be14 里面的 后 40 位 表示的是我们要 approve 的 个人 / 智能合约 地址。09cabec1ead1c0ba254b09efb3ee13841712be14 就是 uniswap 智能合约 的地址了
  • 这里的 [1] 后面的内容,也就是 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 是我们要允许 uniswap 可以操纵我们的 Dai 的数量,其实这就是上面的 1.157920892373162 乘以 10 的 59 次方 的另一种写法(16 进制)

撤销你的 approve 操作

那么要怎么 撤销 approve 操作 呢?

有的 Defi 产品,在它们的网站上提供了 lock 功能,比如 MakerCDP portal

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

其实,对于没有深入了解 approve 原理的用户来说, unlock 功能可能反而会造成困扰,从用户体验的角度来说,有些产品在设计的时候,不会给出 lock 这个功能,比如在 uniswap 上面,我们就没有看到 lock 这个功能:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

那我们应该怎么撤销这次 approve 操作呢?

让我们来简单地回顾下我们上面的 approve 操作做了什么:

  • 首先,approve 操作是向 Dai 的智能合约发起的请求
  • 其次,approve 操作里面,我们允许 uniswap 的智能合约最多操纵我们 1.157920892373162 乘以 10 的 59 次方Dai

撤销 approve 操作就可以等价于是这样的:

  • 首先,撤销 approve 依然是向 Dai 的 智能合约 发起的请求
  • 其次,approve 操作里面,我们允许 uniswap 的智能合约最多操纵我们 0Dai
    好了,方案有了,让我们来试试吧。

我们回到刚刚的 etherscan 的页面,我们点击这里的 Dai 合约的地址,跳转到 Dai 智能合约的地址对应的 etherscan 的页面:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

我们点击上面的 Contract,跳转到合约的页面:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

注意到这里有个 write contract,可以理解为这个就是我们要和这个合约进行交互:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

接下来,就和使用其他 Dapp 一样,我们需要连接到我们的钱包,我们点击这里的 Connect to Web3

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

连接之后,我们在下面找到 approve

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

我们现在要 撤销之前对 uniswap 的 approve,我们输入上面拿到的 uniswap 智能合约 的地址 09cabec1ead1c0ba254b09efb3ee13841712be14,注意,输入的时候,要在地址前面加一个 0x,也就是 0x09cabec1ead1c0ba254b09efb3ee13841712be14; 然后还要输入 approve 的数量,这里我们输入 0, 同样,要在前面加一个 0x 就成了 0x0

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

然后我们点击 write,在弹出的 MetaMask 窗口里面,我们看到:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

主要到,这里 approve 下面的 0, 这正是我们想要的,我们点击 confirm 确认这笔交易:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

然后,我们会看到 write 旁边多出了一个 View Your Transaction 按钮,我们点击这个按钮,可以跳转到我们的这次 approve 操作的 etherscan 页面:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

现在,让我们回到 uniswap 的页面看下:

零基础入门 DeFi:手把手教你操作 approve 确保资产安全

unlock 按钮又回来了,说明我们 已经成功撤销了 对 uniswap 智能合约的 approve 操作