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