以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

SharkTeam:UniswapV4 Hook最佳安全實踐_POO:POOLX幣在那個交易所

Author:

Time:1900/1/1 0:00:00

近期Uniswap Lab官宣了下一代 AMM Uniswap V4 的開發進展,并公開了白皮書和代碼倉庫。這次 V4 的白皮書僅僅只有 3 頁,原因是 V4并沒有對 AMM 的核心算法邏輯做太多修改,而是在 V3 的基礎上,增加了一些新的特性,以滿足更多的場景需求。SharkTeam將基于目前已開源的代碼,來看看 V4 帶來了哪些新的特性,并針對V4推出的重要特性Hook分析最佳應用實踐。

1.1 AMM在 AMM 算法層面,Uniswap V4 并沒有對 V3 做修改,依然使用基于恒定乘積 x*y=k 的流動性算法。

在 Uniswap V3,每一個交易對可以有 4 個池子(原本是 3 個,后來增加了一個新的 1bp pool),分別代表 0.01%, 0.05%, 0.3%, 1% 費率的池子,這些池子對應的 tick space 也各不相同,在創建池子的時候,只能選擇這 4 種中的任一個。

在 Uniswap V4,每一個交易對理論上可以有任意數量的 pool,并且每一個 pool 的 fee rate 也可以是任意值,這些 pool 的 tick space 也可以是任意值。

這同時也帶來了一個問題:Uniswap V4 中交易對的流動性將被碎片化,因此需要一個更有效的 router/aggregator 來幫助用戶找到最優的交易路徑。

1.2 Hooks

Hooks 是一組由第三方或者 Uniswap 官方開發的合約,在創建 pool 的時候,pool 可以選擇綁定一個 hook. 之后在交易的特定階段,pool 都會自動調用與之綁定的 Hook 合約。Uniswap V4 一共定義了這些可以執行 hook 合約代碼的階段:

beforeInitialize

afterInitialize

beforeModifyPosition

afterModifyPosition

beforeSwap

afterSwap

beforeDonate

afterDonate

分別表示在初始化 pool,添加/移除流動性,交易,捐贈等操作的前后,都可以調用 hook 合約。

Hook 合約需要顯式指定在上述的哪些階段進行執行,而 pool 則需要知道對應的 Hook 在某個階段是否需要執行,為了節省 gas,這些 flag 都沒有在合約中進行存儲,而是需要 Hook 使用特定的地址來標明。具體判斷的代碼如下:

CoinShares:上周數字資產投資產品凈流出3040萬美元:金色財經報道,據 CoinShares 報告顯示,上周數字資產投資產品凈流出 3040 萬美元,結束了連續 6 周的資金流入。其中比特幣投資產品凈流出 5310 萬美元,以太坊投資產品凈流入 1680 萬美元,做空比特幣的投資產品凈流入 150 萬美元。[2023/4/24 14:23:40]

可以看出,Hook 地址的前 8bit 都別用來標記在特定階段此 Hook 是否需要執行的 flag.

因此,Hook 的開發者需要在部署合約的時候,產生出滿足 Pool 要求的地址,這通常需要使用 Create2 + 計算隨機Salt 來實現。

以下是白皮書中關于Hook執行的一個例子:

可以看到在執行 swap 的前后,pool 會先檢查 pool 對應的 Hook 是否開啟了相應的 flag,如果開啟了,就會自動調用 Hook 合約的相應函數。

1.3 動態 fee ratio

除了可以在特定階段執行代碼之外,Hook 還可以決定某一個 pool 的 swap fee 費率,和 withdraw 費率。withdraw 費率指的是用戶在移除流動性時需要向 Hook 支付的費率。除此之外,Hook 還可以指定在 swap fee 中抽成一部分給自己。

在創建 pool 時,需要使用 fee 參數(uint24)前 4個 bit 來標記此 pool 是否使用動態 fee,以及是否啟動 hook swap fee 和 withdraw fee:

如果啟動了動態 fee,那么 pool 會在每次 swap 之前,調用 Hook 合約來獲取當前的 swap fee ratio. Hook 合約需要實現 getFee() 函數,返回當前的 swap fee ratio.

Hooks 讓 Uniswap V4 成為了一個開發者平臺,給了 AMM 更多的可能性。一些可以用 Hooks 來實現的功能包括TWAMM(時間加權自動做市商)、Limit Order(限價訂單)、LP復投等將在后續的章節中詳細介紹。

1.4 Singleton 合約

