Teraz sa pozrieme na inteligentné aktíva a niekoľko prípadov ich použitia, vrátane zmrazenia aktív a vytvárania obmedzení transakcií na určených adresách.
Inteligentné aktíva Waves umožňujú používateľom prekrývať skripty aktív podľa rovnakých mechanizmov ako inteligentné účty. Každá nová transakcia vytvorená pomocou inteligentného aktíva bude najprv potvrdená skriptom a až potom blockchainom.
Stojí za zmienku nasledujúce rozdiely medzi inteligentnými aktívami a inteligentnými účtami:
V kóde inteligentného majetku nie je možné skontrolovať dôkazy (hovorili sme o nich v prvom článku).
V kóde inteligentného účtu môžete skontrolovať ExchangeTransaction iba vtedy, ak je váš účet účtom porovnávača. V opačnom prípade sa kontroluje iba objednávka. V kóde inteligentného majetku nemôžete priamo skontrolovať objednávku, môžete skontrolovať ExchangeTransaction a v prípade potreby z nej extrahovať objednávku.
Inteligentné aktívum na rozdiel od inteligentného účtu nemá stav, ale stále máme prístup k stavom účtu zo skriptu.
Inteligentné aktíva výrazne zjednodušujú písanie zmlúv, vďaka čomu je implementácia mnohých prípadov stručná a elegantná.
Zmrazenie aktív
Zmraziť aktíva na určitú výšku bloku targetHeight, môžete túto hodnotu jednoducho nastaviť v skripte nasledujúceho inteligentného prvku:
let targetHeight = 1500000
height >= targetHeight
height - функция языка, возращающая текущую высоту.
Špecifický stav dohadzovača
Ak chcete nastaviť konkrétny priraďovač ako požadovaný, môžete nastaviť jeho adresu ako odosielateľa v inteligentnom skripte aktív, ktorý vyzerá takto:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
"Biely zoznam" príjemcov
Ak chcete povoliť odosielanie tokenov iba na určité účty – na vytvorenie „bieleho zoznamu“ príjemcov – môžete použiť inteligentné aktívum s nasledujúcou schémou, ktorá kontroluje zahrnutie do zoznamu:
match tx {
case t : TransferTransaction =>
let trustedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")
let trustedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K")
let trustedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx")
t.recipient == trustedRecipient1 || t.recipient == trustedRecipient2 || t.recipient == trustedRecipient3
case _ => false
}
Z bezpečnostných dôvodov a preukázateľnej úplnosti jazyka zoznam neobsahuje implementáciu iterátora. Preto je definovaný ako súbor betónových prvkov.
„Čierna listina“ príjemcov
Podobne, ak chcete zakázať posielanie tokenov na určité účty, môžete vytvoriť „čiernu listinu“. V tomto prípade sa používa presne to isté inteligentné aktívum, ale so začiarknutou adresou, aby sa zabezpečilo, že nie je na čiernej listine:
match tx {
case t : TransferTransaction =>
let bannedRecipient1 = addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")
let bannedRecipient2 = addressFromString("3PLZcCJyYQnfWfzhKXRA4rteCQC9J1ewf5K")
let bannedRecipient3 = addressFromString("3PHrS6VNPRtUD8MHkfkmELavL8JnGtSq5sx")
t.recipient != bannedRecipient1 && t.recipient != bannedRecipient2 && t.recipient != bannedRecipient3
case _ => false
}
Zasielanie so súhlasom vydavateľa
Pomocou inteligentného aktíva môžete nastaviť aj možnosť odosielať inteligentné aktívum iba s povolením vydavateľa (štítok záväzkov/dlžníkov). Emitent vyjadruje svoj súhlas umiestnením ID transakcie do stavu svojho účtu:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#убеждаемся, что в стейте эмитента содержится ID текущей транзакции
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Výmena len za určité mince
Inteligentné aktívum umožňuje jeho výmenu iba za určité mince. Ak chcete napríklad povoliť výmenu iba za bitcoiny, môžete použiť nasledujúci kód:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
case t : ExchangeTransaction =>
t.sellOrder.assetPair.priceAsset == BTCId ||
t.sellOrder.assetPair.amountAsset == BTCId
case _ => true
}
Obchodovanie podľa ceny z orákula
V skripte inteligentných aktív môžete nastaviť povolenie obchodovať iba za cenu stanovenú v stave spoľahlivého orákula. Tu je príklad takéhoto skriptu:
let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
match tx {
#запрещаем передачу ассета
case t: TransferTransaction | MassTransferTransaction => false
case e: ExchangeTransaction =>
#убеждаемся, что торговля происходит по цене, заданной в стейте оракла для этого ассета
let correctPrice = e.price == extract(getInteger(oracle, assetId))
#убеждаемся, что торговля происходит в обмен на WAVES
let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset)
correctPrice && correctPriceAsset
case _ => true
}
Tu sa pri kontrole ID aktíva, s ktorým sa obchoduje, stretávame s nezrejmým bodom. Ide o to, že ak nie je definované ID majetku, tak hovoríme o VLNÁCH. V scenári dbáme na to, aby obchodovanie prebiehalo v tandeme s WAVES, presne týmto spôsobom.
Fixné zvýšenie ceny
Za inteligentné aktívum si môžete nastaviť pevnú cenu, ktorá sa bude postupne zvyšovať v danom pomere. Tu je príklad skriptu aktív, ktorého cena sa zvýši o 5 % každých 1000 XNUMX blokov:
let startPrice = 10
let startHeight = 1000
let interval = 1000
#на сколько процентов цена увеличивается за один шаг
let raise = 5
match tx {
case t: TransferTransaction | MassTransferTransaction => false
case e: ExchangeTransaction =>
e.price == startPrice + ((height - startHeight) / interval) * (100 + raise) / 100
&& !isDefined(e.sellOrder.assetPair.priceAsset)
case _ => true
}
Intervalové obchodovanie
Tiež vďaka skriptu môže byť obchodovanie s inteligentným aktívom obmedzené na vopred určené intervaly. Tu je príklad takéhoto skriptu:
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval < limit
case _ => true
}
V skripte zabezpečujeme, že od začiatku obchodovania startHeight nie viac ako obmedziť intervaloch. Dĺžka intervalu sa rovná počtu blokov zadaných v poli interval.