去中心化交易所的操作逻辑
在上周五疑问解答中谈到去中心化交易所的安全时,关于去中心化交易所的风险,我提到了两点,其中一点我是这么写的:
“一是个人授权去中心化交易所转账自己的资产后,如果交易所权限泄露,可能黑客会利用权限偷个人的资产。这个问题的解决方法就是用一些权限取消工具(比如revoke.cash)取消交易所的权限”
没想到好巧不巧,就在周末,知名的去中心化交易所寿司(Sushi)就发生了这样的权限泄露事故。
因此,我觉得有必要和大家分享一下我们在去中心化交易所进行交易时,整个过程到底是怎么样的以及在这个过程中交易所的合约和我们的钱包到底进行了什么动作。
假设我们的小狐狸钱包里面有100个DAI,我们想直接用小狐狸钱包中的DAI在Uniswap上换成UNI代币。
这个过程大概包括下面这些步骤:
第一步:我们会登录Uniswap的官网,点击网站上“连接钱包”的按钮。
第二步:小狐狸钱包会弹出对话框提示我们登录签名。这时,我们在小狐狸钱包中输入密码并确认消息无误后,点击确认签名就正式把我们钱包的一个地址和Uniswap连上了。
第三步:我们在Uniswap上选好准备卖出的代币“DAI”和准备买入的代币“UNI”,并在卖出的“DAI”前面填入卖出的金额“100”。
接下来如果我们再继续动作,就涉及到Uniswap合约和我们的钱包进行代币交易的交互了,它是去中心化交易所进行交易的关键动作。
这个动作是Uniswap合约要从我们的这个钱包地址中拿走100个DAI,并把换到的UNI发到我们的钱包地址里。
看到这里可能有读者会问了:凭什么Uniswap能从我们的钱包里直接拿钱?不经过我的允许就能这样吗?
这里我们必须说:现在大部分去中心化交易所还就是这样——它们就会从我们的钱包里拿钱。只不过拿钱之前还需要我们同意它拿。
所以接下来,Uniswap就要进行这样一个动作:弹出一个交易,让我们授权它从我们的钱包里拿钱以及授权它能够拿多少。
在老版本的Uniswap中,它为了操作上的简便,会让我们默认授权它从我们的钱包里拿任意数量的代币,具体到这个例子就是授权它从我们的钱包里拿任意数量的DAI,100个、1000个、10000个…没有上限。
我们再回到上面第三步。
上面第三步做完,我们会在Uniswap网站上看到整个页面最底下的那个大按钮显示“Approve”。这个“Approve”按钮就是让我们授权它从我们的这个钱包地址里拿DAI。
所以接下来就是第四步:我们点击这个按钮,小狐狸就会弹出一个对话框,我们点击后,老版本的Uniswap就能从我们的这个钱包地址中拿任意数量的DAI了。
这笔交易完成,下面那个大按钮就变成了“Swap/兑换”。
第五步:点击“Swap/兑换”,我们钱包里的DAI就被拿走了100个,并且换到的UNI代币就发到我们的钱包地址里。
这里再和大家强调一次:在上面第四步,一旦我们授权后,老版本的Uniswap从此就可以随意从我们的这个钱包地址里任意拿走DAI了。
这个权限是相当危险的,它意味着一旦这个权限被黑客偷走了,黑客就可以从我们的钱包地址中随时随地把任意多的DAI转走。
老版本Uniswap的这个实现方法也是目前大多数去中心化交易所实现的方法。所以通常去中心化交易所对这个权限的管理都会非常严格。
可万一出现问题(比如这次寿司的权限就泄露被盗了),那所有曾经授权过这个去中心化交易所拿走代币的那些钱包地址就都危险了。
对这个问题我们最好的办法就是在交易完成后取消给这些交易所的授权——–也就是交易完,就把给它们的授权拿回来,不许它们再从我们的钱包里拿代币。
目前有一些知名工具提供了这样的操作,比如revoke.cash。
所以我建议大家以后但凡和去中心化交易所交易后,就进行这样的操作。
回到寿司的例子,由于这个漏洞是大概4天前引入的,因此我建议这4天和寿司交易过的用户赶快进行这样的操作。
另外,我前面提到Uniswap时总是说“老版本”,因为就我和Uniswap最新的交互看,它已经进行了修改,每次交易时会让用户选择授权多少,而不是像老版本那样默认授权无限制拿币。
希望大家安全交易。
发表回复