Inteligentní aktiva Waves: černé a bílé listiny, intervalové obchodování

Inteligentní aktiva Waves: černé a bílé listiny, intervalové obchodování

V předchozích dvou článcích jsme hovořili o chytrých účtech a jejich využití pro pořádání aukcí a vytváření věrnostních programůa také pomoci zajistit transparentnost finančních nástrojů.

Nyní se podíváme na chytrá aktiva a několik případů jejich použití, včetně zmrazení aktiv a vytváření omezení transakcí na zadaných adresách.

Inteligentní aktiva Waves umožňují uživatelům překrývat skripty na aktiva podle stejných mechanismů jako inteligentní účty. Každá nová transakce vytvořená pomocí chytrého aktiva bude nejprve potvrzena skriptem a teprve poté blockchainem.

Za zmínku stojí následující rozdíly mezi chytrými aktivy a chytrými účty:

  1. V kódu chytrého aktiva není možné zkontrolovat důkazy (mluvili jsme o nich v prvním článku).
  2. V kódu chytrého účtu můžete zkontrolovat ExchangeTransaction pouze v případě, že je váš účet účtem dohazovače. V opačném případě se kontroluje pouze objednávka. V kódu inteligentního aktiva nemůžete přímo zkontrolovat objednávku, můžete zkontrolovat ExchangeTransaction a v případě potřeby z ní extrahovat objednávku.
  3. Chytré aktivum na rozdíl od chytrého účtu nemá stav, ale stále máme přístup ke stavům účtu ze skriptu.

Inteligentní aktiva výrazně zjednodušují psaní smluv, díky čemuž je realizace mnoha případů stručná a elegantní.

Zmrazení aktiv

Chcete-li zmrazit aktiva na určitou výšku bloku cílová výška, můžete tuto hodnotu jednoduše nastavit ve skriptu následujícího inteligentního prvku:

let targetHeight = 1500000
height >= targetHeight
 
height - функция языка, возращающая текущую высоту.

Specifický stav dohazovače

Chcete-li nastavit konkrétní dohazovač jako požadovaný, můžete nastavit jeho adresu jako odesílatele ve skriptu chytrého aktiva, který vypadá takto:

match tx {
    case t : ExchangeTransaction =>
        t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
    case _ => true
}

"Bílý seznam" příjemců

Chcete-li umožnit odesílání tokenů pouze na určité účty – k vytvoření „bílé listiny“ příjemců – můžete použít inteligentní aktivum s následujícím schématem, které kontroluje zahrnutí do seznamu:

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ůvodů a prokazatelné úplnosti jazyka seznam neobsahuje implementaci iterátoru. Proto je definován jako soubor betonových prvků.

"Černá listina" příjemců

Podobně, chcete-li zakázat odesílání tokenů na určité účty, můžete vytvořit „černou listinu“. V tomto případě je použito přesně stejné inteligentní aktivum, ale se zaškrtnutou adresou, aby bylo zajištěno, že není na černé listině:

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
}

Odeslání se svolením vydavatele

Pomocí inteligentního aktiva můžete také nastavit možnost odeslat inteligentní aktivum pouze se svolením vydavatele (štítek závazku/dluhu). Emitent vyjadřuje svůj souhlas uvedením ID transakce do stavu svého účtu:

match tx {
  case t : TransferTransaction =>
    let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
    #убеждаемся, что в стейте эмитента содержится ID текущей транзакции
    isDefined(getInteger(issuer, toBase58String(t.id)))
  case _ => false
}

Výměna pouze za určité mince

Chytré aktivum umožňuje jeho výměnu pouze za určité mince. Chcete-li například povolit výměnu pouze za bitcoiny, můžete použít následující kód:

let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
  case t : ExchangeTransaction =>
    t.sellOrder.assetPair.priceAsset == BTCId ||
     t.sellOrder.assetPair.amountAsset == BTCId
  case _ => true
}

Obchodování podle ceny od orákula

Ve skriptu inteligentních aktiv můžete nastavit oprávnění obchodovat pouze za cenu stanovenou ve stavu spolehlivého orákula. Zde je příklad takového 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
}

Zde se při kontrole ID aktiva, se kterým se provádí obchodování, setkáváme s nezřejmým bodem. Jde o to, že pokud není definováno ID aktiva, pak se bavíme o VLNÁCH. Ve skriptu zajišťujeme, aby obchodování probíhalo v tandemu s WAVES, přesně tímto způsobem.

Pevné zvýšení ceny

U chytrého aktiva si můžete nastavit pevnou cenu, která se bude v daném poměru postupně zvyšovat. Zde je příklad skriptu aktiv, jehož cena se zvýší o 5 % každých 1000 bloků:

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é obchodování

Také díky skriptu lze obchodování s chytrým aktivem omezit na předem určené intervaly. Zde je příklad takového skriptu:

let startHeight = 10000
let interval = 44000
let limit = 1500
 
match tx {
  case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
    (height - startHeight) % interval < limit
  case _ => true
}

Ve skriptu se ujistíme, že od začátku obchodování startHeight ne více než limit intervalech. Délka intervalu se rovná počtu bloků zadaných v poli interval.

Zdroj: www.habr.com

Přidat komentář