Uniswap V3 中每次創建新的 pool 都需要部署一個新的合約,這會消耗大量 gas,但是其實這些 pool 使用的代碼是相同的,只是初始化參數不相同而已。Uniswap V4 引入了 Singleton 合約,用來管理所有的 pool,這樣創建新的 pool 不再需要部署新的合約了,節省了部署合約的 gas.

摩根大通分析師:以太坊Shanghai升級或會導致Coinbase質押收入激增:1月23日消息,摩根大通分析師表示,以太坊Shanghai升級可能會導致Coinbase的質押收入激增,為Coinbase開創一個新的質押時代。該投資銀行估計,在上海升級之后,Coinbase上95%的散戶投資者都可以參與以太坊的質押,這將使該交易平臺每年產生2.25億美元至5.45億美元的收入。[2023/1/23 11:27:18]

另外,使用 Singleton 合約的好處是,可以減少交易過程中 token 的轉賬,因為所有的 pool 都在同一個合約中,所以可以直接在合約內部完成跨 pool 的 swap,而在 V3 中,跨 pool 的 swap 會需要將 token 在不同 pool 中轉來轉去,這會增加 gas.

同時,在 V4 中,所有 pool 使用同一個合約,并且合約內部的 token 記賬也被簡化為每種 token 按 token 來記賬,而不是按 pool 來記賬,這樣一來如果想使用閃電貸借大量 token 也會更方便。

1.5 extload

為了方便 Hook 和其他合約的 integration,V4 合約增加了 extload 函數,這樣合約所有內部 states 都變成外部可讀了,所有 pool 的狀態將對外部完全透明。

1.6 Flash Accounting

為了減少跨 pool swap 的 token 轉賬,V4 同時使用被稱為 Flash Accounting 的方法,將 swap, add/remove liquidity/flash loan 的過程都標準化成一種類似閃電貸的過程:

(1)用戶獲取一個 lock

(2)用戶進行任何操作,例如在多個 pool 中 swap,add/remove liquidity,或者通過閃電貸向 pool 借 token

(3)用戶所有操作所產生的 token 轉賬都會被記錄在 lock 中

(4)所有操作結束后,用戶可以取走他獲得的 token,同時需要支付 lock 中記錄他需要支付的 token.

這些過程需要發生在一個交易中。

這樣一來,如果一個交易中需要跨多個 pool 進行 swap,在結算時只需要兩筆轉賬就夠了。例如,在一次 ETH->USDC-BTC 這樣的 swap 中,USDC 作為中間 token 完全不需要任何轉賬。

1.7 ERC1155 mint/burn

Flash Accounting 可以減少同一筆交易中 swap 的 token 轉賬,通過使用 ERC1155 token ,可以進一步減少多個交易的 token 轉賬。

CoinShares:上周數字資產投資產品凈流入920萬美元:1月16日消息,據CoinShares報告顯示,上周數字資產投資產品凈流入920萬美元,交易量仍處于8.66億美元的低位,兩個數據都表明近期數字資產的上漲并非由投資產品帶動。其中,比特幣投資產品凈流入1010萬美元,以太坊投資產品凈流入560萬美元,結束了連續8周的凈流出。做空比特幣的投資產品凈流出150萬美元。多資產投資產品與XRP投資產品分別流出320萬與330萬美元,而區塊鏈股票出現380萬美元的資金凈流入。[2023/1/16 11:14:47]

V4 允許通過 ERC1155 mint,將屬于你的 token 保存在 V4 合約中,這樣你就可以在多個交易中使用這些 token,而不需要每次都將 token 轉賬到 V4 合約中。

使用 ERC1155 burn 可以將保存在 V4 合約中的 token 取出。

ERC1155 適合頻繁 swap 或 add/remove liquidity 的用戶,這些用戶可以將常用的 token 直接保存在 V4 合約中,這樣可以減少 token 轉賬的 gas 開銷。

2.1 TWAMM(時間加權自動做市商)

Alice想在區塊鏈上購買價值1億美元的以太幣。在現有的自動做市商(AMM)平臺(例如Uniswap)上執行這么大規模的訂單將非常昂貴,因為這些平臺可能會向Alice收取高昂的費用,以防止她利用內幕消息獲取更好的價格。

為了獲得更好的價格,Alice的最佳選擇是手動將訂單拆分成幾個較小的子訂單,并在幾個小時內逐步執行它們。這樣做的目的是讓市場有足夠的時間來意識到她沒有內幕消息,從而給予她更好的價格。但是,即使她發送幾個較大的子訂單,每個子訂單仍然會對價格產生重大影響,同時還容易受到敵對交易者的“三明治攻擊”。

