Uniswap V2 是朝著正確的方向邁出的積極一步,但若想讓去中心化交易所能夠完全取代中心化交易所,還是長路漫漫。雖說如此,以太坊生態還是可以有把握地說,DeFi 的進展不論從技術能力還是接受度來看,在短期內都不會放緩。本文源自於 Ross Bulat 的文章《Uniswap V2: Everything New with the Decentralised Exchange》,由專欄作者 以太坊愛好者 編譯、撰寫及整理。
(前情提要:歷史時刻!Uniswap 日交易量首度超車 Coinbase Pro,達 4.26 億美元敲響 CeFi 警鐘)
Uniswap V2 新一版迭代
Uniswap是一個運行在以太坊區塊鏈上的流動性協議,支持免信任的代幣互換,也即是說,該交易所上的所有交易都是由智能合約自動執行的,用戶無需依靠某個中介也無需信任某個第三方。
這種去中心化的代幣互換方案已經證實在 ERC20 代幣的持有者群體中很吃香,他們願意使用 Uniswap 來交易代幣並為不同的交易對提供流動性。
Uniswap 在2020年3月19日在以太坊主網上推出了一個新版本,還配合著公開了核心合約的1.0.1版;在發行之前,該版本已經在Rinkeby測試網上測試過一段時間了。截至撰文之時,這個新版本在以太坊主網上已經使用超過了兩個月時間,而且迄今為止,沒有出現任何損壞智能合約完整性的問題。
延伸閱讀:Defi 新手入門|一文看懂 Uniswap,什麼是以太坊上的「代幣交換協議」
不論你是持有還是在交易密碼學貨幣,是在搞以太坊開發還是做寬泛的金融科技業務,都有必要了解一下Uniswap,它在2020 年的第三季隨著DeFi 概念的崛起迎來了快速的增長。
所謂一項獨立的服務,Uniswap 也可以集成到第三方的數字錢包和dApp 中。此外,其它智能合約也可以拿Uniswap 作為基礎來開展服務。
本文旨在向讀者介紹 Uniswap V2 帶來的增強功能,並詳細介紹其主要特性。
Uniswap V1 定下的基調
Uniswap V1 為鏈上代幣互換和去中心化流動性池定下了基調,就是向交易代幣的用戶收取少量手續費、以此給提供流動性用戶以獎勵。
Uniswap V1 使用的不是鏈上訂單簿,正相反,代幣的交換比率是用一個叫做「恆定乘積公式」的算法來確定的,相當於提供了一種機制來保持一種代幣的體量在所在交易對中的平衡。
這個我們後面會進一步介紹。
底層的代幣交易對(例如DAI 對ETH,或者DAI 對USDC)各有各的流動性池,用戶可以通過同時存入兩種相應的代幣來提供流動性。
流動性提供者可以得到所在流動性池中代幣交易的手續費作為獎勵,手續費率為0.3%,流動性提供者之間按份額分配—— 份額的大小,端看你注入流動性池的代幣數量佔整個流動性池數量的比重。
Uniswap V2 有什麼新東西
Uniswap V2 給協議帶來了一系列的升級和增強功能。主要的更新包括:
- ERC20 對 ERC20 代幣的交易對。
即,不再需要 ETH 作為中介代幣來協助兩種 ERC2O 代幣的互換過程。移除這個硬性要求可以減少一半的交易數量,也能節約交易的 Gas 費。也因此,dApp 可以在缺乏直接的代幣互換池子的時候,更高效地發現從一種代幣到另一種代幣的「路由」。這一部分我們後文還會詳細講。
- 價格信息傳輸功能
每個區塊都能基於按時間加權平均的定價方式為交易對刷新價格。這一部分我們後文也會詳細講解。
- 閃電交易
或者說你可以從 Uniswap 流動性池中「借出」代幣、用於與任意的外部服務交互、然後還清你的初始貸款,所有操作都要放在一筆交易內。這樣的交易是原子化的,意思是說,交易中的任何一個操作失敗,都是導致整筆交易失敗、被改動的狀態完全回復。
這種功能的一個顯而易見的用途就是利用流動性來做套利交易,但也有別的用途,比如為特定的 DeFi 操作節約Gas費,例如關閉Maker金庫。
- 支持不標準的 ERC20 代幣
辦法是將返回 void 類型的 transfer() 和 transferFrom() 的函數調用也視作成功的transfer (轉移)操作。
這個功能看起來毫不起眼,但其實,許多主流代幣比如 USDT(Tether)和 BNB(幣安幣)的 transfer 方法都會產生這樣的返回值。支持這些廣泛接受、但不完全遵守 ERC20 標準的代幣,增強了 Uniswap 在鏈上交易所中的優勢。
- 額外的功能性方法
用於防止用戶所轉移的代幣數量超過 Solidity 程式碼語言所能支持的最大數量時出現溢出錯誤(overflow)。
注意:不標準的 ERC20 代幣即支持正式的 EIP 詳述所指定的方法,但返回值的類型(以及相應地,方法的簽名)迥異於詳述的代幣(合約)。這種缺陷會讓一種代幣變成不標準的代幣。類似的,重命名或者移除了詳述所指定的方法也會讓代幣變成不標準的,但這種情況在實踐中很少見,如果像 Uniswap 這樣的協議希望支持這樣的變種,還需要大量的開發工作才能解決。
Uniswap V2 還引入了一個可啟用的 0.05% 的協議層收費,就是從流動性提供者的 0.3% 的手續費中分一杯羹。不過,現在這個機制是關閉的—— 而且只能夠通過一個去中心化的治理機制來觸發。我們後文還會再說。
Uniswap V2 經過充分的測試和審計之後方才推出
智能合約一經部署就不可改變的特性所帶來的風險(代碼問題可能導致資產損失/凍結),已經是老生常談了。
如果一個合約包含了會導致資產鎖定的錯誤,那是沒有辦法讓這些發送資產的交易都撤銷的(除非對整條區塊鏈實施一次硬分叉—— 按以太坊當前的體量和復雜的依賴關係,幾乎是不可能這樣做的)。
Uniswap 團隊遵照了產業的標準實踐以盡可能地消除 bug 風險和邏輯錯誤。
從 V1 轉成 V2,團隊也用 Solidity 語言重寫了他們的智能合約(第一版的智能合約是用Vyper語言寫的)。
Uniswap的開發者因此得以跨越 Vyper 語言的局限性、利用最新版本的 Solidity 語言中的更新的操作碼,進一步優化了合約執行的CPU消耗(因此也節約了Gas費)。
Uniswap V2由多個智能合約組成,包括Factory、Router V2、Pair和Pari ERC20,還有一個負責功能的Library。
驅動Uniswap 工作的幾個主要的合約如下圖所示:
Router 2 是 Router 1 優化之後的版本,不過它們的功能是一樣的。Uniswap 建議所有的開發者都切換去用Router 2 合約。
重寫後的所有合約都得到了聲譽高的安全開發團隊審核,也在模擬現實運行場景的測試網上做了廣泛的測試。Consensys Diligence 聯合多方撰寫了對 Uniswap V2 源代碼的完整報告。完整的審核報告可見此處。
好的,接下來我們就深入了解下Uniswap V2 的機制。
Uniswap V2 的工作原理
每個代幣交易對都要通過工廠合約(factory contract)建立自己的流動性池。建立流動性池時,需在其中存入初始資金,以提供流動性。
流動性池中代幣對的匯率是基於供需量計算得出的,即所謂的恆定乘積公式(constant product formula)。配合恆定乘積公式,一個交易對(也即一個流動性池)中的一種代幣的價格,根據池中的供給量和交易者的需求量得出。因此,價格會在根據該公式畫出的一條曲線上變動:
– Uniswap V2 上的匯率取決於恆定乘積公式 –
匯率是基於一個簡單的公式 x * y = k(其中x和y分別代表交易池中兩種代幣的可用數量)自動計算的。
對應的曲線代表所有可能的匯率。每個交易對都有自己的曲線,用來調節當前匯率。
如果代幣 B 的需求量很大,以至於流動性乾涸,其價格將成倍增長,導致 k 點向曲線左側上移(如上圖所示)(譯者註:即更多的A只能換來更少的B)。
如果代幣 B 的供應量很大,需求比代幣 A 少得多,k 點就會向曲線右側下移(譯者註:即更少的A就可換來更多的B)。
要注意的是,這種供需平衡僅限於代幣 A 與代幣 B 的流動性池。如果是代幣 B 與代幣 C 的流動性池,會形成自己的供需平衡,匯率也會不同。
(譯者註:簡而言之,Uniswap 並不使用訂單簿模式來決定代幣的價格,相反,代幣的價格會在用戶交易的過程中連續且自動地根據公式來變動,讓交易者的行為,包括注入流動性和套利交易,來找出沒有套利空間的價格,即市價。)
受到這些機制的影響,Uniswap(以及其它使用恆定乘積公式的去中心化交易所)依賴套利交易來讓流動性池中的代幣價格與市場價格保持一致。
從本質上來說,這些協議依然需要通過外部交易系統來調控流動性池中代幣的價格。每個代幣對的匯率將根據市場價格不斷波動,為交易者帶來巨大的套利機會。
當用戶在 Uniswap.exchange 的代幣對流動性池中進行交易時,使用的是實時匯率。JavaScript SDK(會在下文作進一步介紹)會為其它應用提供API ,再由這些應用提供自己的介面來訪問不同的代幣對及其匯率。這些匯率應用於ETH 和ERC20 代幣:
– Uniswap V2 用戶介面上 ETH/DAI 交易對的匯率 –
現在,讓我們深入探究可在 Uniswap V2 上執行的交易類型。Uniswap V2 提供了更多交易選擇,因為它不再像Uniswap V1 那樣使用 ETH 作為中介代幣來實現「ETH 橋接」。
Uniswap V2 上的交易選擇
Uniswap V1 上的每個交易對中都有 ETH 。
如果要將代幣 A 兌換成代幣 B ,必須先用代幣 A 買入 ETH ,然後再用 ETH 買入代幣 B 。因此,交易者需要支付兩筆交易費和 gas 費。
Uniswap 的文檔將 V1 稱為去中心化自動交易所的 「原型」。這有可能是因為開發人員發現了 V2 提供的更高效的交易執行方法。不再將 ETH 作為中介代幣就是優化之一。
如下圖所示,ETH 不再作為中介代幣之後,交易對之間可以進行直接交易:
(兩種 ERC20 代幣直接互換)
這種方式似乎既合理又直觀,或許 V1 就應該採取這種運作方式。只需調用路由合約上的 swapExactTokensForTokens 和 swapTokensForExactTokens 方法即可交易。
上述方法名稱中的 Exact 表示你希望為交換中的哪一種代幣設置限額。
如果你想用 DAI 買入一定數量的 ETH ,就要使用 swapTokensForExactTokens ;另一方面,如果你想用一定數量的 DAI 買入 ETH ,就要使用 swapExactTokensForTokens。
Uniswap V2 的智能合約就採用了這兩種方法。除了直接交易外,用戶依然可以選擇使用 ETH 作為中介代幣來實現兩種代幣之間的交易。
用戶無需直接在輸入代幣和輸出代幣之間創建流動性池,只要這兩種代幣與 ETH 之間存在流動性池即可。
例如,以 ETH 作為中介代幣來實現 DAI 和 LINK 之間的交易,其流程如下圖所示:
(以 ETH 作為中介代幣實現間接互換(類似於 Uniswp V1))
與之對應的 Solidity 方法是 swapExactETHForTokens 和 swapETHForExactTokens,以及 swapTokensForExactETH 和 swapExactTokensForETH。
實現代幣交易的最後一種方法就是,在多個 ERC20 代幣之間進行交易,直至獲得你想要的輸出代幣為止,也就是白皮書中所說的 「任意 ERC20 交易對」。
當然了,所謂的任意代幣對中也可以包含 ETH 。
下圖顯示了如何通過一系列代幣將 DAI 的價值轉移到理想的輸出代幣 Link 中:
(對於沒有直接交易對的代幣,可以通過一系列中介代幣交易來獲得輸出代幣)
如果你的輸入代幣和你想獲得的輸出代幣之間沒有流動性池,就可以採取這種方法,而且不一定需要上文所述的 ETH 作為中介代幣。
雖然這種交易方法是可行的,但是目前沒有智能合約能自動實現這麼多筆代幣交易,只能手動將這個功能寫入前端應用的程式碼碼中,並對 Uniswap 進行多個交易調用。
這個辦法的使用頻率可能不高,因為在通過一至兩個中介代幣轉移價值後,額外的 Gas 費會讓迂迴交易變得很不划算。
或許通過中心化交易所交易成本反而更低。
儘管如此,一旦 ETH 2.0 主網上線,採用更加高效的 PoS 機制,再加上可擴展性功能,讓迂迴交易變得更加可行,這種方法將得到更廣泛的使用。
延伸閱讀:以太坊 2.0|簡述 ETH 2.0 經濟模型分析報告
延伸閱讀:以太坊|Defi 也無力回天?天價手續費不改善,或影響以太坊及其代幣地位
價格資訊傳輸機制
Uniswap 的價格資訊傳輸機制可以讓開發者基於某個代幣在幾個區塊(也可以表示成兩個時間戳之間的時間區間)內的價格波動性來計算該代幣的平均價格。
這個時間區間可以是前 1 小時,前 24 小時乃至更久。
雖然 Uniswap 會提供代幣價格,但是它不會在鏈上存儲任何歷史價格。
需要 dApp 開發者自選基於一段時間的累積價格,來計算某個代幣在這段時間的平均價格。
這些平均價格稱為時間加權平均價格(Time Weighted Average Price,TWAP)。
所謂的 TWAP 就是在鏈上選定一段區塊作為時間區間,將某個代幣在這段區塊內的累積價格(該代幣在每個區塊的價格)除以時間戳區間(結束區塊的時間戳減去起始區塊的時間戳),得出該代幣在這段區塊的平均價格。
圖解如下:
(TWAP 是基於一段區塊內的累積代幣價格計算得出的)
TWAP 是可靠的,反映了一段時間內的代幣價格(別忘了,這是基於特定代幣對的)。
採取這種方式可以避免閃電崩盤和劇烈的價格波動,這些在加密貨幣市場上很常見。當市場出現價格波動時,TWAP 可以更準確地反映代幣的情況。如果需要,開發者可以通過 Uniswap 的 JavaScript SDK 免費獲取價格資訊。
閃電交易
閃電交易(Flash Swap)指的是通過一個交易來完成從 Uniswap 的流動性池中借出代幣、使用這些代幣進行某項操作並償還這些代幣這一多階段流程。如果這個流程中的任意一階段失敗,所有狀態更改都會撤銷,相關代幣重新回到對應的 Uniswap 流動池中。
下圖顯示了交易者如何能夠不持有代幣而執行閃電交易。
這是因為從流動性池中借出的價值一定會歸還到池內,要不是交易失敗,就是交易者歸還借出的代幣:
閃電交易的一大用例就是套利交易,而且交易者一定能在獲利的同時將之前借得的代幣價值歸還至 Uniswap 流動性池內。
交易者每次都能通過套利交易輕鬆獲得收益。
另一個用例是使用 Uniswap 流動性池結算 Maker 金庫,你可以償還債務,並取出 Maker 金庫中作為擔保品的 ETH (或其它代幣)來償還 Uniswap 流動性池。
相比直接使用自己持有的代幣來還款,這種方式消耗的 gas 較少。
閃電交易是 Uniswap 上一項比較新的功能,不過我們很快就能看到更多 dApp 整合這一功能。
在交易機器人這一用例中,閃電交易還可以用來自動執行套利交易。
交易機器人不需要資金來執行交易,只需要識別套利機會並執行閃電交易即可。
新的 0.05% 的協議收費和治理
Uniswap V2 還為協議引入了一種新的費用,叫做「協議費(protocol fee)」,啟用這一機制後,Uniswap 上發生的交易額的 0.05% 就會轉移到一個由 Uniswap 持有的地址上。
這個 0.05% 是從 Uniswap 標準的 0.3% 手續費中抽出來的,所以啟動這一機制會導致流動性提供者的利益受損。
當前這一機制還是關閉狀態,而且 Uniswap 項目方也沒有任何公開聲明表示有啟用這一機制的計劃。
添加這個機制似乎有點可疑,但 Uniswap 開發者認為,這是為了支持 Uniswap 的增長和可持續性的必要功能。
而且,還有一個事實可以為他們辯護:啟用這一機制需要一個治理機制,由社群來投票決定要不要啟動這一機制。
雖然啟動這一功能需要先達成社群共識,這樣做會給予 Uniswap 項目方巨大的利益和競爭優勢。
從好的一面來說,這筆費用可用於升級協議和整個生態系統、提高接受度,最終能夠讓流動性提供者獲得更大的利益;理論上來說,可以彌補他們在這一機制中的利益受損。
整個過程如下圖所示:
( 收取 0.05% 的協議費用的積極結果 )
現在還未有該治理機制的公開資訊,但不妨假設會有利用 ERC20 代幣來收集投票,類似於 Maker 的治理和投票機制。
為管理協議收費機制,Uniswap Factory 合約包含了 feeTo 和 feeToSetter 方法來設置接收資金的地址,以及有權更改 feeTo 地址的帳戶。
JavaScript SDK
本文有意避免過度技術化,但還是有必要提及 Uniswap 的 JavaScript SDK。這個開源庫給 NodeJS、JavaScript 框架及所有基於瀏覽器的應用提供了 JavaScript API 來集成 Uniswap。
這已經足以讓第三方應用直接將 Uniswap 集成到自己的產品和服務中。
Agent Wallet、Switcheo Exchange 和 Streamr Marketplace 是其中 3 個已經直接集成了 Uniswap 的產品。
該 JavaScript SDK 的文檔講解了用於提取代幣對數據和代幣對地址的 API,還有啟動交易和獲取定價的 API,應用可以藉此使用上文所述的價格資訊傳輸功能。
注意,API 不能自動執行交易,只能幫你準備 一筆交易,把你願意接受的市場價格中位數和交換所得的最低數量(也就是所謂的 “滑點” 考慮進去。
交易準備好之後,用戶必須手動使用錢包軟體(比如 MetaMask)發起和簽名交易。
關於 Uniswap 的代幣列表
如果你好奇 Uniswap.exchange 上的代幣列表是如何決定的,很簡單,這是人工操作的,Uniswap 團隊會用視頻會議討論要加入哪些代幣。
因此,即使某種 ERC20 代幣的交易池已經出現了,也並不代表這種代幣會出現在 Uniswap 官方網站的代幣列表上。
如果你是某種代幣的發行者,你想要讓你的代幣出現在 [Uniswap.exchange] 默認的代幣列表上,你需要在 Default Token List repository 上提交一個 Github issue。
Uniswap.exchange 上還有一個功能:你可以在一個搜索框內輸入某個 ERC20 代幣的地址來找出這種代幣,然後添加到你自定義的列表中。
這樣一來你就能在 dApp 中交易這種代幣了,但這不代表別人也能看到這種代幣,因此也不會提高這種代幣的曝光度。
開發者也可以在自己的 Uniswap 集成中創建定制化的代幣列表,只需遵循一個簡單的 JSON 結構即可。更多操作細節可見 Uniswap 的 Token Lists repository。
總結
本文完整地考察了 Uniswap V2,揭開了它的改進項目及其工作原理。
更高效的代幣互換、按時間來加權的價格資訊標識機制、閃電兌換功能,都是重大改進,在這些改進的背後,是遷移到基於Solidity 來編寫合約的技術工作,這些技術工作讓 Uniswap V2 得以利用最新的操作碼來實現更高效率的執行。
Uniswap V2 保持了免信任、去中心化的本色,它存在於以太坊區塊鏈上,除非爆破底層協議,不然就無從破壞它。
到目前為止,沒有這樣的事情發生,而且,看現在的礦工群體規模(以及驗證者的規模),以後也不太可能發生。
以太坊 2.0 的測試網 Medalla 啟動時有 2 萬名驗證者 —— 我估計這個數字在主網啟動時還會更高,因為到時候的驗證者可以得到經濟回報。
另一方面,Uniswap V2 作為一個代幣交易所,也還不能說是完美的。在撰文之時,以太坊網路的 Gas 費正處於歷史上最高的時期,這使得使用 Uniswap 的 Gas 費異常昂貴。
Uniswap 沒有實時訂單簿功能,因此交易員要使用交易策略還是只能找上中心化交易所。
如前所述,Uniswap 需要用戶套利來保持交易所內代幣價格與市場價格的一致,中心化交易所仍舊在平衡 Uniswap 的匯率上發揮著不可替代的作用。
Uniswap V2 是朝著正確的方向邁出的積極一步,但若想讓去中心化交易所能夠完全取代中心化交易所,還是長路漫漫。
雖說如此,密碼學貨幣社群(尤其是以太坊生態)的意見還是非常樂觀的—— 我們可以有把握地說,DeFi 的進展,不論從技術能力還是接受度來看,在短期內都不會放緩。
📍相關報導📍
趨勢解讀專欄|Uniswap 大遷徙:2017 年的感受好像被帶回來了?
以太坊共同創辦人 Vitalik 砲轟:「DeFi 流動性挖礦」就像是央行瘋狂印鈔
看懂 SushiSwap 吸血鬼攻擊:遭批跟次貸危機 CDO 雷同,它如何榨取 Uniswap 流動性?
讓動區 Telegram 新聞頻道再次強大!!立即加入獲得第一手區塊鏈、加密貨幣新聞報導。
LINE 與 Messenger 不定期為大家服務