原文標(biāo)題:《一文讀懂「延時貔貅」的實現(xiàn)原理和防范措施》
原文來源:Odaily 星球日報
代幣貔貅,通常指某個代幣只能購買而不能出售的情況,而開發(fā)者會在一段時間后撤除?LP?獲利,對購買者?Rug Pull。而延時貔貅則是在代幣剛開放交易的短時間內(nèi)可以交易,而后變成了貔貅狀態(tài)。對于此類??Rug Pull 手法,許多合約檢測工具暫未添加相應(yīng)的檢測功能,正成為惡意開發(fā)者的主要獲利手段之一。
下面,Odaily 星球日報將通過簡易概述?ERC?20?和??Uniswap??的原理,講解延時貔貅是如何實現(xiàn)的。
注:文章中的部分類比,為便于理解,并不完全嚴(yán)謹(jǐn)。
ERC?20 基礎(chǔ)
市場上絕大部分代幣遵守?ERC-20?標(biāo)準(zhǔn),而?ERC-20?是什么,ChatGPT?答案如下:
ERC-20?是一種以太坊(?Ethereum?)區(qū)塊鏈上的代幣標(biāo)準(zhǔn),它定義了代幣合約必須遵循的一組規(guī)則和接口。這個標(biāo)準(zhǔn)規(guī)范了代幣的基本功能,包括轉(zhuǎn)賬、余額查詢、授權(quán)代表他人花費(fèi)代幣等。
以下是一些主要的?ERC-20?代幣標(biāo)準(zhǔn)規(guī)則和功能:
轉(zhuǎn)賬(Transfer):ERC-20?代幣可以通過智能合約的方法進(jìn)行轉(zhuǎn)賬,使用戶能夠向其他以太坊地址發(fā)送代幣。
余額查詢(BalanceOf):用戶可以查詢他們的?ERC-20?代幣余額,以查看他們擁有的代幣數(shù)量。
余額查詢(BalanceOf):
實際上,該函數(shù)不僅具有「查詢」功能,用戶「擁有」多少代幣也由該函數(shù)定義。可以將每個代幣理解為一個「銀行」,而每個錢包地址在交易代幣后,從「銀行」處獲得了一張「儲蓄卡」,記錄了每個地址的余額(Balance),用戶即可以向銀行申請查詢自己的余額情況,也可以向銀行提出資產(chǎn)變更請求進(jìn)行交易。
注:以太坊采用了賬本(Account-?Based?)模型。
因此,用戶本質(zhì)上并不「擁有」其資產(chǎn),而是由一個函數(shù)「定義」了你可以去」花費(fèi)「的代幣數(shù)量。
即:X?代幣?Balance Of [A?賬戶]=A?賬戶可以對外花費(fèi)的?X?代幣數(shù)
注:現(xiàn)實世界中的銀行存款是銀行對客戶的債務(wù),銀行具備資產(chǎn)所有權(quán)。
轉(zhuǎn)賬(Transfer)
所有的?ERC-20?代幣都要完善?transfer?函數(shù),而基于前面的賬本模型,在發(fā)生一筆轉(zhuǎn)賬的時候,也并非?A?賬戶向?B?賬戶「交付」了一筆代幣,而是從?A?賬戶扣款代幣數(shù)量?X,在?B?賬戶增加代幣數(shù)量?X。
即:Balance Of [A?賬戶]-X 同時 Balance Of [B?賬戶]+X
而開發(fā)者可以修改?transfer?函數(shù),對轉(zhuǎn)賬數(shù)量、轉(zhuǎn)賬人等進(jìn)行限制。
轉(zhuǎn)賬函數(shù),是絕大多數(shù)貔貅機(jī)制的根本源頭。
Uniswap
前一節(jié)將每個代幣類比成一個「銀行」,則?Uniswap?在此可以理解為一個承兌的中間人,通過?xy=k?的?AMM?原則兌換兩種代幣。
而兌換的流程如下:
用戶向?Uniswap?合約轉(zhuǎn)賬代幣?A
- Uniswap?將收到的代幣,通過?y=k/x?計算應(yīng)返還的代幣,并扣除手續(xù)費(fèi)
- Uniswap?向?LP?池子轉(zhuǎn)入代幣?A,并取出代幣?B
- Uniswap?向用戶轉(zhuǎn)賬代幣?B
當(dāng)然,Uniswap?實際上涉及多個函數(shù)和流程,本處需要了解的重點是,Uniswap?僅基于「收到的代幣」進(jìn)行交易,而在用戶進(jìn)行「轉(zhuǎn)賬」操作的時候,數(shù)量或已發(fā)生了變化。
貔貅機(jī)制
本節(jié),將貔貅機(jī)制分為兩類:
①高交易稅,導(dǎo)致用戶收不到銷售代幣回款;
②無法轉(zhuǎn)賬,導(dǎo)致用戶無法與?Uniswap?交易。
高交易稅
本小節(jié)展示一個具備交易稅的?Meme?幣計算流程如下圖(僅關(guān)注紅色部分)。
1、計算交易稅(S)
2、從用戶里錢包足額扣錢(BalancerOf[用戶] 減少代幣?A)
3、向開發(fā)者錢包或?LP?等地址轉(zhuǎn)賬(BalancerOf[Dev] 增加代幣?A×稅收?S)
4、向?Uniswap?轉(zhuǎn)賬部分代幣兌換代幣?B(代幣?A×(?1-S))
5、用戶收到不足額的代幣?B
如前節(jié)所述,Uniswap?只對「收到的代幣」進(jìn)行處理,而開發(fā)者可以任意修改轉(zhuǎn)賬給?Uniswap?和用戶的數(shù)量。
此處,若將交易稅率修改為?100%?,則在第三步「③向開發(fā)者錢包或?LP?等地址轉(zhuǎn)賬「實現(xiàn)了貔貅,用戶無法再收到代幣。
無法轉(zhuǎn)賬
Solidity?中,開發(fā)者可以通過?require?對交易進(jìn)行限制:
若開發(fā)者限制兌換代幣的對象僅限某些白名單地址,則用戶無法將手中的代幣向?Uniswap?發(fā)送,則在第二步「②從用戶里錢包扣錢」實現(xiàn)了貔貅,而開發(fā)者可以設(shè)置?Uniswap?的??Router??可以發(fā)送代幣,結(jié)果就為:?
用戶只能購買(Uniswap?向用戶轉(zhuǎn)賬代幣),但不能出售(因不能把代幣轉(zhuǎn)賬給?Uniswap?兌換?ETH?等)。
亦或者開發(fā)者可以將轉(zhuǎn)賬上限設(shè)置為?0、關(guān)閉交易開關(guān)等多種路徑操作,但最終都是對「轉(zhuǎn)賬」這一行為進(jìn)行控制。
延時貔貅
進(jìn)一步的延時貔貅則是通過對時間(區(qū)塊高度)進(jìn)行?require?限制實現(xiàn)貔貅。
例如在某代幣中,其限制如下:
?require(block.number < _allowance)
則隨著區(qū)塊高度的增加,到了某個閾值時用戶將無法轉(zhuǎn)賬,實現(xiàn)了貔貅。
此外,還有通過交易次數(shù)達(dá)到一定閾值實現(xiàn)的貔貅,此類延時貔貅在某些合約安全檢測工具檢查時,若未有針對性設(shè)置,初始情況下均能正常交易,誘使用戶進(jìn)入陷阱。
如何預(yù)防
鑒于此類收割手法常見于「沖土狗」,購買者往往追求效率、忽略安全,且我們暫未看到哪家成熟的安全公司針對這一手法推出專項檢測工具,所以 Odaily 星球日報在此提示,有一定代碼能力的購買者為了自身資產(chǎn),還應(yīng)過一遍合約代碼(或借?ChatGPT?等工具速覽),尤其關(guān)注?selpair?合約,遠(yuǎn)離包含不常見代碼片區(qū)的項目。
原文鏈接