TWAMM通過代表Alice進行交易來解決這個問題。它將她的訂單分解為無限多個微小的虛擬訂單,以確保在時間上平滑地執行。同時,TWAMM利用嵌入式AMM協議的特殊數學關系,能夠在這些虛擬訂單中分攤Gas成本。由于TWAMM在區塊之間處理交易,因此也不容易受到“三明治攻擊”。

總的來說,TWAMM為Alice提供了一種更高效的方式來進行大規模交易,避免了高昂的手續費和潛在的市場操縱。

TWAMM 有一個內置的 AMM,這個 AMM 和其他的 AMM 并沒有什么不同,用戶可以通過這個 AMM 直接進行現貨交易,也可以向其中添加流動性。但是 TWAMM 同時還有兩個 TWAP order pool,分別用來執行兩個方向的 TWAP order,用戶提交 order 時,指定交易的 token input 數量和時長,TWAMM 會將相同交易方向的 order 放入對應的 pool 中,并按照指定的交易速度自動進行交易。當用戶的 order 被完全執行后,用戶就可以拿出交易得到的 token。當然,在用戶的 order 在被執行完成之前,用戶也可以提前取消 order 或者修改 order 需要交易的 token 數量。

CoinShares:2021年比特幣碳排放僅占全球碳排放量0.08%:金色財經報道,CoinShares 最新研究發現,比特幣碳排放影響微乎其微,2021年全年比特幣碳排放為41 兆噸,雖然高于2020年36兆噸,但僅占全球碳排放量的不到0.08%,因此CoinShares認為這一數字幾乎是“無關緊要”(inconsequential)的,因為根據Galaxy Digital 2019 年估算數據顯示整個金融系統碳排放量達到130公噸。另據CoinShares報告顯示,哈薩克斯坦、美國蒙大拿州和肯塔基州以及加拿大阿爾伯塔省三地占到43%的比特幣挖礦碳排放,而瑞典和加拿大北克省和馬尼托巴省的碳排放量最低,幾乎可以忽略不計。[2022/2/2 9:27:23]

在以太坊中,智能合約只能由 EOA 地址主動發起交易觸發執行,而不能自動執行。因此 TWAMM 需要由 EOA 賬戶定期發送交易來結算其 order pool 中待交易的 token,這樣就需要一個 keeper 賬號來執行這些交易。

當然,也可以讓 TWAMM 在每次有用戶與其交互時,自動結算 order pool,這樣就省去了 keeper 的開銷,這也是 DeFi 協議處理流式數據常用的方式。

這種攻擊很難實施,由于一個區塊內 timestamp 不會改變,攻擊者必須要在一個區塊的最后一個交易中,將 pool 的價格拉高,這樣下一個區塊中的 TWAMM 結算才會受到影響。這就要求三明治攻擊發生在多個區塊中,這無疑會給攻擊者帶來很大的風險,因為其他套利者有可能在中間介入,導致攻擊者遭受損失。

同時,因為套利者的存在,這樣的價格操縱注定無法持久,由于 TWAP order 的特性它并不會在短時間內交易太多的 token,因此大部分情況損失也一定是有限的。

(1)此 Hook 維護兩個 TWAP order pool,分別表示兩個交易方向的 TWAP order

(2)用戶可以通過此 Hook 提交 TWAP order,需要指定交易的 token,數量以及時間長度

(3)此 Hook 注冊 beforeSwap 和 beforeModifyPosition,每次用戶交易或者調整倉位時,都會觸發此 Hook

(4)被觸發后,Hook 負責對 2個 TWAP order pool 進行結算

(5)用戶也可以在任意時刻手動觸發結算

(6)用戶可以取消或者修改 TWAP order 中的 token 數量

TWAMM注冊三個階段來進行hooks的邏輯調用,在pool初始化之前對TWAMM進行初始化,并在每次用戶交易或者調整倉位時觸發此hook。

CoinShares報告:加密投資產品的周流出總額達2.07億美元:1月11日消息,據 CoinShares 周一發布的一份報告,截至 1 月 7 日的 7 天內,加密投資產品的周流出總額達到創紀錄的 2.07 億美元,其中專注于比特幣的投資基金在 7 天內流出了 1.07 億美元,從 12 月中旬開始的市場拋售壓力導致加密基金 4 周的資金流出總額達到 4.65 億美元。

CoinShares 指出,在過去的四個星期里,基金交易額占比特幣總交易額的比例高達 25%,這突顯出投資者的活動比平時更多,以以太坊為重點的基金產品上周流出 3900 萬美元,使過去 4 周的資金流出達到 1.8 億美元。[2022/1/11 8:40:27]

用戶可手動調用TWAMM中的submitOrder函數來提交自己需要執行的order到合約中。

