Wavesi nutikad varad: „mustad“ ja „valged“ nimekirjad, intervallikaubandus

Wavesi nutikad varad: „mustad“ ja „valged“ nimekirjad, intervallikaubandus

Kahes eelmises artiklis rÀÀkisime nutiakontodest ja sellest, kuidas neid saab kasutada oksjonite korraldamiseks ja lojaalsusprogrammide loomiseks, samuti aitavad need tagada finantsinstrumentide lÀbipaistvust.

Praegu vaatame nutikad varad ja mitmeid nende rakendamise juhtumeid, sealhulgas varade kĂŒlmutamist ja transaktsioonide piirangute seadmist mÀÀratud aadressidele.

Wavesi nutikad varad vÔimaldavad kasutajatel varadele skripte rakendada, jÀrgides sama mehhanismi nagu nutikontode puhul. Iga uus tehing, mis luuakse nutika vara abil, kinnitatakse esmalt skripti ja seejÀrel plokiahela poolt.

MÀrkimist vÀÀrivad jÀrgmised erinevused nutikate varade ja nutikontode vahel:

  1. Nutika vara koodis ei saa tÔendite kontrolli teostada (millest rÀÀkisime esimeses artiklis).
  2. Nutika konto koodis saab kontrollida ExchangeTransaction'i ainult siis, kui teie konto on vastendava konto tĂŒĂŒp. Vastasel juhul kontrollitakse ainult tellimust. Nutikate varade koodis ei saa tellimust otse kontrollida, kuid saab kontrollida ExchangeTransaction'i ning vajadusel sealt tellimust vĂ€lja vĂ”tta.
  3. Nutikatel varadel, erinevalt nutikast kontost, ei ole olekut, kuid meil on siiski juurdepÀÀs kontode olekutele skriptist.

Nutikad varad lihtsustavad lepingute loomist oluliselt, muutes paljude juhtumite rakendamise lakooniliseks ja elegantseks.

Varade kĂŒlmutamine

Varade kĂŒlmutamiseks kindla ploki kĂ”rgusel targetHeight, saab selle vÀÀrtuse lihtsalt skriptis jĂ€rgmise nutika vara jaoks mÀÀrata:

let targetHeight = 1500000
height >= targetHeight

height - funktsioon keeles, mis tagastab hetke kÔrguse.

Konkreetse vastendi tingimus

Soovitud spetsiifilise vastendi mÀÀramiseks saate mÀÀrata selle aadressi saatjana skriptis jÀrgmisel kujul:

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

„Valge nimekiri“ vastuvĂ”tjate jaoks

Kuna lubada tokenite saatmist ainult teatud kontodele — luua «valge nimekiri» saajatele — saate kasutada nutitaimi jĂ€rgmise skeemiga, mis kontrollib nimekirja kuuluvust:

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
}

Turvalisuse ja tÔestatava lÔpetatuse eesmÀrgil ei sisalda nimekiri iteratsiooni rakendust. SeetÔttu on see mÀÀratud kindlate elementide kogumina.

«Must nimekiri» saajatele

Sama tÔhusalt, et keelata tokenite saatmine teatud kontodele, saate luua «mustade nimekirjade». Selle jaoks kasutatakse tÀpselt sama nutitaime, kuid aadressi kontrollimisega, et see ei oleks 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 emitendi loal

Nutitelefoni kasutamine vÔimaldab ka seada nutitelefoni saatmise valiku ainult emitendi loal (kohustuse/velle mÀrge). Emitent vÀljendab oma nÔusolekut, paigutades tehingu ID oma konto staatusesse:

match tx {
  case t : TransferTransaction =>
    let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
    #veenduge, et emitendi olekus oleks praeguse tehingu ID
    isDefined(getInteger(issuer, toBase58String(t.id)))
  case _ => false
}

Vahetus ainult teatud mĂŒntide vastu

Nutitelefon vĂ”imaldab lubada vahetada seda ainult teatud mĂŒntide vastu. NĂ€iteks, et lubada vahetust ainult bitcoinide vastu, 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
}

Kaubandus orakli hinnaga

Nutitelefoni skripti saab seadistada lubama kaubelda ainult orakli staatustes fikseeritud hinnaga. Siin on nÀide sellisest skriptist:

let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
 
match tx {
  #keelame vara ĂŒlekande
  case t: TransferTransaction | MassTransferTransaction => false
  case e: ExchangeTransaction =>
    #kontrollime, et kauplemine toimub orakli olekus mÀÀratud hinnaga selle vara jaoks
    let correctPrice = e.price == extract(getInteger(oracle, assetId))
    #kontrollime, et kauplemine toimub WAVES'i vastu
    let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset) 
correctPrice && correctPriceAsset
  case _ => true
}

Siin kohtame ebaselget hetke vara ID kontrollimisel, millega kaubeldakse. Asi on selles, et kui vara ID pole mÀÀratletud, tÀhendab see, et tegemist on WAVES'iga. Skriptis veendume, et kauplemine toimub WAVES'iga, just nii.

Fikseeritud hinnatÔus

Saame seada nutivara fikseeritud hinna, mis tÔuseb jÀrk-jÀrgult mÀÀratud osas. 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
# kui palju protsentides hind ĂŒhe sammu jooksul tĂ”useb
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
}


Intervalliline kauplemine

Samuti vÔimaldab skript piirata nutiressursiga kauplemist etteantud intervallide abil. Siin on sellise skripti nÀide:

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

Skriptis veendume, et alates kauplemise algusest startHeight on möödunud mitte rohkem kui limit intervalle. Intervalli pikkus on vÔrdne plokkide kogustega, mis on mÀÀratud vÀljal interval.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster