Inteligentné aktíva Waves: čierne a biele zoznamy, intervalové obchodovanie

Inteligentné aktíva Waves: čierne a biele zoznamy, intervalové obchodovanie

V predchádzajúcich dvoch článkoch sme hovorili o inteligentných účtoch a ich použití na organizovanie aukcií a vytváranie vernostných programova tiež pomôcť zabezpečiť transparentnosť finančných nástrojov.

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:

  1. V kóde inteligentného majetku nie je možné skontrolovať dôkazy (hovorili sme o nich v prvom článku).
  2. 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.
  3. 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.

Zdroj: hab.com

Pridať komentár