header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
掃碼下載APP
Partnered With:

如何修復Kava-3主網「BEP3資產供應調整」bug

閱讀本文需 14 分鐘
該 bug 不會影響用戶資金的安全性

原文標題:《Kava-3 主網錯誤修復報告》

原文作者:卡瓦實驗室



摘要:目前 Kava 主網上有一個較小的 bug,會影響 BEP3 資產供應的調整,這意味着我們暫時無法上調 Kava CDP 內的 BNB 抵押額度(目前已觸頂 40,000 BNB)。不過請放心,該 bug 不會影響用戶資金的安全性。


kava-3 網絡使用參數來管理治理鏈鏈的狀態。通過治理改變參數,Kava 可以管理主鏈的運行方式,並在有時效性的緊急情況下用委員會治理來快速應對。我們發現在其中一個參數——BEP3 的資產供應限制上存在一個較小的 bug,導致參數值的變化無法實現,這意味着當前的供應替代 40,000BNB 無法更新。


如何修復 bug?


修復實際上只需要更新幾行代碼,設置當供應限制的參數值更新時,強制執行應用的狀態也相應更新。但只能是的,這對系統而言是一個大的變化,所以我們不能僅僅依靠發佈一個新的 v0.8 版本來修復這個問題。


修復將如何實現?


初步網絡更新


我們已經編寫了一個軟件版本,修復了這個小 bug。在 bug 修復中,我們指定了代碼執行的時間。驗證者需要在指定的時間之前更新自己的中斷,確保網絡順利更新,不會出現服務中斷的情況。任何遺留在上一版本軟件上的上游都會在代碼生效時被軟分叉掉。這基本上也是以太坊核心開發者在「網絡升級」時的操作。


軟分叉
指區塊鏈網絡系統版本或協議升級後,舊的例程並不會被代碼發生改變,並繼續接受由新中斷創造的區塊,新老堆棧始終還是在同一條鏈上工作。


技術代碼附錄

接下來我們從技術角度來分析一下 Kava 代碼中的這個 bug。這個問題代碼在 Kava 的 bep3 模塊中。在該模塊的參數中,支持的抵押資產被指定如下:


類型 AssetParam struct {
 Denom string`json:「denom」yaml:「denom」`//資產名稱
 CoinID int`json:「coin_id」yaml:「coin_id」`//國際公認的硬幣 ID
 限制 sdk.Int`json ::「limit」yaml:「limit」`//資產供應限制
 有效 bool`json:「active」yaml:「active」`//表示資產是處於活動狀態還是已暫停
}

Github 鏈接:https://github.com/Kava-Labs/kava/blob/v0.8.1/x/bep3/types/params.go


每個抵押資產都規定了一個限制–即在網絡限制進一步的交換交換之前,該資產可以抵押的最大數量。當主網啓動時,以下代碼爲每個資產設置了初始配額:


//初始化
_,資產的受支持資產:=範圍 gs.Params.SupportedAssets {
 zeroCoin:= sdk.NewCoin(asset.Denom,sdk.NewInt(0))
 供給:= NewAssetSupply(asset.Denom,zeroCoin,zeroCoin,
  zeroCoin,sdk.NewCoin(asset.Denom,asset.Limit))
 keeper.SetAssetSupply(ctx,supply,[] byte(asset.Denom))
}

Github 鏈接:https : //github.com/Kava-Labs/kava/blob/v0.8.1/x/bep3/genesis.go#L29


SetAssetSupply 函數爲應用數據庫中連續 0x02 處的每個資產設置了限制:


// SetAssetSupply 更新資產的當前有效供應
func(k Keeper)SetAssetSupply(ctx sdk.Context,提供類型.AssetSupply,名詞 [] byte){
store:= prefix.NewStore(
 ctx.KVStore(k.key),
 types.AssetSupplyKeyPrefix,// 0x02
)
bz:= k.cdc.MustMarshalBinaryLengthPrefixed(supply)
store.Set(denom,bz)
}

Github 鏈接:https://github.com/Kava-Labs/kava/blob/869189054d68d6ec3e6446156ea0a91eb45af09c/x/bep3/keeper/keeper.go#L199

https://github.com/Kava-Labs/kava/blob/869189054d68d6ec3e6446156ea0a91eb45af09c/x/bep3/types/keys.go#L31


當系統更新 AssetParam.Limit 的參數值時,沒有相應的函數更新數據庫中的值(通過調用 SetAssetSupply)。因此,更新參數不會傳送到應用狀態。


當一個新的交換被創造時,IncrementIncomingAssetSupply 函數被調用,來檢查交換資產量沒有超過存儲在相應的 0x02 的資產限制量。目前因爲這個值沒有被更新,所以交換沒有通過這個檢查。


// IncrementIncomingAssetSupply 遞增資產的傳入供應
函數(k Keeper)IncrementIncomingAssetSupply(ctx sdk.Context,coin sdk.Coin)error {
 supply,found:= k.GetAssetSupply(ctx,[] byte(coin.Denom))
 如果找到了 {
  return sdkerrors.Wrap(types.ErrAssetNotSupported,coin.Denom)
 }
 //(當前+傳入+金額)的結果必須在資產的
 // limit
 totalSupply 以下:= supply.CurrentSupply.Add(supply.IncomingSupply)(
 
 如果 supply.SupplyLimit).IsLT(totalSupply.Add(coin)){
  return sdkerrors.Wrapf(
   types.ErrExceedsSupplyLimit,
   「增加%s,資產供應%s,限制%s」,
   硬幣,totalSupply,供應。SupplyLimit,
  )
 }
...

Github 鏈接:https : //github.com/Kava-Labs/kava/blob/869189054d68d6ec3e6446156ea0a91eb45af09c/x/bep3/keeper/swap.go#L70

https://github.com/Kava-Labs/kava/blob/869189054d68d6ec3e6446156ea0a91eb45af09c/x/bep3/keeper/asset.go#L46


我們的修復方法是在 bep3 begin blocker 中添加一個函數,當參數中的 AssetSupply 值更新時,該函數會更新 AssetSupply 的值。


//每個區塊上的 BeginBlocker 都將過期的原子交換過期,
//從長期存儲中刪除封閉的交換(默認存儲時間爲 1 周),並更新
//通過治理可能已更改的資產供應限制。
func BeginBlocker(ctx sdk.Context,k Keeper){
 k.UpdateExpiredAtomicSwaps(ctx)
 k.DeleteClosedAtomicSwapsFromLongtermStorage(ctx)
 k.UpdateAssetSupplies(ctx)
}

UpdateAssetSupply 函數可以調節參數和數據庫裏的數值之間的差異,設置數據庫與參數相匹配。

// UpdateAssetSupplies 更新應用到的資產上限從參數到資產用品
FUNC(K 守護)UpdateAssetSupplies(CTX sdk.Context)錯誤 {
 = k.GetParams(CTX):PARAMS
 爲_,supportedAsset:=範圍 params.SupportedAssets {
  資產,找到:= k.GetAssetSupply(
   ctx,[] byte(supportedAsset.Denom),
  )
  如果!found {
   繼續
  } 如果 asset.SupplyLimit.Amount!= supportedAsset.Limit {
   asset.SupplyLimit = sdk.NewCoin(
    supportedAsset.Denom,    supportAsset.Limit ,
   )
k.SetAssetSupply(ctx,asset,[] byte(supportedAsset.Denom))
  }
 }
 return nil
}

爲了將其作爲異步網絡分叉來實現,我們在函數中添加一個激活時間參數,該參數指定 UpdateAssetSupplies 應該何時運行。例如,我們指定僅在 ctx.BlockTime()。After(activationTime)時才運行 UpdateAssetSupply,注意,ctx.BlockTime()是驗證器集同意的區塊鏈時間的值,不受時鐘漂移的影響。


原文鏈接:https://mp.weixin.qq.com



歡迎加入律動 BlockBeats 官方社群:

Telegram 訂閱群:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App

Twitter 官方帳號:https://twitter.com/BlockBeatsAsia

举报 糾錯/舉報
選擇文庫
新增文庫
取消
完成
新增文庫
僅自己可見
公開
保存
糾錯/舉報
提交