在用戶將自己需要執行的訂單添加進合約后,在pool每次進行swap和modifyPosition操作時,都會自動進行order的執行。

每有用戶調用v4的swap函數進行交易或modifyPosition函數更改倉位,都會觸發TWAMM中的執行函數,函數中會調用內部函數_executeTWAMMOrders繼續進行此前未完成order的執行。

_executeTWAMMOrders函數

以上為更新訂單的執行流程,在執行結束之后,會更新當前twamm的訂單執行時間。

與立即按照最后的市場價格執行的市價單不同,限價單在達到預定價格后立即執行。基于自動做市商(AMM)的 DEX 大多默認選擇市價單系統。對新人來說簡單易懂。市價單要么被執行,要么因參數(如最大價格影響)而失敗。而在限價單中,只有當資產價格達到限價時,訂單才會成交,否則訂單將保持未平倉狀態。

例如,假設 ETH 目前在 ETH/DAI 池中的交易價格為 1 ETH = 1500 DAI。用戶可以下一個止盈訂單,主要內容是 "如果 1 ETH = 2000 DAI,賣出我所有的 ETH"。如果達到這個價格,用戶的 ETH 將自動以去中心化的方式完全在鏈上交換為 DAI。

在 Uniswap 以前的版本中,限價訂單實際上是不可能的。大多數 AMM 只允許市場買入和賣出。而在V4版本中,由于hook的強大特性和可擴展性,讓限價單在v4中存在了實現的基礎。

limit order的設計原理相比于twamm來說,更加簡單一些,目前實現了有關添加流動性的限價單,交易的限價單實現起來也會比較容易。

由于v4中存在tickLower和tickUpper,并根據池子的交易情況變化,lower和upper會發生改變,用戶在進行添加流動性時并不想在當前價格進行添加,這時就可以利用limit Order hook來執行此需求,在hook中設定對應的價格,在每次swap結束后,hook會對當前pool的價格做判斷,若達到了設定的價格,則將對應的流動性進行添加獲取收益。

1. limit維護著多個epoch,作為不同lower和交易方向的限價單。

2. 用戶通過這個hook,提交自己的價格lower和交易方向,將限價單加入合約。

3. 此 Hook 注冊 afterSwap,只在每次swap結束后價格發生變動時觸發

4. 被觸發后,Hook 校驗當前價格區間,并從epoch中查驗當前價格是否存在需要進行添加流動性的限價單。

5. 用戶可以在任何時刻提款或直接添加流動性

合約注冊兩個階段觸發hook,在Pool初始化后對hook初始化,并在每次兌換結束后觸發hook邏輯。

用戶調用place函數傳入想要添加流動性的數量,價格以及交易方向,hook會先將用戶想要添加的流動性加入pool中保存,隨后為用戶創建對應的限價單。

在每次swap結束后都會觸發此hook,根據當前價格區間將區間價格內存在的限價單完成添加流動性的操作。

用戶可在限價單完成之前調用kill函數取消限價單并獲得此次添加流動性獲得的收益。

用戶可在想要移除流動性時調用withdraw函數,即可提取想要的流動性。

總的來說,此limit order hook為用戶提供了一個更便捷的途徑,用戶可設定自己想要添加流動性時的價格,在池子中價格區間到達該價格后,hook自動為用戶到pool中執行添加流動性的操作,且用戶可以隨時取消和提取流動性。

除TWAMM和Limit Order外,基于Hook還可以實現LP復投、動態手續費變化等功能,因為篇幅原因,我們將在后續的分析中展開介紹:

LP復投:用戶可利用hook來進行流動性的添加,修改和移除,hook可注冊afterSwap和afterModifyPosition來進行調用。由于用戶統一使用hook來進行流動性的添加,所以在poolManager中添加流動性的地址只有hook,hook可在每次觸發時查驗當前時間,每經過一定時間段后,選擇提取流動性獎勵并將獲得的lp代幣再次到pool中添加流動性,從而自動化優化用戶收益。

動態手續費變化:hook可注冊beforeSwap等接口,來進行交換之前的動態手續費修改。動態手續費可以不是簡單地根據時間線性變化,可以根據單筆 swap 產生的 tick 跳躍數量來量化波動率,從而動態改變手續費,實現對于 LP 無常風險的對沖。從而減少因為交易產生的無常損失對流動性提供者造成的影響。

減少require和revert的使用

在有關pool對hooks調用的函數邏輯中,盡量減少回退語句的使用,由于pool合約與hooks合約存在共通關系,在hooks中發生交易回滾后,會導致pool中的交易同樣回退,如果在hooks中出現與pool中正常交易不相關的回退語句,可能會導致用戶無法正常使用pool中的功能。

