Ana içeriğe geç

Dokuzuncu Ders - Inter Protokol

İçindekiler

  • Giriş
    • IST nasıl stabilitesini korur?
  • Inter Protokol ile Etkileşim
    • Akıllı Cüzdan
  • IST Basma Bileşenleri
    • PSM
    • VaultFactory
    • BLD Boost
  • Likidite Güvenceleri
    • AMM
    • Rezerv

Giriş

Agoric, kendini Cosmos ekosisteminin tamamında eşsiz bir yere konumlandırmayı hedefliyor. Plan, ABD dolarına yumuşak bir şekilde bağlı, yerel IBC uyumlu token olan Inter Stable Token (IST) sunmaktır. Inter Protokol, IST çevresinde Agoric Ekonomisini uygulayan merkeziyetsiz bir uygulamadır.

Nasıl çalışır?

Inter Protokol, birden fazla uygulama için temel bir terimdir. Aşağıdaki diyagram, bu uygulamaların IST'nin basılması/yakılması işlemini nasıl birlikte gerçekleştirdiğini göstermektedir.

aliceBob

Şekil 1: Inter Protokol Sistem Genel Bakış

Inter Protokol şu anda sadece diyagramdaki PSM ve Akıllı Cüzdan ile Mainnet 1 üzerinde canlıdır. Gelecek lansmanlar için Agoric Yol Haritası'na göz atın. Inter Protokol 'ün şu anki sürümü, kullanıcıların PSM içinde IST'ye karşı stable token alıp satmasına olanak sağlar. Bu işlem Akıllı Cüzdan ve Keplr kullanılarak gerçekleştirilir.

Agoric, modelini Maker DAO'ya benzer bir şekilde benimser. Bu, IST'nin kripto varlıklarla tamamen teminatlandırıldığı anlamına gelir. Dolayısıyla, tamamen merkeziyetsizdir. Teminatlandırma stratejisi, çoğu protokolün kripto dünyasındaki gibi, yani aşırı teminatlandırılmıştır. Likidasyon Marjı, istenen IST'ye kıyasla teminatın ABD Doları değerinin ne kadar büyük olması gerektiğini hesaplamaya yardımcı olan bir parametredir.

Ekonomik Komite, Agoric Ekonomisi için kritik öneme sahip yönetim parametreleridir. Bu parametreler şunları içerir:

  • Borç Limitleri
  • Faiz Oranları
  • Teminatlandırma Oranı

Ve benzeri...

Ekonomik Komiteye kimler girer? İşte bu bağlıdır. Ekonomik Komitenin üyeleri BLDer DAO tarafından seçilir. BLDer DAO, BLD pay sahiplerini temsil eden bir genel terimdir. Bu Ekonomik Komitenin kodu, governance paketi altında bakımı yapılan committee.js dosyasında bulunabilir.

Unutmayın, daha fazla bilgi için Inter Protokol Beyaz Kağıdı 'na göz atın.

IST nasıl stabilitesini korur?

Stable Token nedir?

Stable Token Tipleri

Stabiliteyi Koruma

Inter Protokol ile Etkileşim

Akıllı Cüzdan

Eğer Şekil 1'e bakarsanız, Akıllı Cüzdanın kullanıcıların inter-protokol dapp'lerine giriş kapısı olduğunu görebilirsiniz. Ama şimdiye kadar Agoric Ağı ile hep ag-solo kullanarak etkileşime girdik, neden Akıllı Cüzdan o zaman? Fark edin ki ag-solo çok güçlü nesnelere erişimi olan off-chain bir vat'tır. Dolayısıyla, Akıllı Cüzdan için motivasyonlar şunlar olabilir;

  • Bu kadar güçlü nesneleri normal kullanıcılara maruz bırakmamalıyız
  • Her kullanıcı, Agoric Blockchain'le etkileşime girmek için kendi ag-solo'sunu çalıştıramaz

Not: ag-solo DevNet'te hala kullanılabilir ama MainNet için Akıllı Cüzdan kullanmalısınız

