Ana içeriğe geç

chainStorage'e Yayınlama

Sözleşmeler, kullanarak istemcilere veri yayınlayabilir. Sözleşmelerin ile görünür veri yayınlayabilmesi için, bir abonelik oluşturulup chainStorage düğümüne bağlanması gerekmektedir.

chainStorage'e Yayınlama için Dağıtım Yetkinlikleri

bölümünde, storageNode ve marshaller sözleşmeye privateArgs içerisinde geçilir, bu sayede chainStorage'e veri yayınlayabilir.

örneğinde, startSwapContract iki kullanarak chainStorage ve board yetkinliklerini elde eder ve bunları privateArgs oluşturmak için kullanır:

const marshaller = await E(board).getPublishingMarshaller();
const storageNode = await E(chainStorage).makeChildNode(contractName);

Marshaller, sahte olmayan nesne kimliklerini düz veri slot referanslarına eşlemek ve tersine işlem yapmak için fonksiyonlarla parametreleştirilmiştir. ad hizmetinin kullanılması, sözleşmeler arasında tutarlı slot referansları sağlar. makalesinde de açıklandığı gibi, bu, off-chain istemcilerin aynı @endo/marshal API'sini kullanmasına olanak tanır.

chainStorage düğümü, published anahtarına karşılık gelir. E(chainStorage).makeChildNode(contractName) komutunu kullanarak sözleşme, published.swaparoo anahtarına ve onun altındaki tüm anahtarlara yazma erişimi elde eder.

swaparoo sözleşmesi, yayınlama yönetim parametrelerinin kalanını @agoric/governance paketine devretmektedir.

chainStorage'e Yapılandırılmış Veri Yayınlama

Detayları daha iyi anlamak için Inter Protocol sözleşmesine bakalım. Bu sözleşme, verisini şu biçimde yayınlar:

/**
* @typedef {object} MetricsNotification
* @property {AmountKeywordRecord} allocations
* @property {Amount} shortfallBalance tasfiye nedeniyle henüz tazmin edilmemiş açık.
* @property {Amount} totalFeeMinted bugüne kadar basılan toplam Ücret jetonları
* @property {Amount} totalFeeBurned bugüne kadar yakılan toplam Ücret jetonları
*/

Örneğin:

    {
allocations: {
Fee: {
brand: Object @Alleged: IST brand {},
value: 64561373455n,
},
ATOM: {
brand: Object @Alleged: ATOM brand {},
value: 6587020n
},
},
shortfallBalance: {
brand: Object @Alleged: IST brand {},
value: 5747205025n,
},
totalFeeBurned: {
brand: Object @Alleged: IST brand {},
value: n,
},
totalFeeMinted: {
brand: Object @Alleged: IST brand {},
value: 0n,
},
},

Bu verileri yazan yöntem:

        writeMetrics() {
const { state } = this;
const metrics = harden({
allocations: state.collateralSeat.getCurrentAllocation(),
shortfallBalance: state.shortfallBalance,
totalFeeMinted: state.totalFeeMinted,
totalFeeBurned: state.totalFeeBurned,
});
void state.metricsKit.recorder.write(metrics);
},

metricsKit, makeRecorderKit fonksiyonu ile oluşturulur:

        metricsKit: makeRecorderKit(
metricsNode,
/** @type {import('@agoric/zoe/src/contractSupport/recorder.js').TypedMatcher} */ (
M.any()
),
),

Bu fonksiyonu, bir RecorderKit oluşturmak için kullanarak "hazırlıyoruz" (exo anlamında).

const { makeRecorderKit } = prepareRecorderKitMakers(
baggage,
privateArgs.marshaller
);

Sözleşme, başladığında baggage ile birlikte privateArgs alır:

/**
* Varlık Rezervi, Inter Protocol için varlıkları tutar ve ...
*
* @param {{
* ...
* marshaller: ERef,
* storageNode: ERef,
* }} privateArgs
* @param {Baggage} baggage
*/
export const prepare = async (zcf, privateArgs, baggage) => {
// ...
};

Rezerv, StorageNode'unu kullanarak metricsNode oluşturmak için bir çocuk node yapar:

const metricsNode = await E(storageNode).makeChildNode('metrics');

marshaller, yukarıdaki gibi veri yapılarını seri hale getirmek için kullanılır.

Rezerv için Dağıtım Yetkinlikleri

assetReserve'i başlatmak için, fonksiyonu yine iki ilgili privateArgs, marshaller ve storageNode sağlar:

const STORAGE_PATH = 'reserve';
const storageNode = await E(storageNode).makeChildNode(STORAGE_PATH);
const marshaller = await E(board).getReadonlyMarshaller();

setupReserve fonksiyonu chainStorage ve board dağıtım yetkinliklerini geçmektedir:

export const setupReserve = async ({
consume: {
board,
chainStorage,
// ...
},
// ...
}) => { ... };