Tiêu đề gốc: "Báo cáo sửa lỗi Mainnet Kava-3"
Tác giả gốc: KaVo Lab
Tóm tắt: Hiện tại có một lỗi nhỏ trên mạng chính Kava, sẽ ảnh hưởng việc điều chỉnh nguồn cung tài sản BEP3, có nghĩa là chúng tôi tạm thời không thể tăng số tiền thế chấp BNB trong Kava CDP (hiện đạt mức cao nhất là 40.000 BNB). Nhưng đừng lo lắng, lỗi này sẽ không ảnh hưởng đến tính bảo mật của tiền của người dùng.
Mạng kava-3 sử dụng các tham số để quản lý trạng thái của chuỗi quản trị. Bằng cách thay đổi các tham số thông qua quản trị, Kava có thể quản lý cách vận hành của chuỗi chính và sử dụng khả năng quản lý của ủy ban để nhanh chóng ứng phó với các trường hợp khẩn cấp nhạy cảm về thời gian. Chúng tôi đã phát hiện ra một lỗi nhỏ ở một trong các tham số, giới hạn cung cấp tài sản BEP3, lỗi này đã ngăn cản việc thực hiện các thay đổi đối với giá trị tham số, nghĩa là không thể cập nhật nguồn cung thay thế 40.000BNB hiện tại.
Làm thế nào để sửa lỗi?
Bản sửa lỗi thực ra chỉ yêu cầu cập nhật một vài dòng mã để thiết lập rằng khi cập nhật giá trị thông số giới hạn nguồn cung, trạng thái của ứng dụng được thực thi cũng sẽ được cập nhật tương ứng. Nhưng vâng, đây là một thay đổi lớn đối với hệ thống, vì vậy chúng tôi không thể chỉ dựa vào việc phát hành phiên bản v0.8 mới để khắc phục điều này.
Việc khắc phục sẽ được thực hiện như thế nào?
Cập nhật mạng sơ bộ
Chúng tôi đã viết một phiên bản phần mềm để sửa lỗi nhỏ này. Khi sửa lỗi, chúng tôi chỉ định thời điểm mã sẽ được thực thi. Người xác minh cần cập nhật tình trạng gián đoạn của mình trước thời gian quy định để đảm bảo mạng được cập nhật thông suốt và không có hiện tượng gián đoạn dịch vụ. Mọi kế thừa ngược dòng từ phiên bản trước của phần mềm sẽ được phân nhánh mềm khi mã đi vào hoạt động. Về cơ bản, đây là những gì các nhà phát triển cốt lõi của Ethereum thực hiện trong quá trình “nâng cấp mạng”.
Soft fork
có nghĩa là sau khi phiên bản hoặc giao thức hệ thống mạng blockchain được nâng cấp, các quy trình cũ sẽ không bị mã thay đổi và sẽ tiếp tục chấp nhận các khối được tạo bởi các gián đoạn mới. Các ngăn xếp cũ và mới sẽ luôn luôn vẫn giữ nguyên Làm việc trên cùng một chuỗi.
Phụ lục mã kỹ thuật
Tiếp theo, hãy phân tích lỗi này trong mã Kava từ góc độ kỹ thuật. Mã được đề cập nằm trong mô-đun bep3 của Kava. Trong các tham số của mô-đun này, tài sản thế chấp được hỗ trợ được chỉ định như sau:
Loại AssetParam struct {
Denom string`json: 「denom」yaml: 「denom」`//Tên tài sản
CoinID int `json: "coin_id" yaml: "coin_id"`//ID đồng xu được quốc tế công nhận
Giới hạn sdk.Int`json:: "giới hạn" yaml: "giới hạn"`//Giới hạn cung cấp tài sản
  ;bool`json hợp lệ: "active" yaml: "active"`//Cho biết nội dung đang hoạt động hay bị tạm ngưng
Liên kết Github: https: / /github.com/Kava-Labs/kava/blob/v0.8.1/x/bep3/types/params.go
Mỗi tài sản thế chấp được chỉ định Một giới hạn – số tiền tối đa mà tài sản có thể đặt cược trước khi mạng giới hạn các trao đổi hoán đổi tiếp theo. Khi mạng chính khởi chạy, đoạn mã sau sẽ đặt hạn ngạch ban đầu cho từng nội dung:
//Khởi tạo
_, nội dung được hỗ trợ cho nội dung:= phạm vi gs.Params.SupportedAssets {
zeroCoin:= sdk.NewCoin ( assets.Denom, sdk.NewInt(0)) Nguồn cung: = NewAssetSupply(asset.Denom, zeroCoin, zeroCoin, zeroCoin, sdk.NewCoin(asset.Denom, assets.Limit ))
keeper.SetAssetSupply(ctx, cung cấp, [] byte(asset.Denom))
Liên kết Github: https :  ;//github.com/Kava-Labs/kava/ blob/v0.8.1/x/bep3/genesis.go#L29
Hàm SetAssetSupply đặt giới hạn cho mỗi nội dung ở mức 0x02 liên tiếp trong cơ sở dữ liệu ứng dụng:
// SetAssetSupply cập nhật nguồn cung cấp nội dung hợp lệ hiện tại
func (k Keeper) SetAssetSupply (ctx sdk.Context, loại được cung cấp.AssetSupply, danh từ [] byte) {
store:= prefix.NewStore(
ctx.KVStore(k.key),
types.AssetSupplyKeyPrefix, // 0x02
)
bz:= k.cdc .MustMarshalBinaryLengthPrefixed (supply)
store.Set(denom,bz)
Liên kết Github: https://github.com/Kava-Labs/ kava/ blob/869189054d68d6ec3e6446156ea0a91eb45af09c/x/bep3/keeper/keeper.go#L199
Khi hệ thống cập nhật giá trị tham số của AssetParam.Limit thì không có hàm tương ứng nào cập nhật giá trị trong cơ sở dữ liệu (bằng cách gọi SetAssetSupply). Do đó, các tham số cập nhật không được chuyển tới trạng thái ứng dụng.
Khi một trao đổi mới được tạo, hàm IncrementIncomingAssetSupply được gọi để kiểm tra xem số lượng tài sản hoán đổi có vượt quá số lượng giới hạn tài sản được lưu trữ trong tệp 0x02 tương ứng hay không. Hiện tại sàn giao dịch không thực hiện được bước kiểm tra này vì giá trị này chưa được cập nhật.
// IncrementIncomingAssetSupply Tăng nguồn cung tài sản đến
Chức năng (k Keeper) IncrementIncomingAssetSupply (ctx sdk.Context, coin sdk.Coin) lỗi {
supply, Found:= k.GetAssetSupply(ctx, [ ] byte(coin.Denom))
Nếu tìm thấy {
return sdkerrors.Wrap(types.ErrAssetNotSupported, coin.Denom)
//( Kết quả của hiện tại + số tiền đến +) phải thấp hơn
// giới hạn
totalSupply: = Supply.CurrentSupply.Add(supply.IncomingSupply)(
  ;nếu cung cấp.SupplyLimit).IsLT(totalSupply.Add(coin)){
return sdkerrors.Wrapf(
types.ErrExceedsSupplyLimit,
  ;"Thêm %s, nguồn cung tài sản %s, giới hạn %s",
Tiền xu, tổng nguồn cung, nguồn cung. SupplyLimit,
)
...
Liên kết Github: https : //github.com/Kava-Labs/kava/blob/869189054d68d6ec3e6446156ea0a91eb4 5af 09c/x/bep3/người giữ/trao đổi .go#L70
Cách khắc phục của chúng tôi là thêm một chức năng trong trình chặn bắt đầu bep3, khi tham số Hàm này cập nhật giá trị của AssetSupply khi giá trị của AssetSupply trong được cập nhật.
//BeginBlocker trên mỗi khối hết hạn hoán đổi nguyên tử đã hết hạn,
//xóa hoán đổi đã đóng khỏi bộ lưu trữ dài hạn (thời gian lưu trữ mặc định là 1 tuần) và cập nhật
// Giới hạn cung cấp tài sản có thể đã thay đổi thông qua quản trị.
func BeginBlocker(ctx sdk.Context, k Keeper) {
k.UpdateExpiredAtomicSwaps(ctx)
k.DeleteClosedAtomicSwapsFromLongtermStorage(ctx)
k.UpdateAssetSupplies(ctx)
Hàm UpdateAssetSupply có thể điều chỉnh sự khác biệt giữa tham số và giá trị trong cơ sở dữ liệu, đồng thời đặt cơ sở dữ liệu khớp với tham số.
// UpdateAssetSupplies cập nhật giới hạn nội dung được áp dụng từ tham số đến nguồn cung cấp nội dung
FUNC (K Guardian) UpdateAssetSupplies (CTX sdk . Ngữ cảnh) Lỗi {
= k.GetParams(CTX): PARAMS
for_, supportAsset:=scope params.SupportedAssets {
Assets Found:= k.GetAssetSupply (
ctx, []byte(supportedAsset.Denom),
)
if! đã tìm thấy {
Tiếp tục
} nếu nội dung.SupplyLimit.Amount! = supportAsset.Limit {
asset.SupplyLimit = sdk.NewCoin(
supportedAsset.Denom,
)
k.SetAssetSupply(ctx, assets, []byte(supportedAsset.Denom))
return nil
Để triển khai tính năng này dưới dạng phân nhánh mạng không đồng bộ, chúng tôi thêm tham số thời gian kích hoạt vào hàm. Tham số này chỉ định thời điểm UpdateAssetSupplies sẽ chạy. Ví dụ: chúng tôi chỉ chỉ định trong ctx.BlockTime(). Chỉ chạy UpdateAssetSupply sau (activationTime). Lưu ý rằng ctx.BlockTime() là giá trị thời gian blockchain được bộ trình xác thực đồng ý và không bị ảnh hưởng bởi độ lệch đồng hồ.
Liên kết gốc: https://mp.weixin.qq.com
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia