# 一文读懂合约授权，保护 #web3 资产安全 #NFT #Security #crypto #tutorial 

By [littleflyingpiggy](https://paragraph.com/@littleflyingpiggy-2) · 2022-10-28

---

如果觉得我的内容对你有帮助，欢迎关注我的[推特账号](https://twitter.com/flying_piggy1)和小红书[账号](https://www.xiaohongshu.com/user/profile/5dcdf00f000000000100410b?xhsshare=CopyLink&appuid=5dcdf00f000000000100410b&apptime=1672565199)：飞猪聊web3，获取更多web3的安全知识、基本技能和实用资讯

如果需要更具体、系统、有针对性的教程指导，欢迎大家私聊咨询哦

![](https://storage.googleapis.com/papyrus_images/0bdc98b42f6e3d4c0558691d4d2a50f1c6c4f7a506892a035fd83e393f8649fb.png)

从之前我分析过的各种BAYC被盗案例中，大家其实可以发现，在助记词和私钥没有泄露的情况下，造成被盗的操作最主要的两个操作就是：不当授权+签名。

在本篇文章中，我会用尽量直白通俗的语言来给大家讲解什么是授权、为什么需要授权、授权存在的风险以及如何避免错误授权等问题。希望能帮助大家更加深入的理解授权操作，避免不当授权造成的资产损失。

关于签名，后续我会再单开一篇文章来解释，感兴趣的小伙伴欢迎关注我，点赞转发留言都是对我持续创作的鼓励哦

那么让我们先把授权这个有点陌生的词汇先放到一旁，先回忆一个生活中常见的基金定投的场景，定投基金是怎样实现的呢？首先基金公司会开发一个程序，我们在程序上存入一定的资金，设定定投条件，达成之后，程序就会自动用我们存入平台的资金进行买入的操作。

以上这个场景就是现实世界里使用程序代替用户操作的一个缩影，虽然看似方便好用，但却存在一个致命弱点，就是基金公司作恶成本低。试想一下，用户放在程序中的资金理论上基金公司是不是可以随便动用？虽然有诸多限制，但实际上只是不做而非不能做，这中间的差别大家可以细细品品。如果还没有理解这个区别，可以回忆一下之前被传的沸沸扬扬的xx村镇银行的事情。

在以上案例中，基金公司、村镇银行就是web2世界里中心化机构（中间商）的典型代表，用户享受着他们提供的便利服务的同时也变相授予了他们作恶的能力，但是这样既不能很好的维护用户利益，也有悖公开透明的原则。Web3世界的基础—区块链技术的出现，在很大程度上改变了这一点，用户的资产由构建在密码学的加密共识机制和加密算法来保管，无需中间商参与。在web2时代，用户只能祈祷中间商不作恶，但是在web3时代，直接从技术上掐断了中间商作恶的可能性，从不做到不能做的巨大差别其实就是我们要积极拥抱web3的原因。

理解了web3的重大意义之后，再从原理上给大家解释一下这中间的变化是如何发生的。人类社会的财富体系其实就是一个巨大的记账系统，在web2时代，由于技术所限，只能选出一些有公信力的机构来担任记账员的角色，如券商、金融机构等；而进入web3的世界，由于加密技术的发展，可以由建立在加密算法之上的共识机制来记账，所以就完全无需中心化的记账员这一角色了。关于什么是区块链、什么是共识机制、以及钱包的原理，大家可以参考[本条内容](https://twitter.com/flying_piggy1/status/1570607691848126464)

在大家理解了区块链的去中心免信任的记账方式和web3资产其实是由私钥控制的之后，要理解授权的概念就会更加容易。

在web2的世界中，要进行基金定投我们可以利用基金公司开发的程序；在web3的世界中，要实现各种自动化的操作，我们也有一个工具叫做智能合约，也是可以在满足一定条件后自动执行的，我们可以把智能合约理解成web3时代的应用程序。任何程序的运行都需要有一定的运行环境，智能合约也不例外，智能合约运行的环境就是以太坊网络（注1）。

在web2里购买基金股票的操作大家都已经很熟悉了，那么在web3里，如果想要用智能合约实现这一操作又是怎样一个流程呢？这里我以在uniswap上用APE购买ETH为例进行说明（注2）：uniswap开发了一个币币兑换程序（智能合约），用户通过账号（钱包地址）可以登陆程序并使用其中服务；但是web3资产是由助记词控制的，也就是如果用户不同意，uniswap是没法直接用的，不像web2的金融机构，你同不同意都可以用。那么用户想要在uniswap上操作需要怎么做呢？就要用到本篇文章的主题授权（approve）这一操作。

授权字面意思是给与权限，在上文场景中，用户需要先授权给uniswap兑换合约使用自己ETH的权限，这样uniswap才能完成后续兑换的操作（注3）。

授权中其实蕴含着很大的风险，因为授权意味着同意别人来使用你的资产，正经的项目方当然不会随便未经你同意而调用，比如你虽然授权了uniswap调用ETH的权限，但如果不继续发起兑换的操作，那么你的ETH还是会好好的呆在你的钱包里，不会被转移；但是如果不小心授权给了骗子，那么被授权的资产就等于全部打了水漂，因为骗子会第一时间把所有被授权的资产全部转移，绝对不会给失主取消授权的时间。

授权既然是如此凶险的一件事，所以在操作授权时一定要提高警惕，认真检查，下面我会针对token和NFT授权的不同注意事项分别进行解释：

\*\*授权token：\*\*要着重检查4个地方，进行1个设置

**4个地方**

\*\*1）发起授权请求的对象是谁？\*\*下图是uniswap的官网，如果是来自其他陌生网站就要提高警惕了；

\*\*2）授权给与的对象是谁？\*\*要在区块浏览器中检查给与授权的对象是否是我们想要授权的对象。因为下图是在uniswap上操作，所以图中的授权对象是uniswap的dex合约，如果是某些不知名的合约甚至是被标记的钓鱼合约或钓鱼地址，那么绝对不要授权

\*\*3）看授权哪个token？\*\*图中是APE，因为我要用APE兑换ETH，如果要授权的不是想要操作的token，就一定有问题

\*\*4）授权的详情是什么？\*\*这是来自uniswap的授权请求，要求给尾号Fc45的合约调用该地址上所有APE的权限

![](https://storage.googleapis.com/papyrus_images/d082bb60479495fb988957dc83e0c3e00fcf97b2f2970522988401187d03cea1.png)

![](https://storage.googleapis.com/papyrus_images/b49f0359823f9d5ef507e673ac9f40059b0a9e6d97a9d9f9754643e829a1293b.png)

**1个设置**

要在上图编辑权限的部分进行授权额度的限制，就是设定合约可以使用token的限制，这一步操作对于资金体量巨大的用户来说是非常必要的，因为如果不设定，就意味着地址中所有对应token都有被转移的风险。

![](https://storage.googleapis.com/papyrus_images/67389f8a7fc37194d1d8d4201315ad0081eb5869a3786ea242600852f0893422.png)

哪怕授权的是可靠的服务商，比如uniswap，也不能保证他们的合约没有漏洞，而一旦出现漏洞，恶意攻击者控制了合约，就有权转移走用户已授权的全部token，具体案例可以参考之前tp钱包旗下dex应用[Transit Swap被盗案例](https://twitter.com/flying_piggy1/status/1576775818499395585) ，以及[BAYC 8973被盗案例](https://twitter.com/flying_piggy1/status/1585172289859227650)中3w+的USDC被盗原因分析

\*\*授权NFT：\*\*也要着重检查4个地方

\*\*1）发起授权请求的对象是谁？\*\*图中是os的官方网站opensea.io，如果是其他陌生网站就值得引起我们的注意了；

\*\*2）授权给与的对象是谁？\*\*要在区块浏览器中检查给与授权的对象是否是我们想要授权的对象。因为图中是在os上操作，所以图中的授权对象是os的proxy合约，如果是某些不知名的合约甚至是被标记的钓鱼合约或钓鱼地址，那么绝对不要授权

\*\*3）授权哪个系列？\*\*图中是要出售PFTP系列，如果要授权的不是你想要出售的NFT，那么就有问题了

\*\*4）授权详情是什么？\*\*图中是来自os的授权请求，要求给尾号为3c71的合约调用PFTP系列的全部权限（setApprovalForAll）

![](https://storage.googleapis.com/papyrus_images/ee114090cfa4bd09568c0db5a6ff74f7b7b24575724bff2004ed16f5219e412d.png)

上图是在os上出售NFT的正常授权页面，下图则是在钓鱼网站高危授权的页面：在一个显示dota2的网页上进行操作，结果钱包弹出的信息是来自另一个陌生网站的授权请求，要把BAYC授权给一个陌生的合约，浑身上下都透露出可疑的气味，是绝对绝对是不能确认的。

![](https://storage.googleapis.com/papyrus_images/7cf6b111727f1704a5c293b8983e9627b0b6823c6681550e0d8f0e11f94198d4.png)

之所以会出现错误授权token或者NFT的情况，大多是用户急于操作，没有注意钱包的提示信息，结果导致了错误的授权。所以要避免出现错误授权，最重要的就是要仔细阅读钱包弹出的提示信息，仔细核对授权的4个关键信息：谁发起、授权什么、授权给谁、交易详情。如有跟目标操作不一致，要赶快停止。

同时还要养成设置授权额度以及定期清理不使用的授权的习惯，推荐1个取消授权的工具给大家[revoke](https://revoke.cash/)，为了方便中文区的用户使用，这个网站还推出了中文版本是不是很贴心呀？

![](https://storage.googleapis.com/papyrus_images/d9460bcf4d3a94dea929b1ff7ec0d7e93cb1921a43ea2e4fe1ca393ef453845c.png)

如果觉得我的内容对你有帮助，欢迎关注我的[推特账号](https://twitter.com/flying_piggy1)和小红书[账号](https://www.xiaohongshu.com/user/profile/5dcdf00f000000000100410b?xhsshare=CopyLink&appuid=5dcdf00f000000000100410b&apptime=1672565199)：飞猪聊web3，获取更多web3的安全知识、基本技能和实用资讯也欢迎感大家点赞、留言、转推，你们的鼓励都是我继续创作的动力~

注1：确切的说，智能合约的运行环境是各种公链网络，但因为以太坊是第一个大规模应用的智能合约应用平台，所以我们通常用以太坊来指代智能合约平台。

关于公链的解释，大家可以参考[本条内容](https://twitter.com/flying_piggy1/status/1569863675615539202)

注2：Uniswap是最大的去中心化交易所，ETH是以太坊的原生代币，WETH是ETH的ERC20形式，可以在各种智能合约中使用，关于去中心交易所和ERC20代币形式，后续会陆续更新，感兴趣的可以先关注我哦

注3：严格意义上讲，授权交易分两步，首先是告诉涉及的代币合约B，未来会有我授权过的智能合约A来取走某数量的代币；其次是当满足了交易触发条件后，合约A来执行取走某数量的代币的操作。也就是只有先授权才能进行后续操作，但授权之后也可以不执行后续操作，合约A只是保留权限也是可以的。

---

*Originally published on [littleflyingpiggy](https://paragraph.com/@littleflyingpiggy-2/web3-nft-security-crypto-tutorial)*
