Ana içeriğe geç

Bir Kontratı Yayınlamak için Temel Değerlendirme Scripti Yazma

Bir temel değerlendirme scripti değerlendirildiğinde, tamamlanma değeri bir fonksiyon olması beklenir. Bu fonksiyon, sözleşmeleri yaymak için yararlı çeşitli yeteneklere sahip bir BootstrapPowers nesnesi ile çağrılır.

Örneğin, projesinde, konser biletlerini satmak için bir kontrat bulunmaktadır. Bu kontratı yaymak için:

  • Kontrat paketini Zoe kurulum olarak yükleyin
  • Kontrat örneğini başlatın ve şartlar için fiyat miktarları oluşturmak üzere IST markasını kullanın
  • Kurulumu ve örneği sellConcertTickets adı altında isim servisinde yayımlayın
  • Ticket vericisini ve markasını agoricNames verici ve marka bölümlerinde yayımlayın.

Bazı ön koşullardan sonra...

::: details imports, makeTerms vb.

// @ts-check
import { allValues } from './objectTools.js';
import {
AmountMath,
installContract,
startContract
} from './platform-goals/start-contract.js';

const { Fail } = assert;
const IST_UNIT = 1_000_000n;

export const makeInventory = (brand, baseUnit) => {
return {
frontRow: {
tradePrice: AmountMath.make(brand, baseUnit * 3n),
maxTickets: 3n
},
middleRow: {
tradePrice: AmountMath.make(brand, baseUnit * 2n),
maxTickets: 3n
},
lastRow: {
tradePrice: AmountMath.make(brand, baseUnit * 1n),
maxTickets: 3n
}
};
};

export const makeTerms = (brand, baseUnit) => {
return {
inventory: makeInventory(brand, baseUnit)
};
};

/**
* @typedef {{
* brand: PromiseSpaceOf;
* issuer: PromiseSpaceOf;
* instance: PromiseSpaceOf
* }} SellTicketsSpace
*/

:::

... kontratın yayılmasını sağlayan fonksiyon startSellConcertTicketsContract:

const contractName = 'sellConcertTickets';

/**
* Kontratı başlatmak için temel değerlendirme scripti
*
* @param {BootstrapPowers} permittedPowers
* @param {*} config
*/
export const startSellConcertTicketsContract = async (powers, config) => {
console.log('core eval for', contractName);
const {
// çağıran tarafından tedarik edilmeli veya şablon ile değiştirilmiş olmalı
bundleID = Fail`no bundleID`
} = config?.options?.[contractName] ?? {};

const installation = await installContract(powers, {
name: contractName,
bundleID
});

const ist = await allValues({
brand: powers.brand.consume.IST,
issuer: powers.issuer.consume.IST
});

const terms = makeTerms(ist.brand, 1n * IST_UNIT);

await startContract(powers, {
name: contractName,
startArgs: {
installation,
issuerKeywordRecord: { Price: ist.issuer },
terms
},
issuerNames: ['Ticket']
});

console.log(contractName, '(re)started');
};

Bir BootstrapPowers nesnesi, bir dizi promise alanı içerir. Bir promise alanı { produce, consume } çiftinden oluşur ve

  • consume[name], belirli bir isimle ilişkili bir vaadi temsil eder.
  • produce[name].resolve(value), aynı isimle ilişkili olan vaadi, bir değer sağlayarak çözümleyen bir işlevdir.

En üstte bir tane alan bulunmaktadır, böylece powers.consume.zoe, Zoe Servisi için bir vaattir. Bu vaat, sanal makinenin çalıştırılmasının erken aşamalarında çözümlenmiştir.

Bir seviye daha aşağıda birçok ek promise alanı bulunmaktadır, bunlar arasinda:

  • powers.installation
  • powers.instance
  • powers.issuer
  • powers.brand

installContract yardımcı işlevi, E(zoe).installBundleID(bundleID) çağrısı yaparak Installation oluşturur; bu, daha önceki tartışmamıza benzer. Ayrıca, powers.installation[name].resolve(installation) çağrısını da yapar.

/**
* Belirtilen bir bundleID ve izin verilen bir isim ile, bir paketi yükleyin ve "üretin"
* yüklemeyi, ayrıca bunu agoricNames üzerinden yayımlayın.
*
* @param {BootstrapPowers} powers - zoe, installation.produce[name]
* @param {{ name: string, bundleID: string }} opts
*/
export const installContract = async (
{ consume: { zoe }, installation: { produce: produceInstallation } },
{ name, bundleID }
) => {
const installation = await E(zoe).installBundleID(bundleID);
produceInstallation[name].reset();
produceInstallation[name].resolve(installation);
console.log(name, 'installed as', bundleID.slice(0, 8));
return installation;
};

Bu installation vaadi alanı, E(agoricNames).lookup('installation') NameHub ile bağlantılıdır: produce[name].resolve(value) işlemini yaptığınızda, bu NameHub'da bir güncelleme tetikler. Güncelleme sağlanan ismi sağlanan değerle ilişkilendirerek E(agoricNames).lookup('installation', name)'in bir vaadi olmasını sağlar.

Benzer şekilde, startContract() yardımcı işlevi, E(zoe).startInstance(...) çağrısı yaparak, daha önceki tartışmamıza dayanır. Aynı zamanda, issuerNames argümanını kullanarak Ticket vericisini ve markasını E(agoricNames).lookup('issuer', 'Ticket') ve E(agoricNames).lookup('brand', 'Ticket') olarak "üretir" ve böylece erişilebilir hale getirir.