LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 零基础入门DeFi:手把手教你操作approve 确保资产安全

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

2020-04-22 洁sir 来源:区块链网络

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

到处都有的approve

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


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


比如在Compound里面的enable操作:


比如在Uniswap里面的unlock操作:


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


上面提到的这些Defi产品,都是比较可信的,也正因为如此, 原本其实很危险的approve 操作也可以变得很无所谓了。但在操作一些很不熟悉的Defi产品的时候,我们需要了解下到底approve做了什么,以及如何在验证完了那些可能不安全的产品后, 撤销approve 。

到底approve 做了什么?

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


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


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


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


这里我们写了其中的两个验证条件:
眼镜男的账户里,必须要有足够多的Dai。
发起请求的,是眼镜男本人。


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


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


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


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


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


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


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


approve是ERC20 Token都有的一个功能:允许另外一个帐号,可以是个人帐号,也可以是智能合约帐号,使用你的部分资产。


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


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


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

用例子来研究approve 操作

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


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


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


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


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


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


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


我们来简单地说下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功能,比如Maker的CDP portal :


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


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


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


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


那撤销approve操作就可以等价于是这样的:
首先, 撤销approve依然是向Dai的智能合约发起的请求。
其次, approve操作里面,我们允许uniswap的智能合约最多操纵我们0个Dai。


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


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


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


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


连接之后,在下面找到approve :


我们现在要取消之前对uniswap的批准,输入上面拿到的uniswap智能合约的地址09cabec1ead1c0ba254b09efb3ee13841712be14,注意,输入的时候,要在地址前面加上一个0x,也就是0x09cabec1ead1c0ba254b09efb3ee138我们输入0,同样,要在前面加一个0x就已经0x0:


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



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



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


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

——感谢阅读,全文完——

原文链接:https://medium.com/mrblock-tw/why-so-many-approve-in-defi92571c8

—-

编译者/作者:洁sir

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...