正面|全维度深入解析: Uniswap的正面与背面( 二 )


Uniswap继承了以太坊在2017年1co的衣钵,让所有的项目都可以上交易所,相当于在2017年所有项目方都可以进行募资,让新韭菜了解到币圈的疯狂,更是让老韭菜对于币圈做了一次再次审视。
光鲜的一面是新的技术的诞生为比特币减半后死气沉沉的币圈吹来了一阵春风,另一方面,缺乏监管的去中心化交易所,出现了许多割韭菜项目和骗子项目。例如这段时间很火的分片项目near protocol(著名1co平台coinlist被巨大流量拥挤宕机了两次,公募时间推迟一次)就被Uniswap的某些居心不良的人“强上了交易所”,很多不明真相的群众中招买到了假币。
 正面|全维度深入解析: Uniswap的正面与背面
文章图片

Near Protocol官方推特声明

  1. 技术风险
和所有的智能合约一样,Uniswap也面临着技术的风险,虽然Uniswap的智能合约相对比较简单,且通过了轻量级的智能合约测试。
 正面|全维度深入解析: Uniswap的正面与背面
文章图片

https://github.com/runtimeverification/verified-smart-contracts/tree/Uniswap/Uniswap
要注意,现在Uniswap是存在一个已知的可攻击路径的,风险源主要是ERC-777token的重入攻击,该攻击的大概原理: 通过二次调用tokenToEthSwapInput 函数来进入Uniswap代币兑换。 在第二次token的购买中,ETH储备较低,但token的储备相同。这意味着第二批代币将只交换 比应有的数量多一点的ETH 。这是控制交易所购买正在出售的代币的价格公式: 正面|全维度深入解析: Uniswap的正面与背面
文章图片
正常操作下,在随后的常规token售出之后,代币的储备将增加(分母增加),而以太坊的储备将减少(分子减少)。因此,在每轮售出后,token支付的金额将减少。 相反,通过利用可重入性,此动作将有效地防止储备的代币数量增加,从而将等式的分母变成常数。请注意,储备中的ETH数量仍将减少(即,每个可重入调用中的分子将较小)。从长远来看(经过几次重入之后),我们将能够获得一个可观的利润,重入迭代次数越多越好。我们将这种攻击称为“可重入式微交易”攻击。 该漏洞在代码中的表示为下图,攻击者能够将利润提高27%以上。 正面|全维度深入解析: Uniswap的正面与背面
文章图片
https://github.com/Uniswap/Uniswap-v1/blob/c10c08d81d6114f694baa8bd32f555a40f6264da/contracts/Uniswap_exchange.vy#L202 我们将攻击者利用漏洞的利润随token卖出数量的增长绘制为图表如下图: 正面|全维度深入解析: Uniswap的正面与背面
文章图片
上图为作者绘制 每个点代表固定销售数量Uniswap支付的ETH。例如,在20个“重入攻击”中每个售出350个token,使用重入微交易攻击(红色)产生大约22.192 ETH,而正常条件下通过外部调用tokenToEthSwapInput 函数 20次(每个调用中卖出350个token),一共出售7000个token,则利润仅为17.44 ETH(蓝色)。 随着调用次数的增加,重入攻击中显示出的利润有着明显的差异。合法的正常交易(蓝色)产生大约17.418 ETH的收益,而重入微交易攻击(红色)产生约22.324 ETH的收入。随着时间的推移,蓝色虚线并不是恒定的,有一个较小的斜率。代码贡献: OpenZeppelin,该漏洞由OpenZeppelin测试得出。 参考资料:https://github.com/openzeppelin/exploit-Uniswaphttps://smartcontractsecurity.github.io/SWC-registry/docs/SWC-107
  1. 经济模型风险
Uniswap的代币流通性提供的经济模型为,选定一种交易对ETH/ERC20代币注入资金池,按照需要添加相等价值的ETH和ERC20(相同价值1:1去注入资金),当池子里面的ETH或者ERC20被兑换后,存币的人能按照比例分得交易手续费(手续费为0.3%)。 这里有两个资金池子,一个池子放ETH,一个池子放ERC20代币,并且两者的总价值理论上是相等的。其中,ETH的市场价格比较明确,那么这个ETH池子的市值就可以认为等于代币的市值。 举例:1(ETH)*2000(某ERC20)=2000(2000是常数)当购买人想兑换100枚的某erc20代币相对应的ETH时,购买人往资金池里充值存入100枚的某ERC20代币,那么为了保证计算结果还是2000,所以资金池里面还需要留下的ETH的数量为2000/(2000+100)=0.952,则购买人可以得到的ETH为1-0.952=0.048(忽略手续费)。相当于我卖了100个ERC20的这个币,然后我拿到0.048ETH的钱。这就是交易所的逻辑了。 这是最简单的计算方法,恒定函数做市商的计算逻辑更复杂,这里不再赘述。这里大家应该发现问题了,本来我们可以得到的以太坊应该是0.05个(计算方法:100/2000=0.05ETH),但是兑换后只拿到了0.048个,这就是在资金池内的资金不够多时,会存在较大的滑点。 Uniswap定价模型为x*y = k的定价模型(如忽略手续费),其中x和y是A和B两种代币的数量,A为以太坊,B为ERC20代币,K是常数,常数不变,这个定价机制决定了买入哪一边的数量多,与之相应的币种价格就会上升。举个例子,如果ERC20的币这个池子,被买走很多比如说一下买走50%(y变成0.5y),那么,x就要增加一倍,变成2x,那么对应之前就相当于你的ETH资金池变大了,然后币价就变高了。


推荐阅读