(本文作者為 DeFi 開發者 Anton Cheng)

前言

過去這一年,個人覺得 DeFi 世界沒有太特別的創新,但相對的處於一個非常實際的重建期:許多高品質的團隊開始用新的工程方法,更安全、高效率的方式,重新撰寫、部署許多 DeFi 的基礎設施,也出現不少完全去中心化的公共財。

Morpho 是這之中最經典的一個案例。今天就介紹一下他們是如何把複雜的借貸協議,拆解成簡單的小模組,最大化安全性與可重複使用性。對 DeFi 或是 Solidity 不太熟的人,我也非常推薦用 Morpho 作為入門,學習如何用簡潔的方法實作出實用的合約。

前情提要:借貸平台

借貸平台的核心可以很簡單的用兩群人來解釋:Supplier 想要把資產借出去賺取利息;Borrower 想要抵押資產 A 、借入資產 B,支付利息給 supplier 的同時, 換取彈性組合自己資產組合的機會。

比較老一派的借貸協議如 Aave 或是 Compound ,都是強調整個 protocol 就是一個很大的借貸市場:supplier 只需要選擇自己想要借出的資產,就可以很輕易的存款收利息。以 Aave 與 USDC 為例,用戶只要選擇借出 USDC,借出後會收到名為 aUSDC 的 interest bearing token,並不用去在意背後到底有什麼抵押品 (collateral),或是各個抵押品的清算參數等等,因為這些所謂的風險管理都被 DAO 解決了,這也是為什麼 Aave Governance 常常有在更改參數、增加或是移除抵押品的投票。

Morpho 的核心概念

Morpho 的根本邏輯上有很大的差異:它是一個真正去中心化的協議,任何人都可以來上面開創任意 toke pair 的借貸市場。

一般 supplier 會與 Morpho 互動的最小單位被稱為 “vault”。Morpho 團隊並沒有推出任何的官方 vault,而是盡量的找不同的人或單位來建立並管理不同的 vault,來滿足不同 supplier 的需求。也就是說:身為一個 supplier,並不是決定把錢丟到 Morpho 就好,你還必須從眾多的 vault 中選擇你最尬意的。這讓 Morpho 處於一個很有趣的位置,他們不是直接決定用戶需要什麼市場的人,而把這些事情交給其他人 (vault, curator)來決定。

左:一個協議 (protocol) 即為一個大市場,如 Compound 與 Aave。右:一個協議可以創建多個風險不相關的 Vault 與市場

上面提到的 vault,是面對一個一般 supplier 的單位。實際上一個 vault 又由多個 markets 來組成。下面我們將會從下而上介紹 market 與 vault 兩個重要元件,還有他們之間的關係。

Vault 由數個不同的 markets 組成 Morpho Market (MorphoBlue) / 市場

在 Morpho 協議的最底層,是一個個相互獨立、不可改動、也沒有任何所有權概念的 markets (合約上被稱為 

MorphoBlue

)。市場一旦被創建出來就無法更改,而且允許任何人使用任意一組 ERC20 的 token pair,以及使用任意的 oracle 來創建 markets。

創建 Market

MorphoBlue

 是一個  singleton contract,所有個別的 market 並不是新建立的合約,而是全部 存在同一個合約地址,因此創建一個市場非常便宜(目前的 gas 可能只要幾塊美金)、並且能夠內建 flashloan 的功能,讓人能在一筆交易內借走所有 supplier 存在 MorphoBlue 裡面的錢。

創建一個市場需要的參數如下:

  • collateral

    : 抵押品 ERC20

  • loan

    : 被借貸的 ERC20

  • oracle

    :預言機地址

  • lltv*

     (liquidation loan to value): 一個 borrower 借出總價值 / 抵押品總價高於這個比例時將被清算。

  • irmModel*

     (Interest Rate Model):決定利率變化邏輯的合約

上述的參數中,前三者如前面所說,並沒有任何限制;後面兩個參數則限制只能使用 governance 投票通過的 lltv 值以及 irm 合約。

當一個 market 被創建出來後,其實它就已經可以實現一個簡單借貸市場的功能了: 例如一個 USDC — ETH 的 market,supplier 可以直接存入 USDC 賺取利息、 borrower 則需存入超額 ETH 做抵押品,借款並支付利息。如果有任何 borrower 的倉位處於危險狀態,將會有 liquidator 來幫忙清算。

如果要使用不同的 lltv, collateral, 都需要創建不同的 market Liquidation

Morpho 的清算機制相對單純,並沒有任何拍賣類型的設計,而是單純固定價格先搶先贏:在一個 borrower underwater 的時候,liquidator 可以幫忙償還部分 debt,獲得價值較高的抵押品。

其中每個 market 會有一個固定的 LIF (Liquidation Incentive Factor), 由 lltv 決定。Liquidator 能拿到的抵押品就是代償還 loan 價值 * LIF:

maxLIF = 1.15, cursor = 0.3 。LIF 必定 > 1

