Solidity
Aave 在狀態修改時的 gas 消耗
在每次操作
LendingPool
(存款、取款、還款、借款等)時,Aave 都會針對某些變數更新其整個狀態,包括每個持有 aToken 的使用者的 aToken 餘額。在不斷更新數百萬使用者的利息餘額時,Aave如何在寫入儲存時支付gas?
我在某處讀到,是使用者為此付費,但我沒有看到一個使用者僅在一次交易中支付數百萬其他人的狀態修改。餘額更新是一個持續的過程,即使您沒有與協議互動也會發生。
來自
ReserveLogic.sol
:function updateState(DataTypes.ReserveData storage reserve) internal { uint256 scaledVariableDebt = IVariableDebtToken(reserve.variableDebtTokenAddress).scaledTotalSupply(); uint256 previousVariableBorrowIndex = reserve.variableBorrowIndex; uint256 previousLiquidityIndex = reserve.liquidityIndex; uint40 lastUpdatedTimestamp = reserve.lastUpdateTimestamp; (uint256 newLiquidityIndex, uint256 newVariableBorrowIndex) = _updateIndexes( //---> writes to storage reserve, scaledVariableDebt, previousLiquidityIndex, previousVariableBorrowIndex, lastUpdatedTimestamp ); _mintToTreasury( //---> mints the accrued interest reserve, scaledVariableDebt, previousVariableBorrowIndex, newLiquidityIndex, newVariableBorrowIndex, lastUpdatedTimestamp ); }
來自與 的每次互動的線
LendingPool
:reserve.updateState();
Aave 採用了“索引”的概念——不是協議寫入所有使用者帳戶的儲存,而是索引得到更新,這是由使用者支付的。稍後,無論誰查詢“balanceOf”函式(它是免費的,因為它是常數),都將使用最新的索引來計算給定使用者的餘額。
這實際上並不是 Aave 獨有的。許多 DeFi 協議採用類似的策略。以Maker為例,它的Rates Module文件對您來說應該是一本不錯的讀物。