避免在hook中使用selfdestruct函數,如果hook中調用到了自毀函數,不僅會導致hook中的邏輯出現問題,并且會導致pool中的功能也無法正常進行,使整個pool池中的資產丟失并且功能無法正常進行。

嚴格控制hook合約中的權限,避免出現權限過大的角色,并對特權角色進行多簽管理,防止出現單點攻擊。避免存在特權角色可任意修改合約狀態變量的情況,可能會出現邏輯錯誤導致整個交易發生回滾,影響pool的正常使用。驗證最小權限原則,我們應當使用openzeppelin的AccessControl合約來實現控制訪問更細粒度的權限,因為該實踐限制每個系統組件遵循最小權限原則。

hooks作為Pool的外部擴展代碼,同樣應該注意合約中可能出現的重入攻擊,例如限價單中在進行原生代幣轉賬時可能出現的重入,導致合約資產出現損失。在調用外部合約或所謂的“檢查-生效-交互”模式之前檢查并嘗試更新所有狀態。這樣,即使重入,也不會產生任何影響,因為所有狀態都已完成更新。.

有些開發者可能會使用代理合約以便后續對hook的邏輯進行變動和升級,但也因此需要注意到合約升級方面可能存在的問題。首先,hook中即使采取代理模式,代理合約中也需要聲明對應的階段,例如beforeSwap等,否則pool無法校驗到正確的返回值。其次,在調用 delegatecall 之前檢查目標合約是否存在,Solidity 不會替我們執行此檢查,忽略檢查可能會導致意外行為和安全問題,仔細考慮變量聲明的順序,因為會出現變量打包存儲同一個插槽、影響gas成本、內存布局、delegate調用結果等問題。

SharkTeam的愿景是全面保護Web3世界的安全。團隊由來自世界各地的經驗豐富的安全專業人士和高級研究人員組成,精通區塊鏈和智能合約的底層理論,提供包括智能合約審計、鏈上分析、應急響應等服務。已與區塊鏈生態系統各個領域的關鍵參與者,如Polkadot、Moonbeam、polygon、OKC、Huobi Global、imToken、ChainIDE等建立長期合作關系

Foresight News

金色財經 Jason.

白話區塊鏈

金色早8點

LD Capital

-R3PO

MarsBit

深潮TechFlow

Tags:HOOHOOKPOOPOOLhook幣未來能漲到多少hook幣最新消息POORPOOLX幣在那個交易所

中幣交易所
印度發布了關于制定全球加密貨幣規則的意見_區塊鏈:SHA

作者:Amitoj Singh,CoinDesk;編譯:松雪,金色財經現任二十國集團 (G20) 主席國印度發布了關于加密貨幣的總統聲明,試圖將其建議納入全球加密貨幣規則的框架中.

1900/1/1 0:00:00
比特幣文化/技術復興?Ordinals 系列協議大起底_BSP:BSPNetwork

比特幣生態已經有一段時間沒有看到這種級別的開發者活動了。讓我們探索一下在這次序數爆炸期間出現的一些實驗性協議。首先,讓我們定義一些比特幣 Builder 在提到他們的項目時可能會用到的一些術語.

1900/1/1 0:00:00
減半敘事與反身性:LTC不漲反跌 BTC減半能迎牛市么_POO:比特幣

作者:深潮 TechFlow 保潔8月2日23點,曾經被冠以“比特金萊特銀”的萊特幣(LTC)區塊高度來到2,520,000, 區塊獎勵正式減半.

1900/1/1 0:00:00
解碼Intent:為何它能顛覆Web3用戶體驗和區塊鏈訂單流_SOLVE:ENT

作者:Grace Deng,SevenX Ventures 研究員;翻譯:金色財經xiaozou 1、前言 隨著Web3技術邁向大規模采用.

1900/1/1 0:00:00
晚間必讀 | DeFi已死了嗎?_區塊鏈:區塊鏈dapp開發公司

我們將在本文深入研究關于現實世界資產(RWA)代幣風險管理的關鍵問題。我們將分析不同協議是如何處理此類相關風險的,并討論迄今為止可能遇到的所有問題.

1900/1/1 0:00:00
從流動性質押協議到抵押品多樣化 LSDFi演變的三個階段_ETH:EFI幣

作者:ValHolla;編譯:Block unicorn每個人都知道以太坊合并會對DeFi產生積極的影響,但不到一年的時間,它已經超越了最瘋狂的看漲預期.

1900/1/1 0:00:00
ads