Kontrat Yönetimi
Agoric platformu, Cosmos SDK platformundaki zincir genel yönetime ek olarak, kontratlar üzerinde üç ana kontrol biçimini destekleyen esnek bir mimari ile @agoric/governance
paketini içermektedir. Bu, iyi bir merkeziyetsizlik ve yürütme kontrolü dengesine sahip sistemler oluşturmayı amaçlamaktadır:
- Parametre Yönetimi: Parametre değerlerinin kontrolü
- API Yönetimi: Kontrat yazarları tarafından belirtilen belirli yöntemlerin çağrılabilme yeteneği
- Teklif filtreleri: Acil durumlar için bazı teklifler/davetiye kullanımlarını devre dışı bırakma yeteneği
::: tip Yönetim Paketi Hedefleri
Yönetim paketinin tasarımı, bir kontratın müşterilerinin değişiklik yapma yetkisine sahip olanları, hangi değişiklikleri yapabileceklerini ve kontrol altındaki değerlerin mevcut durumunu görebilmelerini sağlamaya odaklanmaktadır.
yönetim paketinin desteklemeyi amaçladığı garantileri açıklamaktadır.
:::
Parametre Yönetimi
bölümünde, kontratların şartlar ile parametrelenmiş olduğunu gördük. Parametre yönetimi, bir yetkilendirilmiş tarafın, Seçmen olarak adlandırılan, kontrat çalışırken böyle parametreleri değiştirmesine olanak tanır.
projesinde, swaparoo kontratı yönetilen bir Fee
parametresi içerir:
const paramTypes = harden(
/** @type {const} */ ({
Fee: ParamTypes.AMOUNT
})
);
Seçmen, Seçim Yöneticisi için Kontratların Yeniden Kullanılması
Bu dapp, @agoric/governance
kütüphanesindeki committee.js
kontratını seçmen olarak kullanmaktadır. Temel değerlendirme dağıtım scripti, swaparoo komitesini başlatır, davetiyeleri alır ve bunları seçmenlerin akıllı cüzdanlarına gönderir. test-vote-by-committee.js
dosyasında komite sadece 1 seçmenden oluşmaktadır.
Bir Kontrata Parametre Yönetimi Eklemek
Bir kontrata parametre yönetimi eklemek esasen handleParamGovernance(...)
fonksiyonunu kullanmayı içerir. İlk parametre değerleri için getTerms()
alabilmesi amacıyla zcf
parametresini geçiririz ve yönetilen parametreleri ve türlerini belirlemek için paramTypes
aralıklarını geçiririz. initialPoserInvitation
, seçimi değiştirmek için gereklidir. storageNode
ve marshaller
, kullanılmaktadır.
import { handleParamGovernance } from '@agoric/governance/src/contractHelper.js';
export const start = async (zcf, privateArgs, baggage) => {
// ...
const { publicMixin, makeDurableGovernorFacet, params } =
await handleParamGovernance(
zcf,
privateArgs.initialPoserInvitation,
paramTypes,
privateArgs.storageNode,
privateArgs.marshaller
);
// ...
};
Geri dönüş alırız:
params
: sadece okunabilir parametre erişimi.params.getFee().value
ile, örneğin,Fee
parametresinin mevcut değerini her an elde edebiliriz.publicMixin
: parametre değerlerini kontratınpublicFacet
aracılığıyla erişilebilir hale getirmek içinmakeDurableGovernorFacet
: kontratın mevcut yaratıcı facet yöntemlerini (bilinenlimitedCreatorFacet
) parametre değerlerini değiştirme yöntemleri ile birleştirmek için.
export const start = async (zcf, privateArgs, baggage) => {
// ...
const publicFacet = Far('Public', {
makeFirstInvitation,
...publicMixin
});
const limitedCreatorFacet = Far('Creator', {
makeCollectFeesInvitation() {
return makeCollectFeesInvitation(zcf, feeSeat, feeBrand, 'Fee');
}
});
const { governorFacet } = makeDurableGovernorFacet(
baggage,
limitedCreatorFacet
);
return harden({ publicFacet, creatorFacet: governorFacet });
};
Bir Yönetilen Kontratı Yöneticisi Aracılığıyla Başlatma
Parametre değerlerini değiştirme yetkisi yalnızca seçmende bulunmaktadır. Bunu sağlamak amacıyla, yönetilen bir kontrat bir kontrat yöneticisi tarafından başlatılır. Kontrat yöneticisi, parametreleri değiştirme yeteneğine sahip tam işlevli yaratıcı facet'i tutar. Yöneticiyi başlatan çağrıcı yalnızca limitedCreatorFacet
alır.
Açıklık sağlamak için, bu resimde bazı Zoe API detayları hariç tutulmuştur.
Bir Seçim Yöneticisi Aracılığıyla Soru Sorma
Bir Seçim Yöneticisi, uygun bir tarafın addQuestion()
çağrısı yapmasını sağlar. @agoric/inter-protocol
kütüphanesindeki econCommitteeCharter.js
kontratı, çoğu parametre yönetimi biçimini yeterince genel bir şekilde işleyebilir, bu yüzden burada tekrar kullanıyoruz. Swaparoo temel değerlendirme dağıtımı benzer şekilde bu kontratı başlatır, davetiyeleri ister ve bunları seçmenlere gönderir.
Açıklık sağlamak için, bu resimde bazı Zoe API detayları hariç tutulmuştur.
Komite katılımcısı, charter davetiyesini kullanarak bir soru sorma yetkisini elde etmek amacıyla akıllı cüzdanını yönlendirir; bunun için v0-accept-charter
teklifini referans alır:
test.serial('Voter0 accepts charter, committee invitations', async t => {
// ...
await victor.acceptCharterInvitation('v0-accept-charter');
// ...
});
Değişiklik teklifinde bulunmak için VoteOnParamChange
yetkisini kullanan komite katılımcısı, v0-accept-charter
ı charterAcceptOfferId
olarak referans alarak bir hazırlar:
const makeVoter = (t, wallet, wellKnown) => {
// ...
const putQuestion = async (offerId, params, deadline) => {
const instance = await wellKnown.instance[contractName]; // swaparoo instance handle
const path = { paramPath: { key: 'governedParams' } };
/** @type {import('@agoric/inter-protocol/src/econCommitteeCharter.js').ParamChangesOfferArgs} */
const offerArgs = harden({ deadline, params, instance, path });
/** @type {import('@agoric/smart-wallet/src/offers.js').OfferSpec} */
const offer = {
id: offerId,
invitationSpec: {
source: 'continuing',
previousOffer: NonNullish(charterAcceptOfferId),
invitationMakerName: 'VoteOnParamChange'
},
offerArgs,
proposal: {}
};
return doOffer(offer);
};
};
offerArgs
, değiştirmek için bir son tarih ve parametreler ile ilgili detayları içerir:
test.serial('vote to change swap fee', async t => {
// ...
const targetFee = IST(50n, 100n); // 50 / 100 = 0.5 IST
const changes = { Fee: targetFee };
// ...
const deadline = BigInt(new Date(2024, 6, 1, 9, 10).valueOf() / 1000);
const result = await victor.putQuestion('proposeToSetFee', changes, deadline);
t.log('soru soruldu', result);
// ...
});
Bir Soru Üzerine Oy Kullanma
Seçmen de komiteye katılmak için davetiyesini kabul etmek amacıyla bir teklif yapar; bu teklifi v0-join-committee
ile tanımlar:
test.serial('Voter0 accepts charter, committee invitations', async t => {
// ...
await victor.acceptCommitteeInvitation('v0-join-committee', 0);
// ...
});
Oy kullanma yeteneğini kullanmak amacıyla, committeeOfferId
olarak v0-join-committee
'yi referans alarak bir devam eden davetiye hazırlar:
const makeVoter = (t, wallet, wellKnown) => {
// ...
const vote = async (offerId, details, position) => {
const chosenPositions = [details.positions[position]];
/** @type {import('./wallet-tools.js').OfferSpec} */
const offer = {
id: offerId,
invitationSpec: {
source: 'continuing',
previousOffer: NonNullish(committeeOfferId),
invitationMakerName: 'makeVoteInvitation',
invitationArgs: harden([chosenPositions, details.questionHandle])
},
proposal: {}
};
return doOffer(offer);
};
// ...
};
Her soru, details
içinde yayımlanan benzersiz bir questionHandle
nesnesine sahiptir.
test.serial('vote to change swap fee', async t => {
// ...
const details = await vstorage.get(
`published.committee.swaparoo.latestQuestion`
);
t.is(details.electionType, 'param_change');
const voteResult = await victor.vote('voteToSetFee', details, 0);
t.log('victor oy kullandı:', voteResult);
// ...
});
Son tarih geldiğinde, kontrat yöneticisi, sorunun kabul edildiğine dair bilgilendirilir. Komut, swaparoo kontratına ücreti değiştirmesi için talimat verir.
test.serial('vote to change swap fee', async t => {
// ...
const swapPub = E(zoe).getPublicFacet(
swapPowers.instance.consume[contractName]
);
// ...
const after = await E(swapPub).getAmount('Fee');
t.deepEqual(after, targetFee);
});
Swaparoo kontratı ayrıca güncellenmiş parametrelerini vstorage üzerine yayımlar.
API Yönetimi
Parametre yönetimi, bir seçmenin yönetimindeki kontratların parametrelerini değiştirmesine olanak tanırken, API yönetimi de seçmenin kontrat API'lerini kullanabilmesine imkan tanır; özellikle yönetilen bir kontrattaki yaratıcı facet yöntemlerini.
Örneğin, Inter Protocol'de, Ekonomik Komite oracle operatörlerini ekleyip kaldırabilir:
Detaylar için:
@agoric/inter-protocol
kütüphanesindekivaultFactory
kontratı
Teklif Filtreleri
Bir seçmen, bir kontratın Zoe'nin sözleşme ile ileteceği teklifleri filtrelemesini yönlendirebilir. Ayrıntılar için:
- .