Aşağıdaki diyagram, Akıllı Cüzdan yaklaşımını mevcut ag-solo yaklaşımıyla karşılaştırır

smart-wallet-ag-solo

Şekil 2: SmartWallet vs ag-solo. Orijinal Diyagram.

Burada not edilmesi gereken birkaç şey;

  • Akıllı Cüzdan, iki ana bileşenden oluşur
    • On-chain akıllı sözleşmeler ve yardımcı kod
    • Off-chain ist

emci kod: SmartWalletUI

> [Akıllı Cüzdan Sözleşme Kodu](https://github.com/Agoric/agoric-sdk/tree/master/packages/smart-wallet) ve [Akıllı Cüzdan UI Kodu](https://github.com/Agoric/wallet-app)

On-chain Akıllı Cüzdan Sözleşmelerinin aşağıdaki ana sorumlulukları vardır;

  • bank adı verilen özel bir nesne aracılığıyla kullanıcının bakiyeleriyle ilgilenmek
  • Dapp'lardan gelen teklif taleplerini gerçek teklifHandler'a iletme

Daha fazla öğrenmek için bank kodu ve Akıllı Cüzdan nasıl çalışır? tartışmasına göz atın.

Aşağıdaki sıralı diyagram, Şekil 2'deki akışı daha fazla detayla gösterir:

sequenceDiagram
dApp ->> SmartWalletUI: Yeni teklif ekler
SmartWalletUI ->> SmartWalletUI: Kullanıcı teklifi onaylar
SmartWalletUI ->> Keplr: TeklifConfig 'spendAction' içerisine seri hale getirilir
Keplr ->> Keplr: İşlem imzalanır
Keplr ->> WalletFactory: İşlem Agoric Zincirine gönderilir
WalletFactory ->> WalletFactory: Kullanıcıya tahsis edilen 'smartWallet' bulunur
WalletFactory ->> User - SmartWallet: İşlemi ilet
User - SmartWallet ->> OfferHandler: `spendAction` verisindeki teklifi uygula

Gördüğünüz gibi Zincir İçi Akıllı Cüzdan Sözleşmeleri iki bileşene ayrılmıştır;

  1. WalletFactory
  2. SmartWallet

WalletFactory ve SmartWallet arasındaki ilişki aşağıda gözlemlenebilir:

lectureNine-smartWalletContracts

IST Basma Bileşenleri

PSM

Parity Stability Module (PSM), MakerDAO'nun The Peg Stability Module konseptine benzer. Temel fikir, diğer stabil paralar karşılığında 1:1 oranında IST basmaktır. BLD staker yönetimi, hangi stabilcoinlerin teminat olarak kabul edileceğine karar verir. Belirli bir PSM örneği için, yani bir tür stabilcoin karşılığında IST basan bir piyasa için, Ekonomi Komitesi aşağıdaki parametreleri de yönetir;

  • GiveMintedFee
  • MintLimit
  • WantMintedFee

Bu parametreler, PSM modülünden IST almak/vermek için Ücretlerdir ve diğeri bu PSM örneğinin basabileceği IST toplam miktarıdır.

Fikir

PSM arkasındaki fikir, IST fiyatı Amerikan dolarından saparsa arbitraj fırsatları sunarak IST'nin stabilitesini korumaktır. Bu arbitraj mekanizması aşağıda gösterilmiştir;

Aşağıdaki diyagramda kullanılan sayılar keyfi olarak seçilmiştir

lectureNine-psm

Geliştiriciler için

PSM'ye kendi dapp'lerini entegre etmek isteyen üçüncü taraf geliştiriciler, PSM Public Facet'e göz atmayı düşünebilir;

// PSM publicFacet
const publicFacet = {
getMetrics() {},
getPoolBalance() {},
makeWantMintedInvitation() {},
makeGiveMintedInvitation() {},
...publicMixin,
}

Stabletoken'ınız karşılığında IST istediğinizde makeWantMintedInvitation kullanın ve IST'niz karşılığında stabletoken'ınızı istediğinizde makeGiveMintedInvitation kullanın. Bu davetiyelerin kullanımı, şimdiye kadar gördüğümüz gibidir.

const invitation = E(psmPublicFacet).makeWantMintedInvitation();

const proposal = harden({
give: { Anchor: anchorAmount },
want: { Minted: mintedAmount },
});

const payment = harden({
Anchor: anchorPayment
});

const userSeat = E(zoe).offer(
invitation,
proposal,
payment,
);

await E(userSeat).getOfferResult();
const istPayment = await E(userSeat).getPayout('Minted');

PSM Örnekleri

publicMixin yönetilen parametreler için yardımcı metotlar kümesidir. PSM, parametrelerini yönetmek için bir yardımcı kullanır.

want stable testi inter-protocol/test/smartWallet/test-psm-integration.js içinde PSM'nin bir Akıllı Cüzdan ile nasıl kullanılabileceğini gösterir.

test-psm.js PSM ile ilgili daha fazla kullanım durumu içerir. PSM'nin özelliklerini sergileyen önemli test;

  • limit is for minted Bu test, 1 anchor coin karşılığında 2 IST'lik bir PSM oluşturur. Ve MINT_LIMIT miktarında anchor ile PSM ile ticaret yapmak ister. Bu işlem, 2 * MINT_LIMIT kadar IST basmayı gerektirir, bu yüzden 'Request would exceed mint limit' mesajı ile hata verir. Bu, önemli olanın anchor miktarı değil, sözleşmenin sınırlamaya çalıştığı IST miktarı olduğunu gösterir.
  • mix of trades: failures do not prevent later service

Bu test için, bir diziden alım satımı etkinleştirmek için yardımcı metotlar uygulanmıştır. Temelde görmek istediğimiz şey, bir alım satımın başarısız olması durumunda diğerlerinin beklenildiği gibi işlev görmeye devam edip etmeyeceği.

VaultFactory

VaultFactory, IST satın almak için başka bir alternatiftir. IST tamamen teminatlandırılmış bir stablecoin olduğundan, kullanıcılar sadece IST'yi bazı teminatlar karşılığında takas edebilir. VaultFactory, bu anlamda PSM'ye benzer. Fark, kabul edilen teminat türünde yatar. VaultFactory, BLD staker yönetiminin onay vermesi koşuluyla her türlü ERTP varlığını teminat olarak kabul edebilirken, PSM yalnızca stablecoinleri kabul eder. Bu önemli fark, aşırı teminatlandırma olarak adlandırılan diğer büyük bir farklılığa neden olur. PSM, diğer stablecoinlerle 1:1 oranında işlem yapar, yani teminatın değeri, alınan IST değeri ile eşittir. Kripto varlıkların çok dalgalı olabilmesi nedeniyle, başka bir kripto varlıkla 1:1 oranında IST basmak IST'nin değerini riske atardı. Unutmayın, IST tamamen teminatlandırılmış bir varlık, bu yüzden yüksek miktarda IST'yi desteklemek için yeterli teminat olduğundan emin olmak istiyoruz. VaultFactory, bu sözde değeri teminatın ABD doları cinsinden ölçer. Bu, IST'nin istikrarını destekleyen başka bir mekanizmadır.

VaultFactory'nin tam olarak nasıl çalıştığını anlamak için öncelikle birkaç terimi anlamamız gerekiyor:

  • Likidasyon Marjı: Teminatın USD değerinin borcun USD değerinden daha yüksek olması gerektiğini söyledik. Peki, ne kadar fazla olmalı? Likidasyon Marjı bu marjı belirtir. Diyelim ki 100 IST ödünç almak istiyorsunuz ve Likidasyon Marjı %150 ise, istediğiniz IST'yi ödünç alabilmek için en az 150 dolar değerinde teminat koymalısınız.
  • Likidasyon: Yukarıdaki örneği devam ettirelim. Şimdi, 150 dolar değerinde teminat karşılığında 100 IST ödünç aldığınızı düşünün. Teminat tokeninizin değeri USD karşısında düşerse ve şimdi kasada sadece 125 dolarlık teminatınız varsa ne olur? Likidasyon Marjı %150 olduğunda, 125 dolarlık teminat için en fazla ne kadar IST ödünç alabilirsiniz? Cevap: 125 / 1.5 = 83,3. Sizde ne kadar IST var? 100 IST. Böyle bir durumda, Inter Protokolü bu tür bir krediyi yetersiz teminatlandırılmış olarak kabul eder ve daha fazla zarar olmadan önce harekete geçer. Bu eylem: Borçlunun teminatını başka bir pazarda IST karşılığında satmak ve satın alınan IST'yi yakmaktır. Böylece, teminatsız hiçbir IST kalmaz. Bu eyleme Likidasyon denir.
  • Faiz Oranı: Her kasaya bir faiz yüklenir. Gerçek dünyaya benzer bir şekilde.
  • Şarj Dönemi ve Kayıt Dönemi: VaultFactory kodunu incelediğinizde, bu iki zamanla ilgili benzer parametreyi fark edeceksiniz. Her Şarj Döneminde faiz yüklenir. Bir şarjda biriken faiz miktarı çok küçük olduğundan, sistem anlamlı bir miktar birikene kadar beklemeyi ve sonra dış dünyaya göstermeyi seçer. Biriken faizleri gösterme bu döneme Kayıt Dönemi denir.

VaultFactory Temel Tasarım

lectureNine-VaultFactory

VaultFactory, collateralBrand'in anahtar ve vaultManager'ın değer olduğu bir anahtar-değer yapıdaki VaultManager'ları saklar. Yeni vaultManager'ları oluşturma yeteneği VaultFactory'nin creatorFacet'ine aittir ve bu Ekonomik Komite tarafından kontrol edilir.

Kullanıcıların gerçekte IST ödünç aldıkları yer VaultManager'dır. Her başarılı borçlanma, yeni bir vault oluşturur. Bu vaultlar, debt/collateral oranlarına göre sıralı bir şekilde saklanır. Bu sıralı yapı, vaultManager'ın su altında kalan vault'ları takip etmesine izin verir.

Faiz Tahsilatı VaultManager, kredilere faiz tahsil ederken bir optimizasyon uygular. Bir vaultManager örneğinde 100 vault olduğunu düşünün. Şarj dönemi geldiğinde, 100 kredinin tamamına nasıl faiz tahsil edeceksiniz? 100'ün üzerinden geçer misiniz? Bu nasıl ölçeklendirilebilir? O(n). VaultManager, bu işlemi bu akıllı optimizasyon sayesinde O(1)'de yapar. VaultManager'ın compoundedInterest adlı bir değişkeni vardır, her şarj döneminde vaultManager bu değişkeni günceller. Yeni bir vault oluşturulduğunda, bu birikimli faiz oranının bir anlık görüntüsünü alır. Bir vault'un mevcut borcunu hesaplamak için, vault yeni bir birikimli faiz alır ve bu özel vault'a ne kadar faizin biriktiğini hesaplar yeni alınan birikimli faizi, oluşturulduğunda aldığı faizSnapshot ile karşılaştırarak. Yeni alınan birikimli faiz ile faizSnapshot arasındaki fark, ana borca eklenir ve böylece belirli bir vault'un son borcu elde edilir. Bir vault'un borcunu nasıl hesapladığını görmek için getCurrentDebt kontrol edin.

Tasfiyeci Tasfiye, su altında bir vault olduğunda gerçekleşir. Vault'ları tasfiye etme mevcut yolu, teminatı AMM'deki IST'ye karşı satmaktır. Bu strateji gelecekte değişebilir ama şimdilik mevcut tasarım bu şekildedir.

Agoric'in Higher-order smart contract yapısı, tek bir vaultManager örneği için birkaç tasfiye stratejisini uygulama imkanı sunar. Yöneticiler, bir tasfiyeci sözleşmesine bir örneği tutarlar. VaultManager, birden çok tasfiye sözleşmesi ile çalışacak şekilde tasarlanmıştır. İşte mevcut iki tasfiyeci sözleşmesi;

setupLiquidator metodu, vaultManager'ın kullandığı tasfiyeci irtibatını güncellemek için kullanılır.

Kullanım Durumu 1 - Mutlu Yol

Aşağıdaki diyagram, kullanıcının borç alıp borcunu ödeme sürecini "Mutlu Yol" olarak gösterir.

sequenceDiagram
actor u as Borrower
u ->>+ VaultFactory: vaultFactory.getCollateralManager(colBrand)
VaultFactory ->> VaultFactory: collateralTypes.get(colBrand)
VaultFactory -->>- u: vaultManager
u ->>+ VaultManager: vaultManager.makeVaultInvitation()
VaultManager ->> Vault: Create Vault
VaultManager ->> VaultManager: vaults.set(newVault)
VaultManager -->>- u: wrappedVault / IST Payout
u ->>+ Vault: wrappedVault.makeAdjustBalancesInvitation()
note over u, Vault: Pay some of the debt and get some of the collateral
Vault ->> Vault: Update balances
Vault -->>- u: Collateral Payout
u ->>+ Vault: wrappedVault.makeCloseInvitation()
Vault ->> Vault: Update balances
Vault ->> VaultManager: Notifiy manager, vault is closed
Vault -->>- u: Collateral Payout
VaultManager ->> VaultManager: Remove vault

Kullanım Durumu 2 - Borç Ödenmedi

Diğer taraftan, bu diyagram borçlu borcunu ödemezse tasfiye sürecinin nasıl işlediğini gösterir.

sequenceDiagram
actor u as Borrower
u ->>+ VaultFactory: vaultFactory.getCollateralManager(colBrand)
VaultFactory ->> VaultFactory: collateralTypes.get(colBrand)
VaultFactory -->>- u: vaultManager
u ->>+ VaultManager: vaultManager.makeVaultInvitation()
VaultManager ->> Vault: Create Vault
VaultManager ->> VaultManager: vaults.set(newVault)
VaultManager -->>- u: wrappedVault / IST Payout
VaultManager ->> VaultManager: Interest charged for X amount of periods
note over VaultManager, Vault: Debt + Interest > Allowed Debt
VaultManager ->> Liquidator: Execute Liquidation
Liquidator ->> AMM: Sell Collateral against IST
AMM -->> Liquidator: Collateral Payout
Liquidator -->> Vault: Collateral Payout
Liquidator -->> VaultManager: IST Payout
VaultManager ->> VaultManager: IST Burned

BLD Boost

BLD Agoric'in resmi staking tokenidir. BLD Boost, BLD staker'larının gelecek staking ödülleri karşılığında staked BLD'lerine karşı IST ödünç almalarına izin verir. Aşağıdaki diyagram bu akışı gösterir:

sequenceDiagram
actor dapp
participant walletBridge
participant attestation
participant stakeFactory
participant Cosmos_SDK

note right of dapp: How dapp finds the current state

note right of walletBridge: walletBridge is provided to dapps and controlled by Wallet UI
dapp ->>+ walletBridge: getPurseBalance("BLD")
dapp -->> walletBridge: 5000

note right of attestation: ag123 is a cosmos address
dapp ->> attestation: getMax(ag123)
attestation ->> Cosmos_SDK: getAccountState(ag123)
note right of Cosmos_SDK: Cosmos supports lien
Cosmos_SDK -->> attestation: account status in which 4000 BLD liened
attestation -->> dapp: account status in which 4000 BLD liened
note right of dapp: Treasury now knows

`VaultManager`, `compoundedInterest` adında bir değişkene sahip
not sağında dapp: 500 BLD'yi teminat göstererek 450 IST almak istiyorum
dapp ->> walletBridge: getReturnableAttestation(istem: 450 IST, ver: 500 BLD-Att)
not sağında walletBridge: Kullanıcının cüzdanında onay bekliyor
walletBridge ->> attestation: makeAttestation(500 BLD)
attestation ->> Cosmos_SDK: increaseLiened(+500 BLD)
Cosmos_SDK -->> attestation: yeni teminat dengesi ya da hata atar

attestation -->> walletBridge: ag123 üzerinde 500 BLD-Att teminatlı ödeme

walletBridge ->> stakeFactory: {ver: 500 BLD-Att, istem: 450 IST} için ödeme ile teklif yap

stakeFactory --> walletBridge: 450 IST ödemesi ve teklif sonucu
walletBridge --> dapp: teklif sonucundan bildirimler

Figür 3: stakeFactory.js

En iyi kısım, BLD tokenlarınızın teminat olarak kalmış olmasıdır. BLD Boost'un sizin gerçekten BLD tokenlarınızı teminat olarak kullandığınızı doğrulamasına olanak sağlayan mekanizma, onları BLD Boost sözleşmesinin içinde kilitlemeden attestation olarak adlandırılır. Temelde, IST ödünç almak isteyen hesabın gerçekten BLD'ye sahip olduğunu kontrol eder ve eğer sahipse bir attestation oluşturur. Tüm bu kontrol işlemleri Cosmos düzeyinde gerçekleşir, yani oldukça ayrıcalıklıdır. Yalnızca kayıtlı bir cosmos denom'u olan tokenlar için attestation oluşturabilirsiniz. Attestation'lar hakkında daha fazla bilgi için bu konuşmayı inceleyebilirsiniz.

Likidite Güvenceleri

Inter Protokol, ekonominin güvenli ve likit olduğunu sağlamak için bazı mekanizmalara da sahiptir.

AMM

Agoric'in Otomatik Piyasa Yapıcısı (AMM), vault'ları likit hale getirmek için bir piyasa sağlayarak bu güvenliği destekler. AMM, VaultFactory'nin rolünün yanı sıra, herhangi bir başka DEX'e de hizmet verebilir.

AMM'deki her havuzda her zaman bir Central varlık ve bir Secondary varlık bulunur. Central varlık her zaman IST iken, Secondary değişkenlik gösterebilir. Herkes AMM'de yeni bir havuz oluşturabilir, bunun adımlarını aşağıda görelim;

  1. Secondary varlığın ihracatçısını AMM'ye tanıtmalısınız
    /** @type Issuer */
const lpTokenIssuer = await E(ammPublicFacet).addIssuer(
issuer,
keyword,
);

Bu işlem, AMM'nin zcf örneğinin ihracatçıyı ve ona karşılık gelen anahtar kelimeyi bilmesi gerektiği için gereklidir. Bu işlem, başka bir ihracatçının dönmesiyle sonuçlanır. AMM, bir DEX Likidite Sağlayıcısı olduğu için, sağladığı likidite karşılığında bir LP tokeni alır. Burada, bu LP tokeninin ihracatçısını alıyoruz, böylece onun için teklifler oluşturabiliriz.

  1. Artık havuzu ekleyebiliriz
    /** @type UserSeat */
const addLiquiditySeat = await E(home.zoe).offer(
E(ammPublicFacet).addPoolInvitation(),
proposal,
payments,
);

Gördüğünüz gibi bu, daveti E(ammPublicFacet).addPoolInvitation()'dan aldığımız başka bir Zoe teklifidir. Bu daveti ammPublicFacet'ten aldığımızı fark edin. Proposalın yapısını ayrıştıralım:

    const proposal = harden({
give: {
Secondary: secondaryAmount,
Central: centralAmount,
},
want: { Liquidity: AmountMath.make(lpTokenBrand, 1000n) },
});

Give bölümünde hem Secondary hem de Central'i sunduğumuza dikkat edin. Ve karşılığında LP tokenlerimizi want ediyoruz. Bu teklif için ödemeye bakalım;

   const payments = {
Secondary: secondaryPayment,
Central: centralPayment,
};

Eğer şunu yaparsak:

await E(addLiquiditySeat).getOfferResult();
const payout = await E(addLiquiditySeat).getPayout('Liquidity');

Ödemede LP tokenlerimiz olacak.

Daha fazla kullanım ve AMM ile etkileşim örnekleri için StopLoss-AMM kodunu kontrol etmeyi düşünün. Agoric için tamamladığımız bir ödül. ### Rezerve "Rezerv" hakkında devam eden bir tartışma var, Sorularımız çözüldükten sonra burayı güncelleyeceğiz.