# Stargate Finance ### Stargate Finance 為何引起關注? <blockquote class="twitter-tweet"><p lang="en" dir="ltr">First off: we did indeed buy all the tokens. We love the team and what they&#39;re doing, and we believe this space and the technology they&#39;re building is really important.</p>&mdash; Sam Trabucco (@AlamedaTrabucco) <a href="https://twitter.com/AlamedaTrabucco/status/1506306852396617732?ref_src=twsrc%5Etfw">March 22, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> **上面推文中,Alamenda Research 在 Stargate Finance 官方代幣拍賣時,掃光了所有拍賣的代幣 (10%的份額),加上 Stargate Finance 與跨鏈流動性的連結,與其背後的 LayerZero 的跨鏈技術帶來的豐富想像,使大眾對這個項目充滿期待。** --- ### Stargate Finance 認為目前的跨鏈橋 (bridge) 有三個問題: 1. **需要各式各樣的封裝 (Wrapped) 代幣,例如xBTC** 2. **A 鏈跟 B 鏈的 X 代幣是一個流動性池,A 鏈跟 B 鏈的Y代幣是一個流動性池,C 鏈跟 B 鏈的 X 代幣又是一個流動性池,不同鏈不同代幣單獨的流動性池,導致流動性池過小,對大額用戶相當不便** 3. **無法實現跨鏈互操作性,也就是 A 鏈不可以跨鏈操作 B 鏈的智能合約** **說明:封裝 (Wrapped) 代幣假如在 A 鏈轉帳到 B 鏈,須將 A 鏈上的 ATOKEN 鎖住並1:1 在 B 鏈上鑄造 xATOKEN,xATOKEN 就是封裝代幣,xATOKEN 在 B 鏈上可等同於 ATOKEN,但 xATOKEN 並不是 B 鏈的原生代幣,因此如果需要使用 B 鏈的原生代幣就需要再次交換,也就是說xATOKEN 是跨鏈轉帳的媒介,通常跨鏈轉帳的使用者,拿到轉帳的媒介後,還需再交換一次代幣成自己想要的代幣,這一步除了麻煩還會增加額外的手續費。** **場景舉例:使用者需要將 Ethereum 上的 USDC,轉到 BNB Chain 上,透過 anyswap,anyswap 會鎖住在 Ethereum 上的 USDC,並 1:1 在 BNB Chain 上產生 anyUSDC,但anyUSDC 並不能在 BNB Chain 上通用,因此需要再透過交易將 anyUSDC 轉成 USDC。** --- ### Stargate Finance 認為的跨鏈橋三角難題: 1. **即時保證最終性** 2. **統一流動性** 3. **原生資產交易** **說明:第一點是指來源鏈如果提交了跨鏈轉帳需求,而目標鏈也要提交成功。第二點,A 鏈跟其他鏈的跨鏈不再是各自一個流動池,而是只要跟 A 鏈跨鏈的目標鏈,共用一個流動池,使能承受的跨鏈交易量增加。第三點透過 Stargate,不再需要封裝代幣,能直接交易取得想要的原生資產。** **Stargate 除了解決跨鏈橋的三角難題,因為他的跨鏈基礎是 LayerZero,因此可以實現真正的互操作性,在傳統的跨鏈方案上,可以與來源鏈的合約相結合,但不能與目標鏈的合約結合,舉例:資產可以在來源鏈上交換,使用 ∆Bridge 橋接到目標鏈,然後在目標鏈上交換,所有這些都在同一個跨鏈交易中。** --- ### 為甚麼 Stargate 需要 Delta Algorithm(Algo.)? **在傳統封裝代幣的跨鏈方法下,透過在來源鏈上抵押代幣,並在目標鏈上鑄造封裝代幣,因為鑄造封裝代幣並沒有流動性問題,理論上抵押的代幣足夠,可以無限量的增發。但因 Stargate 並沒有封裝代幣,所以做法比較像下圖 (這是初始想法並不是Stargate最終做法),X 鏈與 A、B、C、D 鏈連接,為每個連接設立一個流動池,當有人需要從 A 鏈轉帳到 X 鏈時,其流程就是使用者將資產放入 A 鏈屬於X 鏈的流動池,並從 X 鏈的流動池 (屬於 A 的部分) 提取相同價值的資產,設立每個鏈單獨的流動池原因,就是為了保證交易的最終性,因為當轉帳的交易流程在 A 鏈完成就必須要確保在 X 鏈也能完成,如果今天有多筆跨鏈轉帳在 A、B、C、D 同時對 X 發生,就必須要確保 X 鏈流動池有足夠資產,但如果不單獨設立流動池,舉例 A、B、C、D 跨鏈轉帳各 100 元,但 X 鏈流動池只有 300 元,因為交易是同時的,所以 A、B、C、D 鏈都會覺得 X 鏈的流動池有足夠的資產,導致問題發生,因此將 X 鏈的流動池隔開成為單獨的流動池有其必要性。** **為每個鏈設立單獨的流動池,換句話說有 n 條鏈,等於有 $C^{n}_{2}$ 個流動池,Stargate 把這個稱為破碎的流動性 (Fractured liquidity)。Stargate 稱可以將破碎的流動性變為統一流動性 (Unfied Liquidity) 的方法稱為 Delta Algo.。但我認為,這比較像是將新跨鏈交易放入來源鏈的資產,重新分配到破碎的流動池。舉個例子,假設 X 鏈上當初分配給 A 鏈 100 萬的流動池,因為 A 鏈上持續對 X 鏈的跨鏈轉帳交易,X 鏈分配給 A 鏈的流動池金額降低到 20 萬,當新交易是從X 鏈轉帳到其他鏈,這個新交易放入的資金,就會分配給 X 鏈上給 A 鏈的流動池 (就算 X 鏈不是轉帳到 A 鏈),所以與其說統一流動性,不如稱他為重新分配還比較適當。** **Stargate 轉帳流程舉例,假如 A 鏈跨鏈轉帳到 X 鏈,使用者會在 A 鏈存入資產,這個資產會透過 Delta Algo. 分配給 A 鏈上的所有流動池,然後從 X 鏈上分配給 A 鏈的流動池中拿出相對應金額的資產,如此完成轉帳。** ![](https://i.imgur.com/zltvoFd.png) 圖片來源:[LayerZero White Paper](https://layerzero.network/pdf/LayerZero_Whitepaper_Release.pdf) --- ### 演算法相對複雜可以跳過 --- ### Delta Algo. 的用途 ![](https://i.imgur.com/m6F8oG1.png) 圖片來源:[LayerZero White Paper](https://layerzero.network/pdf/LayerZero_Whitepaper_Release.pdf) **就像上一章所說,Delta Algo. 的用途就是重新分配進入鏈的資產,如上圖,鏈 X 資產有 100,分配給 Y 鏈流動池 50、Z 鏈流動池 50,假如當持續的跨鏈交易 Y 鏈轉帳給 X 鏈,導致鏈 X 分配給 Y 鏈的流動池從 50 變成 20 發生赤字,那新進入 X 鏈的資產就會給一部分到鏈 X 分配給 Y 鏈的流動池 (不論是不是從 X 鏈轉帳到 Y 鏈),用以抹平赤字。** --- ### Delta Algo.符號說明 | Name | Notation | Function | | ---------------------------------- | ----------- | ---------------------------------------------------------------------------------------------- | | 被提供的流動性 (Liquidity provided) | $lp_s$ | 被存入的資產大小,可以當作流動池的初始金額 | | 資產 (Assets) | $a_s$ | 流動池的資產,跟 $lp_s$ 的差別為一個是初始大小,一個是後續經過變動的資產大小 | | 餘額 (Balance) | $b_{s,d}$ | 從 S 鏈轉帳到 D 鏈,S 鏈就是來源鏈 (source),來源鏈可以轉帳給給目標 (destination) 鏈最大金額,餘額紀錄在來源鏈 | | 餘額 (Last known balance) | $lkb_{d,s}$ | 記錄在 S 鏈上 $b_{d,s}$ 最後一次的紀錄 | | 信用 (Credit) | $c_{s,d}$ | 在下一次從 S 鏈轉到 D 鏈時,信用會加到 $b_{s,d}$ | | Name | Notation | Function | | ------------ |:----------------------------------------------------------------------:|:------------------------:| | 權重 (Weight) | $w_{s,d} \ \ \ \ 0\le w_{s,d}\le 1 \ \ \ \sum\limits_{d}{w_{s, d}=1}$ | S 鏈分配給 D 鏈的流動性比重 | --- ### Delta Algo.詳細說明 **結合之前對 Delta Algo. 的說明,Delta Algo. 的目的其實就是達成:** **$b_{d,s} ≈ a_s ×w_{s,d}$** **說明:上述式子,就是指在目標鏈上,目標鏈可以轉帳到來源鏈的餘額,要約等於來源鏈的資產,乘上分配給目標鏈的比重。** **下方的演算法場景為,轉帳金額為 t, 來源鏈為 s,目標鏈為 d,演算法場景為 s 鏈轉帳給 d 鏈金額為 t。** ![](https://i.imgur.com/r47VpsL.png) --- #### 執行在來源鏈 s 上的演算法 **1 到 17 行是原子的 (atomic),出現問題會回滾到初始狀態,其目的避免當有兩筆 (或更多) 同步 (concurrent) 交易,導致 $t_1 + t_2 \ge b_{s,d}$ 的情況發生,這種情況就是交易金額大於可用餘額。** **可以提交的 (committable) 交易,在目標鏈上的資產 $a_d$,必須大於轉帳交易的金額,committable(T) ⇒ $a_d$ > t。** ![](https://i.imgur.com/GY00O9F.png) **1.2.3. 代表在如果交易金額 t ,大於來源鏈可以轉給目標鏈的餘額,則拒絕交易** **4.5. 代表如果 1.2.3. 的檢查沒問題,則來源鏈因接收使用者的跨鏈轉帳請求,使用者將資產存入來源鏈,所以來源鏈資產 $a_t$ 會加上轉帳金額 t,而使用掉了來源鏈可以轉給目標鏈的部分餘額,所以 $b_{s,d}$-t。** ![](https://i.imgur.com/erjQsx6.png) **上面內容有提到,delta algo. 是重新分配獲得的資產,所以 6.7.8. 就是在計算各個流動型池的資產狀況,有沒有出現赤字。** **6.7.8. 首先用迴圈去跑與來源鏈連接的鏈的流動池,計算是否出現赤字。** **$lp_s*w_{s,x}$ 是來源鏈一開始分配給其他鏈得金額,也就是 "在初始時" 其他鏈所能跨鏈轉帳到來源鏈的最大金額,$lkb_{x,s} (記錄在 s 鏈上,x 可以跨鏈轉帳給 s 鏈的最大金額)+ c_{s, x}$ (是下一次 s 跨鏈轉帳到 x 時,c_{s, x} 的資產會加到 $lkb_{x,s}),所以相加就是 x 鏈分配給 s 鏈的全部資產。** **(初始 x 到 s 能跨鏈轉帳的金額 - 目前跨鏈轉帳的最大金額) $\ge$ 0代表出現赤字,這個赤字就是 $diff_{s,x}$。** **9. 就是將與 s 鏈相連接的所有 $diff_{s,x}$ 相加起來,就是所有的赤字 Total。** ![](https://i.imgur.com/o3JtcOv.png) **10.11.12. 如果跨鏈轉帳存入 s 鏈的資產 t 大於所有的所有的赤字,則 $diff_{s,x}$ 不變,用以彌補所有的赤字,如果小於則將 t 依造赤字的比例,改變 $diff_{s,x}$,用以彌補部分的赤字。** **13.代表如果存入 s 鏈的資產 t 大於所有的所有的赤字,t' 就是資產 t 扣掉所有的赤字。** ![](https://i.imgur.com/ZPFwJ9R.png) **14.15.16. 對所有與 s 鏈連接得其他鏈,將原本的 $c_{s,x}$,加上要彌補的赤字金額 ($diff_{s,x}$),再加上彌補赤字後還剩下的金額,依造 s 鏈給其他鏈的權重分下去(t'*$w_{s,x}$),得到最後的 $c_{s,x}$。** **為甚麼需要 $c_{s,x}$? 假如今天 s 鏈跟 a、b、c 鏈連接,今天跨鏈交易 s 鏈到 a 鏈,可以發現使用者存入 s 鏈的資產,也會分給 b、c,所以如果沒有 $c_{s,x}$ 來暫存,那這筆交易就需要再更新 b、c 鏈的值,造成更多的手續費,所以就須將這些值紀錄在 $c_{s,x}$,等下一次 s 鏈對 b 鏈或對 c 鏈交易,再將 $c_{s,x}$ 的值,更新到 b、c 鏈上,如此可以降低手續費。** ![](https://i.imgur.com/YEAWJwC.png) **17. 製作要傳給 d 鏈的訊息,包含 t、$c_{s,x}$。** **18.19.20. 將存在 s 鏈上的 d 可以跨鏈轉上給 s 的最大值 ($lkb_{d,s}$),加上累積下來的 $c_{s,d}$,完成後將 $c_{s,d}$ 歸零,最後將訊息送出。** --- #### 執行在目標鏈 d 上的演算法 ![](https://i.imgur.com/AKsh0OI.png) **21. 接收來源鏈訊息** **22. 因為資產被使用者提出,所以目標鏈的資產 ($a_d$) 扣掉轉帳資產 t,並更新目標鏈 d 可以跨鏈轉帳給來源鏈 s 的最大金額 ($b_{d,s}$),也就是加上累積下來的 $c_{s,d}$ ,最後因為 s 鏈提出的跨鏈轉帳交易讓在 d 鏈的流動池資產被提出,所以紀錄在 d 鏈上的 s 可以轉帳給 d 鏈的最大金額會降低,也就是需要扣掉轉帳資產 t。** --- ### 演算法舉例 ![](https://i.imgur.com/ZsmHW46.png) 圖片來源:[LayerZero White Paper](https://layerzero.network/pdf/LayerZero_Whitepaper_Release.pdf) **在初始狀態中,Chain X 初始流動性為 100,在初始狀態時,資產與初始流動性相同,所以皆為 100。並且 $w_{x,y}$ 為 0.5,所以 $lkb_{x,y}$ 為 100 乘上 0.5 等於 50。 $b_{x,y}$ 的值為 Chain Y 的資產乘上 0.6($w_{y,x}$) 等於 60,最後 $c_{x,y}$ 等於 0。** **交易 0(T0) 是從 X 轉帳到 Y 價值 40,首先使用者必須在鏈 X 存入 40(t),根據演算法 4 其 X 鏈資產 ($a_x$) 加上 40,演算法 5 代表鏈 X 可以轉給鏈 Y 的餘額 ($b_{x,y}$) 要減 40(t),演算法 7 計算是否出現赤字,因為 T0 之前都沒有轉帳交易,所以沒有赤字皆為 0($diff_{x,y}$),演算法 9 所有赤字總額為 0(total),演算法 10 為 t 扣掉 total 等於 40(t'),根據演算法 15 目的是彌補赤字,如果有盈餘則根據權重分發,所以 $c_{x,y}$ 和 $c_{y,x} 皆為20,演算法 18、19 將鏈 X 上的信用加到 $lkb_{y,x}$,這邊用意是將彌平赤字或盈餘的資產,重新加入紀錄在鏈 X 上 y 可以轉給 x 的餘額 ($lkb_{y,x}$),演算法 20 將訊息 (t、$c_{x,y}$) 傳到目標鏈 (鏈 Y) 後,鏈 Y 的資產 ($a_y$) 會扣掉 40(t),因為資產會被使用者提出,接著更新 y 可以轉給 x 的餘額 ($b_{y,x}$) 為 70,記錄在 y 上 x 可以轉給 y 的餘額 ($lkb_{x,y}$) 扣掉 40 等於 20,如此就完成交易,在白皮書中還有兩個舉例,讀者可以自己去練習。** --- ### 結論 **Stargate Finance 透過跨鏈技術 LayerZero,可以解決許多跨鏈橋的問題,包括取消麻煩的封裝代幣、更高的流動性以及提供跨鏈的互操作性,雖然 Delta Algo. 不是白皮書所說的提供統一流動性,但透過重新分配進入鏈的資產,能提供更高的流動性。** --- ### 參考文獻 #### [Stargate Finance White Paper](https://stargateprotocol.gitbook.io/stargate/) --- **作者:hugebing 協作人:y.w. 審稿人:狸貓(bill)** ### 以上文章內容不構成投資建議 ###### tags: `Blockchain Articles`