Ana içeriğe geç

Tamamlayıcı Sözleşme İncelemesi

Temel DApp'imizin daha detaylı bakalım.

Sözleşmeyi Paketleme

işleminde, ilk adım tüm modüllerini tek bir öğe halinde paketlemekti. Bu durumda komutunu kullandık. agoric run komutunun temel mekanizması, bundleSource() çağrısını içerir.

DApp’in contract dizininde, ava kurallarına uygun olarak test-bundle-source.js dosyasını çalıştırın:

cd contract
yarn ava test/test-bundle-source.js

Sonuçlar aşağıdakine benzer görünebilir...

  ✔ bundleSource() sözleşmeyi zoe ile kullanıma hazır hale getirdi (2.7s)
ℹ 1e1aeca9d3ebc0bd39130fe5ef6fbb077177753563db522d6623886da9b43515816df825f7ebcb009cbe86dcaf70f93b9b8595d1a87c2ab9951ee7a32ad8e572
ℹ Object @Alleged: BundleInstallation {}


1 test başarıyla geçti

::: details Test Kurulumu

Test, ana modül belirtimini çözmek için module API'sinden createRequire kullanır:

xyz.zip


Daha sonra, örneğin içeriğine bakabilirsiniz:

```sh
unzip -l xyz.zip

:::

Sözleşme Kurulumu

Tarafların katılmak için onayladığı sözleşme kodlarını tanımlamak için Zoe, Kurulum nesnelerini kullanır.

Bunu bulunan sözleşme ile deneyelim:

yarn ava test/test-contract.js -m 'Sözleşmeyi Kur'
  ✔ Sözleşmeyi Kur
ℹ Object @Alleged: BundleInstallation {}

::: details Test Kurulumu

Test, makeZoeKitForTest kullanarak Zoe'yi test için kurarak başlar:

} */ const installation = E(zoe).install(bundle); const { instance } = await E(zoe).startInstance(installation, issuers, terms); t.log(instance); t.is(typeof instance, 'object');


makeIssuerKit ve AmountMath.make bölümünde, makeEmptyPurse, mintPayment ve getAmountOf ile birlikte ele alınmıştır.

Ayrıca başvurun.

Sözleşme başladığında ne olduğunu gözlemleyelim. Zoe'nin bir faceti, Zoe Sözleşme Faceti, sözleşmeye start fonksiyonu olarak geçilir. Sözleşme bu zcf'yi şartlarını almak için kullanır. Aynı zamanda, ticarette aldığı varlıkları depolamak için bir proceeds koltuğu ve nesnelerin gruplarından oluşan varlıklar oluşturmak için bir mint oluşturmakta kullanır:

<<< @/../snippets/zoe/src/offer-up.contract.js#start

Bir proposalShape ve tradeHandler tanımlar ancak henüz bunlarla bir işlem yapmaz. Sonrasında devreye girecekler. Ayrıca bir publicFacet nesnesi tanımlayıp döndürür ve bekler.

<<< @/../snippets/zoe/src/offer-up.contract.js#started

Teklif Güvenliği ile Ticaret

ticareti test eden bir kısım içerir:

yarn ava test/test-contract.js -m 'Alice ticaret yapar*'
  ✔ Alice ticaret yapar: biraz oyun parası verir, maddeler ister (309ms)
ℹ Object @Alleged: InstanceHandle {}
ℹ Alice, {
Price: {
brand: Object @Alleged: PlayMoney brand {},
value: 5n,
},
} verir.
ℹ Alice'ın ödemesi brand Object @Alleged: Item brand {}
ℹ Alice'ın ödemesi değer Object @copyBag {
payload: [
[
'scroll',
1n,
],
[
'map',
1n,
],
],
}

Öncelikle Alice için bir çantaya para koyuyoruz:

const alicePurse = money.issuer.makeEmptyPurse();
const amountOfMoney = AmountMath.make(money.brand, 10n);
const moneyPayment = money.mint.mintPayment(amountOfMoney);
alicePurse.deposit(moneyPayment);

Daha sonra sözleşme örneğini ve çantayı alice için kodumuza geçiriyoruz:

await alice(t, zoe, instance, alicePurse);

Alice, instance'ı kullanarak sözleşmenin publicFacet ve terms bilgilerini Zoe'den alır:

<<< @/../snippets/zoe/contracts/alice-trade.js#queryInstance

Daha sonra, oyunun Item markasında 1 harita ve 1 parşömen karşılığında tradePrice vermek için bir teklif hazırlar; ve çantasından bir ödeme çekerek:

<<< @/../snippets/zoe/contracts/alice-trade.js#makeProposal

Sonrasında oyuna katılma davetiyesi isteyip, bu davetiye ile birlikte teklife ve ödemesine ilişkin bir teklif yapar; ve Maddeleri için ödemesini bekler:

<<< @/../snippets/zoe/contracts/alice-trade.js#trade

::: details Tekliflerde eksik markalar için sorun giderme

Eğer şu hatayı görürseniz...

Error#1: key Object [Alleged: IST brand] {} not found in collection brandToIssuerRecord

Bu, teklifinizin sözleşmeye bilinmeyen markalar kullanıyor olabileceği anlamına gelir. Sözleşmeye hangi ihraççıların tanındığını öğrenmek için komutunu kullanın.

Eğer sözleşmeyi yazıyor veya oluşturuyorsanız, sözleşmeye ihraççıları anlatmak için veya kullanarak bunu yapabilirsiniz.

:::

Sözleşme, Alice'ın E(publicFacet).makeTradeInvitation() çağrısını alır ve zcf kullanarak bir davetiye oluşturur. Bu davetiye, ilişkili bir işleyici, açıklama ve teklif şekli içerir. Zoe, Alice'ın E(zoe).offer(...) çağrısını alır, teklifi teklif şekli ile karşılaştırır, ödemenin teminatını alır ve işleyiciyi çağırır.

<<< @/../snippets/zoe/src/offer-up.contract.js#makeInvitation

Teklif işleyicisi, teklifi yapan tarafı temsil eden bir koltuk ile çağrılır. Bu durum, tarafın aracılığı ile verilen give ve want değerlerini çeker ve verilenin en az tradePrice kadar olduğunu ve yanıt olarak fazladan madde istemediğini kontrol eder.

Tüm bu ön koşullar sağlandığında, işleyici zcf'ye istenen Item varlıklarını basması, oyuncunun sunduğu varlıkları kendi proceeds koltuğuna tahsis etmesi ve basılan maddeleri oyuncuya vermesi için talimat verir. Son olarak, işlemlerini oyuncu ile kapatır.

<<< @/../snippets/zoe/src/offer-up.contract.js#handler

Zoe, sözleşmenin talimatlarının teklif ile ve varlıkların korunmasına uygun olduğunu kontrol eder. Ardından, teminata alınan ödemeyi sözleşmenin gelir koltuğuna tahsis eder ve daha önceki getPayout(...) çağrısına yanıt olarak NFT'leri Alice'a öder.

Alice, Item ihraççısına ödemesinin ne kadar değerli olduğunu sorar ve istediği kadar olduğunu kontrol eder.

<<< @/../snippets/zoe/contracts/alice-trade.js#payouts