進階 DeFi 與市場結構
閃電貸
閃電貸是一種無抵押、不查信用的貸款,你必須在同一筆交易內借出並還清。在你意識到以太坊交易是原子性的之前,這聽起來不可能:要嘛每一步都成功,要嘛整筆交易像從未發生般被回滾。協議就只是把資金交給你、呼叫你的程式碼,然後在最後檢查款項(加上一筆小額手續費)是否已歸還。若未歸還,整筆交易便回滾、貸款自動撤銷,所以放款方絕無虧損之虞。這讓平常龐大且難以企及的資本,能以區區數十萬 gas 的代價供任何人取用。
閃電貸之所以存在,是因為要求抵押的常見理由——借款者捲款消失的風險——被原子性消除了。在那單一筆交易內,你可以借數百萬、用它做些有生產力的事,再把它還掉。正當用途常見且有價值:套利兩個去中心化交易所之間的價差、在無須先還款下調換某筆貸款背後的抵押品、把債務部位從一個協議再融資到另一個,或自行清算以避開清算罰金。借款者基本上不需任何起始資本,只需足以覆蓋 gas 與貸款手續費者即可,Aave 上常約 0.05% 到 0.09%。
同樣的性質使閃電貸成為攻擊的力量倍增器。攻擊者能免費借來一筆鉅款,用它撼動一個淺薄 AMM 池的價格、剝削一個天真信任那個被操縱價格的合約,再還掉貸款——全部原子性完成,除了 gas 一無所險。這裡務必說清楚:閃電貸並未製造漏洞,它只是移除了利用一個既已存在之漏洞的資本門檻。防禦的教訓是,任何合約都絕不應假設攻擊者在單一交易內資金有限,而對價格敏感的邏輯必須使用抗操縱的預言機,而非現貨池價。
function flashLoanCallback(uint256 amount, uint256 fee) external {
// amount is now in this contract for the duration of the tx
doArbitrage(amount); // must produce >= amount + fee
token.transfer(pool, amount + fee); // repay or the whole tx reverts
}借款者的回呼必須在交易結束前歸還本金加手續費。
把閃電貸本身稱作「攻擊」是常見的不精確。閃電貸是中性的工具;攻擊是它讓人負擔得起去剝削的那個底層臭蟲(通常是預言機操縱或被破壞的不變量)。真正的防禦是修好合約,而非禁止閃電貸。
另見