能做這樣的設計其實非常仰賴「一個 market 只由一個 loan asset 與 collateral asset 組成」這件事,正是因為 market 非常單純,這使得定價賣單一抵押品這件事情變得可行。如果一個 protocol 想要一次拍賣一卡車不同種類的抵押品,或是允許一個 borrower 一次有很多的 loan position,那實際上就很難直接透過這種直接靠 oracle 定價的方式來清算,所以大多會仰賴拍賣,那就會是更複雜的設計。

Gasless Authentication

這裡想要稍微提一個很有潛力的小設計:在 MorphoBlue 程式碼中有一個叫做 

setAuthorizationWithSig

 的函示,讓一個 EOA 可以透過一個簽名,來授權別的地址代為操作自己的倉位。這代表其實開發者可以去開發一些第三方合約,通過授權去做一些代管、代操作的服務。

小小結:Market 是最簡化的基本借貸單位

看到這裡,應該已經對於 market 有基本的認識,基本上就是一個非常小、功能有限的借貸市場。它的功能僅限於讓 supplier 借錢給單一抵押品市場、以及讓 borrower 放入一種資產並借出另一種資產。

這顯然是不夠的,因此就需要 vault 還有 allocator 來幫忙解決問題了。

P.S. 

MorphoBlue

 合約只有約  500 行 的程式碼,(一般人最聞之色變的清算機制也不過短短 50 行),寫得非常的簡潔,並且經過非常嚴密的審計以及 formal verification 驗證,我認為可以稱得上是目前主流 DeFi Infra 中最安全的一份程式碼,非常推薦給想學合約的大家學習。

Morpho Vaults (MetaMorpho)

前面介紹完了 market,其實對於頭腦最清楚,也想要花時間自己管理所有風險的使用者來說已經足夠了。但是大部分的 supplier 可能沒有這些能力,因此我們需要一些聚合工具、以及別的角色來幫助我們完成這個任務。

我們可以回顧一下,過去 DeFi 借貸情境中,有哪些「風險」是一個 DAO 會控制的?其實想來想去不外乎是選擇抵押品以及各種參數:

(1.) 抵押品:什麼樣的抵押品可以借走 supplier 的錢

(2.) 抵押品的 borrow cap:每個抵押品能借走的上限

(3.) 每個抵押品的清算線:不同的抵押品種類,價格相對穩定應該容許比較高的槓桿,例如存 $100 USDC 可以借走 $95 USDT,但存 $100 的 BTC 可能只能借 $80。

在 morpho 的定義裡,這些所謂的管理條件都會被視為不同的市場,所以每當要進行「風險管理時」,理論上在 morpho 的架構下,就需要換存到另外一個市場。例如清算線的改變:一個 USDC-DOGE-lltv-90% 的市場,代表存 DOGE 可以借走 90% 面值的 USDC,如果今天你覺得 DOGE 的風險提高了,你就需要改把自己的 USDC 提出來,轉存到一個新的 lltv-80% 的市場中。這顯然不是一般人會願意做的事情,因此就有了 vault 這個聚合器,再透過 curator 和 allocator 兩個風控小幫手,來幫存款者把倉位搬來搬去。這就是 Morpho Vault (合約上稱為 MetaMorpho)。

Vault (藍色)與 Market (橘色)的關係 Allocator

首先先來介紹兩個風控小幫手。一個 vault 可以有多個 allocator,這些 allocators 有權限把原本存在一個市場的資產轉移到另一個市場。除此之外他們還可以更新 deposit queue & withdraw queue:顧名思義就是「存錢會先存到哪個市場」、以及「領錢從哪個市場開始領」。

Risk Curator

Risk curator 則是一個 vault 的控制者, 除了能設定 allocator(也擁有他們的權力),並能設定每個 market 的 supply 上限。

透過這兩個角色,我們就可以達到上面所說的三大風控種類:透過改變 queue 以及把流動性搬來搬去,我們相當於可以決定 markets,也就可以決定要不要更改抵押品、或是更改每個抵押品的清算線;再加上設定每個市場存款上限的功能,我們能夠調整整個池子的曝險。

ERC4626

值得一提的時,每個 vault 都是專門對一種 loan asset 設計的,也就是只接受存入單一資產。MetaMorpho 支援 ERC4626 的介面,存入之後會給你一個包含的利率的 ERC20 代幣,可以再把這個代幣拿到別的衍伸性金融商品的協議中,賭一些利率什麼的。

Performance Fee

最後再提一下,這些風控小幫手不是做慈善的,因此大多會要求透過 vault 存款的用戶服取一定比例賺取的利息來作為他們的佣金。如果不想付錢的話… 可以往下滑到最後結尾、幫你想好怎麼避開這些 fee 了 。

挑戰

大概 Morpho 的核心這樣就介紹完了,接下來我來提幾個,這樣的設計常常被拿出來討論的點。

Liquidity Fragmentation (?)

看到這樣的架構,第一直覺便是流動性分割:本來存到一個 vault 的錢現在反而要再被分散到不同的 markets 中,是不是代表流動性被分散了?

我認為「是也不是」:「是」是因為如果這個世界只有一個 vault,那確實流動性被分散到不同的 market 中,會造成 borrower 很多困擾。

