Pametna sredstva Waves: črni in beli seznami, intervalno trgovanje

Pametna sredstva Waves: črni in beli seznami, intervalno trgovanje

V prejšnjih dveh člankih smo govorili o pametnih računih in o tem, kako jih lahko uporabljamo za izvedbo dražb in ustvarjanje programov zvestobein tudi pomoč zagotoviti preglednost finančnih instrumentov.

Zdaj si bomo ogledali pametna sredstva in več primerov njihove uporabe, vključno z zamrznitvijo sredstev in ustvarjanjem omejitev za transakcije na določenih naslovih.

Pametna sredstva Waves omogočajo uporabnikom, da prekrivajo skripte na sredstvih, pri čemer sledijo isti mehaniki kot pametni računi. Vsako novo transakcijo, ustvarjeno s pametnim sredstvom, bo najprej potrdil skript in šele nato veriga blokov.

Omeniti velja naslednje razlike med pametnimi sredstvi in ​​pametnimi računi:

  1. V kodi pametnega sredstva je nemogoče preveriti dokazila (o njih smo govorili v prvem članku).
  2. V kodi pametnega računa lahko preverite ExchangeTransaction samo, če je vaš račun račun za ujemanje. V nasprotnem primeru se preverja samo naročilo. V kodi pametnega sredstva ne morete neposredno preveriti naročila; preverite lahko ExchangeTransaction in po potrebi izvlečete naročilo iz njega.
  3. Pametno sredstvo za razliko od pametnega računa nima stanja, imamo pa vseeno dostop do stanj računa iz skripte.

Pametna sredstva močno poenostavijo pisanje pogodb, zaradi česar je izvedba številnih primerov jedrnata in elegantna.

Zamrznitev sredstev

Za zamrznitev sredstev na določeno višino bloka targetHeight, lahko preprosto nastavite to vrednost v skriptu naslednjega pametnega sredstva:

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

Poseben pogoj za ujemanje

Če želite določeno ujemanje nastaviti kot želenega, lahko nastavite njegov naslov kot pošiljatelja v skriptu pametnega sredstva, ki je videti takole:

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

"Beli seznam" prejemnikov

Če želite dovoliti pošiljanje žetonov samo na določene račune - ustvariti "bel seznam" prejemnikov - lahko uporabite pametno sredstvo z naslednjo shemo, ki preverja vključitev na seznam:

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
}

Zaradi varnostnih razlogov in dokazljive popolnosti jezika seznam ne vsebuje izvedbe iteratorja. Zato je opredeljen kot skupek betonskih elementov.

"Črni seznam" prejemnikov

Podobno, če želite prepovedati pošiljanje žetonov na določene račune, lahko ustvarite "črni seznam". V tem primeru se uporabi popolnoma isto pametno sredstvo, vendar s preverjenim naslovom, da se zagotovi, da ni na črnem seznamu:

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
}

Pošiljanje z dovoljenjem izdajatelja

Z uporabo pametnega sredstva lahko nastavite tudi možnost pošiljanja pametnega sredstva samo z dovoljenjem izdajatelja (oznaka obveznosti/dolga). Izdajatelj izrazi svoje soglasje tako, da ID transakcije vnese v stanje svojega računa:

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

Menjava samo za določene kovance

Pametno sredstvo omogoča dovoljenje za zamenjavo samo za določene kovance. Na primer, če želite omogočiti samo menjavo za bitcoine, lahko uporabite naslednjo kodo:

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

Trgovanje po ceni iz Oraklja

V skriptu pametnega sredstva lahko nastavite dovoljenje za trgovanje samo po ceni, ki je določena v stanju zanesljivega orakulja. Tukaj je primer takega skripta:

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
}

Tukaj se soočamo z neočitno točko pri preverjanju ID-ja sredstva, s katerim se trguje. Bistvo je, da če ID sredstva ni definiran, potem govorimo o WAVES. V skripti poskrbimo, da se trgovanje izvaja v tandemu z WAVES, na točno ta način.

Fiksno zvišanje cene

Za pametno sredstvo lahko določite fiksno ceno, ki se bo postopoma povečevala v določenem razmerju. Tukaj je primer skripta sredstva, katerega cena se bo povečala za 5 % vsakih 1000 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
}


Intervalno trgovanje

Prav tako je zahvaljujoč skriptu mogoče trgovanje s pametnim sredstvom omejiti na vnaprej določene intervale. Tukaj je primer takega skripta:

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

V skripti poskrbimo, da od začetka trgovanja startHeight ne več kot omejiti intervalih. Dolžina intervala je enaka številu blokov, podanih v polju Interval.

Vir: www.habr.com

Dodaj komentar