2018 年底給大家介紹了 Uniswap V1夫啊,一個基于簡單數(shù)學(xué)公式的去中心化交易所(V1 版本介紹文章)。如今 V1 版本已經(jīng)在以太坊上運(yùn)行了一載有余浇冰,證明了這種數(shù)學(xué)公式兌換模型的可行性和實(shí)用性殊霞。2020 年 3 月 23 號桩匪,官方發(fā)布文章介紹即將問世的 V2 版本怕篷。那么 V2 有什么改進(jìn)和突破呢历筝?就讓我們來瞧一瞧(官方博客:Uniswap V2)。
本文主要從技術(shù)角度介紹 V2 的一些特性廊谓,分析這些新特性可能帶來的改進(jìn)和影響。這些特性包括:ERC20/ERC20 供給池麻削、價格預(yù)言機(jī)和閃電兌換蒸痹。其中關(guān)于預(yù)言機(jī)和閃電兌換會做一些的思考春弥,歡迎有識之士來探討這些問題。對某項特性感興趣的讀者可直接跳到指定章節(jié)叠荠。
ERC20/ERC20 供給池
V1 版本只能通過 ERC20 和 ETH 建立供給池匿沛。如果我們使用 DAI 去兌換 ETH,那就可以直接使用 DAI/ETH 的供給池獲得兌換榛鼎。當(dāng)我們要進(jìn)行 DAI 到 USDC 的兌換時逃呼,V1 版本是將 DAI 兌換成 ETH,再使用 ETH 去 USDC/ETH 的供給池進(jìn)行“二次”兌換者娱,最終完成 USDC 到 DAI 的整個兌換過程抡笼。
V2 的供給池,可以使用任意兩種 ERC20 代幣構(gòu)成黄鳍。這樣做的一個好處是可以降低兌換匯率的滑點(diǎn)推姻,因為每個供給池都會收取一定的費(fèi)用作為兌換手續(xù)費(fèi),通過兩個供給池兌換那就是兩倍的費(fèi)用框沟。V2 對 ERC20/ERC20 供給池的支持藏古,使 DAI 兌換 USDC 的時候不再需要向兩個供給池進(jìn)行兌換,減少了一半的費(fèi)用忍燥,兌換匯率滑點(diǎn)也會更低拧晕。
如果兩種 ERC20 Token 之間沒有直接的供給池,V2 的路由協(xié)議可以在多個供給池之間找到一條優(yōu)化的兌換路徑梅垄,在多個供應(yīng)池之間完成兌換防症。為了實(shí)現(xiàn) A 到 D 的兌換,可以通過 A 兌換到 B哎甲,B 兌換到 C蔫敲,C 兌換到 D 來完成。
目前代碼中的路由協(xié)議是 01 版本炭玫,需要在鏈下計算好路徑提交給路由協(xié)議進(jìn)行處理奈嘿。
價格預(yù)言機(jī)
隨著 DeFi 應(yīng)用的興起,預(yù)言機(jī)變得越來越重要吞加,區(qū)塊鏈應(yīng)用對預(yù)言機(jī)的依賴和要求越來越高裙犹。
對預(yù)言機(jī)感興趣的讀者可以閱讀上一篇文章,專門介紹了以太坊上最大的預(yù)言機(jī)項目 Chainlink(Chainlink 鏈接區(qū)塊和“萬物”)衔憨。
但在預(yù)言機(jī)的發(fā)展和探索道路上叶圃,可謂事故頻發(fā),造成的經(jīng)濟(jì)損失不計其數(shù)践图。早有 Synthetix 由于預(yù)言機(jī)的錯誤喂價導(dǎo)致 3500 萬的 sETH 損失掺冠;最近的 bZx 閃電貸套利事件,也是由于平臺使用了 Uniswap 作為價格預(yù)言機(jī)造成了經(jīng)濟(jì)損失码党。
bZx 閃電貸事件中德崭,攻擊者使用借出的資金對 Uniswap 進(jìn)行砸盤斥黑,導(dǎo)致其價格劇烈變化。此時眉厨,使用 Uniswap 作為預(yù)言機(jī)的平臺由于讀取了當(dāng)前砸盤后的價格锌奴,出現(xiàn)了巨大的套利空間。套利完成后憾股,攻擊者歸還在閃電貸中借出的資金鹿蜀,完成交易。而整個交易過程都在一個區(qū)塊的一個交易中一次性完成服球,是為“閃電貸”茴恰。
可以發(fā)現(xiàn)在 bZx 事件中,由于平臺使用了 Uniswap 最后時點(diǎn)的執(zhí)行價格產(chǎn)生了不符合預(yù)期的喂價有咨。盡管這個價格在 Uniswap 是真實(shí)的琐簇,但和其他平臺是價格存在很大的偏差。由于閃電貸在一個區(qū)塊中迅速完成所有的操作座享,Uniswap 的執(zhí)行價格沒有和其他平臺進(jìn)行套利拉平的機(jī)會婉商,可以認(rèn)為是一個不符合預(yù)期的價格。
V2 的改進(jìn)是歷史將價格保存在鏈上渣叛,并加上了時間權(quán)重丈秩。它的存儲方式是在鏈上保存了一個累積價格,通過使用兩個累積價格的差值和時間差淳衙,可以計算出一個具有時間權(quán)重的平均價格蘑秽。
我們知道 Uniswap 的價格變動是跟隨交易變化的。如果一直沒有交易箫攀,那么這個價格會是一個固定的值肠牲。假設(shè)兩次交易的間隔 10 秒,第一次交易后產(chǎn)生的價格 P1 會持續(xù)存在靴跛,直到第二次交易的發(fā)生(10 秒后)才變?yōu)?P2缀雳。因此 P1 的累積值就是 P1 * 10
。累積價格(priceCumulative)即價格和時間差的乘積梢睛。在無數(shù)次的價格變動中肥印,其中每次的時間間隔分別是 T1、T2绝葡、T3...深碱,就有:
priceCumulative = P1 * T1 + P2 * T2 + P3 * T3 + ...
有了累積價格,使用累積價格除以時間就可以得到一個基于時間權(quán)重的平均價格藏畅。
具體實(shí)現(xiàn)如下圖:
區(qū)塊 122敷硅,供給池被創(chuàng)建后累積價格(priceCumulative)初始值為 0,此時只是發(fā)生了交易,產(chǎn)生了一個截止價格竞膳,而累積價格并未產(chǎn)生航瞭。
區(qū)塊 123 的中發(fā)生的第一筆交易會更新累積價格诫硕,區(qū)塊 123 和上一個區(qū)塊的時間差為 7 秒坦辟,因此累積價格就是 10.2 * 7,即 71.4章办。
區(qū)塊 124 和上一次區(qū)塊的時間差為 8 秒锉走,使用上一次的截止價格計算的累積值為 10.3 * 8,即 82.4藕届,加上之前的累積值即為 153.8挪蹭。計算過程以此類推。
當(dāng)我們知道每個區(qū)塊的累積價格時休偶,可以通過公式獲得任意時間范圍內(nèi)的梁厉,帶有時間權(quán)重的平均價格:
時間權(quán)重的平均價格 = (當(dāng)前累積價格 - 上一次累積價格)/(當(dāng)前時間戳 - 上一次時間戳)
計算過程中,累積價格包含了上一次交易區(qū)塊中發(fā)生的截止價格踏兜,但不會將當(dāng)前區(qū)塊中的最新截止價格計算進(jìn)去词顾,這個計算要等到后續(xù)區(qū)塊的交易發(fā)生時進(jìn)行。因此累積價格永遠(yuǎn)都比當(dāng)前區(qū)塊的最新價格(執(zhí)行價格)慢那么一個區(qū)塊碱妆。由于慢了一個區(qū)塊肉盹,閃電貸在同一個區(qū)塊里進(jìn)行的砸盤價格就不能立即生效。當(dāng)惡意砸盤發(fā)生時疹尾,不會影響當(dāng)前的預(yù)言機(jī)價格上忍,但是執(zhí)行價格會立即降低,發(fā)現(xiàn)價格變動的套利者會在下一個區(qū)塊將價格缺口補(bǔ)平纳本。采用這樣的機(jī)制窍蓝,使預(yù)言機(jī)具備了防范閃電貸中惡意砸盤行為的能力。同時繁成,惡意砸盤產(chǎn)生的價格會被套利者發(fā)現(xiàn)并迅速補(bǔ)平缺口吓笙,由于快速的套利會使砸盤價格存在的時間權(quán)重較低,也能極大的提高預(yù)言機(jī)的準(zhǔn)確性朴艰。
閃電兌換
也許是得益于閃電貸的啟發(fā)观蓄,V2 版本也將提供閃電兌換的功能。該功能同閃電貸異曲同工祠墅,無需任何抵押(空手套白狼)侮穿,就可以借出 Uniswap 供給池中的 Token,這些 Token 用于“閃電”業(yè)務(wù)毁嗦,只要在業(yè)務(wù)處理完成后亲茅,將 Token 即刻歸還,就可以完成一筆閃電兌換。
V2 的閃電兌換有一個特點(diǎn)克锣,歸還的時候支持使用供給池中的兩種不同的 Token茵肃。
V2 核心合約 Pair (即供給池)的 swap 函數(shù)中實(shí)現(xiàn)了 calldata 調(diào)用,并且可以讓用戶先兌后還袭祟。假設(shè)有一個支持 DAI/ETH 的 Pair(供給池)验残,一開始 ETH 會從 Pair 借出到外部套利合約,然后 Pair 會去調(diào)用套利合約實(shí)現(xiàn)的 uniswapV2Call 接口巾乳。uniswapV2Call 中可以完成一系列的“閃電”業(yè)務(wù)您没,之后 uniswapV2Call 再將相應(yīng)的 ETH 或者 DAI 返還給 Pair。Pair 對 uniswapV2Call 調(diào)用結(jié)束后胆绊,會進(jìn)行最終的賬目核對氨鹏。如果 Pair 沒有收到足夠的 ETH 或者 DAI,那么整個交易都將回滾压状。因此對于套利者仆抵,借出一筆 ETH 后,必須在該原子交易結(jié)束前再將 ETH 或 DAI 返還(并付上 0.3% 的費(fèi)率)种冬,才能保證整個閃電兌換的成功镣丑。
反觀最近發(fā)生的 bZx 事件,它可能不算是一種攻擊碌廓,而是多種 DeFi 金融工具結(jié)合涌現(xiàn)出的一種“平倉”操作传轰。這樣的操作或許會使價值更接近本質(zhì)。區(qū)塊鏈上的價值谷婆,會以自動化算法為驅(qū)動慨蛙,在整個區(qū)塊鏈網(wǎng)絡(luò)中以更加迅速的方式流動,bZx 的閃電貸就是一種很好的體現(xiàn)纪挎,在一個原子交易中抹平價值和信息的差距期贫。
閃電貸、閃電兌換應(yīng)該會成為一種常態(tài)异袄,擁有專業(yè)能力的人通砍,在沒有資本的前提下,亦可以捕獲價值信息的不對稱烤蜕,從價值轉(zhuǎn)化中獲取利益封孙。在傳統(tǒng)領(lǐng)域,這必須是具有龐大資本的機(jī)構(gòu)才能完成的操作讽营。
結(jié)語
Uniswap 上線之初虎忌,就不是一個能使項目方自己賺得金銀滿缽的項目,他的供給池是由無數(shù)的個人用戶組成橱鹏。只要你擁有 ETH 和 token 既可以存儲在供給池中獲利膜蠢。通過簡單的算法堪藐,供給池在交易的過程中持續(xù)的增長,最終這些收益又回饋到供給池的提供者們身上挑围。它以低廉的成本礁竞,通過區(qū)塊鏈完成了一種自組織、盈利和分配的機(jī)制杉辙,這種機(jī)制不會使壟斷機(jī)構(gòu)獲取暴利模捂,而是按照每個人所提供的資本進(jìn)行平等分配,是一種真正透明奏瞬、公正可持續(xù)化的機(jī)制枫绅。
在整個去中心化組織的發(fā)展歷程中泉孩,由于機(jī)制的先進(jìn)性和早期的不完善硼端,不免產(chǎn)生各種新的問題,甚至造成巨大的經(jīng)濟(jì)損失寓搬。Uniswap V1 作為預(yù)言機(jī)存在一定的問題珍昨,但從 V2 的升級中我們可以看到機(jī)制的進(jìn)一步完善,使之前的問題被化解句喷。同時镣典,閃電兌換的創(chuàng)新,開放了Uniswap 的供給池唾琼,為那些缺乏資本擁有能力的專業(yè)人士創(chuàng)造了機(jī)會兄春。通過這些持續(xù)不斷的創(chuàng)造和改進(jìn),自組織形式在快速的發(fā)展和完善锡溯。