但其實多個不同的 vaults 可以同時 supply 給同一個 market。如果有一個 market 非常的穩定,越來越多的 vault 可能會想存錢到這個 vault 裡,賺取比較穩定的利率。這樣反而讓 borrower 可以在同一個 market 就能借到來自不同 vault 用戶的流動性。

如果我們不只考慮 vaults,那這個優勢可能進一步的擴展:例如有其他智能合約或是 treasury 想要做一個簡單的生利息功能,它可能不想透過 vault,而直接把 USDC 存到一個 market 中去生利息,market 簡潔的設計讓更多協議可能願意做這件事,帶入更大量的流動性。

Multi-Collateral Borrowing

我認為在 morpho 中,borrower 的 UX 會變得比較複雜,但究竟是好是壞可以用不同面向解釋:

以前所有的借貸協議、都有權力去改變 borrower 被清算的條件,部分原因是因為他們允許 borrower 一次放入很多抵押品、用一個 health score 來評量你的總倉位能借出多少錢。為了確保協議安全、在抵押品風險改變時,他們便可以透過改變一些參數、使得 borrower 變得可以被清算。儘管會有額外機制保護、但這終究是一個困難的考量點。

在 Morpho 中,borrower 的動作對象變為永久不可變動的 markets,這意味著你不用擔心任何人能夠改變你的借貸、清算條件。代價是,如果你打算抵押多種抵押品借出資產,你需要自己把不同的抵押品存入不同的 markets,同時自己維繫多個倉位、 rebalance,從這個角度來看便會十分不方便。

Rehypothecation

Morpho 最大的一個問題是最底層的抵押品資產利用率。其他很多借貸協議都允許你存入的抵押品同時被別人借走、讓你多收一點利息。但是 morpho 最底層的邏輯上就不允許 collateral 被借出,所以一定會有一些資產是「閒置」在合約中的。

關於這件事情究竟是不是真的重要,可能可以在我們之後介紹 Euler V2 的時候再來詳細展開。

結語: Building Hyperstructures

我記得第一次看到 Morpho 的合約應該就是去年的這個時候,就覺得這就是我一直期待可以看到有人實作的 lending infra。

除了合約乾淨、簡潔這些實作上的細節外,我十分喜歡這種不嘗試做所有事情、但把每個實用的單位拆分乾淨、以最小化為原則開發合約的精神。我認為這是開發合約最好的精神、因為越複雜的東西越容易有安全問題,也越不容易被別人重複利用。

除此之外, Morpho 這個完全去中心化、immtuable、而且最小化 governance 的設計,也完全符合了 Hyperstructure 的精神。

何謂 Hyperstructures?

如果沒有聽過 hyperstructure 這個詞,非常推薦去看 Jacob 大大的原文。我在這裡幫忙把定義抄過來。

Hyperstructures: Crypto protocols that can run for free and forever, without maintenance, interruption or intermediaries.

Jacob 在文章中進一步定義的幾大特性:

  • Unstoppable: the protocol cannot be stopped by anyone. It runs for as long as the underlying blockchain exists.

  • Free: there is a 0% protocol wide fee and runs exactly at gas cost.

  • Valuable: accrues value which is accessible and exitable by the owners.

  • Expansive: there are built-in incentives for participants in the protocol.

  • Permissionless: universally accessible and censorship resistant. Builders and users cannot be deplatformed.

  • Positive sum: it creates a win-win environment for participants to utilize the same infrastrastructure.

  • Credibly neutral: the protocol is user-agnostic.

P.S. 原文的另一亮點是 “Valuable” 問題的延伸:這些合約可以擁有 ownership,也可以讓 ownership 有價值、但必須建立在完全不違反去中心化基礎上。一個好的例子就是 fee switch:一個控制開啟 fee switch 的 ownership 是有價值的、但 owner 永遠沒有長期動機開啟 fee switch。

我認為在現在的 DeFi 中,這樣的協議非常稀缺。除了 Uniswap 之外,幾乎沒有看過其他 protocol 符合這樣的條件。在 Morpho 的設計中,可以看出他們不只確保去中心化、也非常有意的在往 minimized governance 的方向靠攏,確保就算哪天就算 owner 變壞人了,這個合約也可以完全以 credibly neutral, 並不斷支援新的 market 的方式運作下去。

Morpho is a primitive, a public good, or a Hyperstructure.

也正因如此,我非常的喜歡 Morpho(尤其是 

MorphoBlue

),所以前陣子花時間做了一個讓所有人可以直接 supply 到個別市場的工具: MonarchLend.xyz。如果是對於自己管理倉位很有信心的的人,我推薦直接使用這樣的方式 supply to markets,才不會被 vault 抽中間的手續費。

歡迎試玩: https://www.monarchlend.xyz/

簡單漂亮的 Morpho 介紹完了,希望之後可以再介紹複雜大概 100 倍,但是一樣非常去中心化的 Euler V2!

這篇文章 新生代 DeFi 基礎 (Hyperstructure) 典範:借貸協議 Morpho 最早出現於 鏈新聞 ABMedia。