Waves nutikad varad: mustad ja valged nimekirjad, intervallkauplemine

Waves nutikad varad: mustad ja valged nimekirjad, intervallkauplemine

Kahes eelmises artiklis rääkisime nutikatest kontodest ja nende kasutamisest oksjonite korraldamiseks ja lojaalsusprogrammide loomiseksja ka abiks tagada finantsinstrumentide läbipaistvus.

Nüüd vaatleme nutikaid varasid ja mitmeid nende kasutamise juhtumeid, sealhulgas varade külmutamist ja piirangute seadmist tehingutele määratud aadressidel.

Waves Smart Assets võimaldavad kasutajatel skripte varadele üle kanda, järgides sama mehhanismi nagu nutikad kontod. Iga nutika vara abil loodud uus tehing kinnitatakse esmalt skripti ja alles seejärel plokiahelaga.

Tasub tähele panna järgmisi erinevusi nutikate varade ja nutikate kontode vahel:

  1. Nutivara koodis on tõendeid võimatu kontrollida (neist rääkisime esimeses artiklis).
  2. Nutika konto koodis saate ExchangeTransactioni kontrollida ainult siis, kui teie konto on vastekonto. Vastasel juhul kontrollitakse ainult tellimust. Nutivara koodis ei saa tellimust otse kontrollida, vaid saab kontrollida ExchangeTransactionit ja vajadusel sealt tellimust välja võtta.
  3. Nutivaral, erinevalt nutikast kontost, ei ole olekut, kuid meil on siiski juurdepääs konto olekutele skriptist.

Nutikad varad lihtsustavad oluliselt lepingute kirjutamist, muutes paljude juhtumite rakendamise ülevaatlikuks ja elegantseks.

Varade külmutamine

Varade külmutamiseks teatud ploki kõrgusele sihtKõrgus, saate selle väärtuse lihtsalt määrata järgmise nutika vara skriptis:

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

Matteri eritingimus

Konkreetse sobitaja soovitud määramiseks saate määrata selle saatja aadressi nutikas vara skriptis, mis näeb välja järgmine:

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

Saajate "valge nimekiri".

Lubade saatmise lubamiseks ainult teatud kontodele – saajate valge nimekirja loomiseks – saate kasutada järgmise skeemi abil nutivara, mis kontrollib loendisse lisamist:

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
}

Turvakaalutlustel ja keele tõestatava täielikkuse huvides ei sisalda loend iteraatori rakendust. Seetõttu määratletakse see betoonelementide kogumina.

Saajate "must nimekiri".

Samamoodi saate teatud kontodele žetoonide saatmise keelamiseks luua "musta nimekirja". Sel juhul kasutatakse täpselt sama nutikat vara, kuid kontrollitakse aadressi, et veenduda, et see pole mustas nimekirjas:

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
}

Saatmine väljaandja loal

Nutivara abil saab määrata ka võimaluse saata nutivara ainult väljaandja loal (kohustuse/võla silt). Väljastaja väljendab oma nõusolekut, lisades tehingu ID oma konto olekusse:

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

Vahetage ainult teatud müntide vastu

Nutikas vara annab loa selle vahetamiseks ainult teatud müntide vastu. Näiteks ainult Bitcoinide vahetamise lubamiseks võite kasutada järgmist koodi:

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

Oraaklilt hinna järgi kauplemine

Nutikavara skriptis saate määrata loa kaubelda ainult usaldusväärse oraakli seisundis fikseeritud hinnaga. Siin on näide sellisest skriptist:

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
}

Siin seisame silmitsi ebaselge punktiga, kui kontrollime selle vara ID-d, millega kauplemine toimub. Asi on selles, et kui vara ID pole defineeritud, siis räägime LAINEST. Skriptis hoolitseme selle eest, et kauplemine toimuks paralleelselt WAVES-iga, täpselt sel viisil.

Fikseeritud hinnatõus

Nutivarale saab määrata fikseeritud hinna, mis etteantud proportsioonis samm-sammult tõuseb. Siin on näide vara skriptist, mille hind tõuseb 5% iga 1000 ploki järel:

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
}


Intervallkauplemine

Samuti saab tänu skriptile nutivaraga kauplemist piirata etteantud intervallidega. Siin on näide sellisest skriptist:

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

Skriptis veendume, et kauplemise algusest peale algusKõrgus mitte rohkem kui piirama intervallidega. Intervalli pikkus võrdub väljal määratud plokkide arvuga intervall.

Allikas: www.habr.com

Lisa kommentaar