Viļņi viedie aktīvi: melnie un baltie saraksti, intervālu tirdzniecība

Viļņi viedie aktīvi: melnie un baltie saraksti, intervālu tirdzniecība

Iepriekšējos divos rakstos mēs runājām par viedkontiem un to izmantošanu izsoļu rīkošanai un lojalitātes programmu izveideiun arī palīdzēt nodrošināt finanšu instrumentu caurskatāmību.

Tagad apskatīsim viedos līdzekļus un vairākus to izmantošanas gadījumus, tostarp līdzekļu iesaldēšanu un darījumu ierobežojumu radīšanu noteiktās adresēs.

Waves Smart Assets ļauj lietotājiem pārklāt skriptus uz līdzekļiem, ievērojot tos pašus mehānismus kā viedie konti. Katru jaunu darījumu, kas izveidots, izmantojot viedo līdzekli, vispirms apstiprinās skripts un tikai pēc tam blokķēde.

Ir vērts atzīmēt šādas atšķirības starp viedajiem līdzekļiem un viedkontiem:

  1. Viedā līdzekļa kodā nav iespējams pārbaudīt pierādījumus (mēs par tiem runājām pirmajā rakstā).
  2. Viedā konta kodā varat pārbaudīt ExchangeTransaction tikai tad, ja jūsu konts ir atbilstības konts. Pretējā gadījumā tiek pārbaudīts tikai pasūtījums. Viedā īpašuma kodā pasūtījumu nevar pārbaudīt tieši, var pārbaudīt ExchangeTransaction un, ja nepieciešams, no tā izvilkt pasūtījumu.
  3. Viedajam īpašumam atšķirībā no viedkonta nav statusa, taču mums joprojām ir piekļuve konta stāvokļiem no skripta.

Viedie līdzekļi ievērojami vienkāršo līgumu rakstīšanu, padarot daudzu gadījumu ieviešanu kodolīgu un elegantu.

Līdzekļu iesaldēšana

Iesaldēt līdzekļus līdz noteiktam bloka augstumam mērķa Augstums, varat vienkārši iestatīt šo vērtību šāda viedlīdzekļa skriptā:

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

Īpašais atbilstības nosacījums

Lai iestatītu konkrētu atbilstošo kā vēlamo, varat iestatīt tā adresi kā sūtītāju viedā līdzekļa skriptā, kas izskatās šādi:

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

adresātu "baltais saraksts".

Lai atļautu žetonu sūtīšanu tikai uz noteiktiem kontiem – lai izveidotu adresātu “balto sarakstu”, varat izmantot viedo līdzekli ar šādu shēmu, kas pārbauda iekļaušanu sarakstā:

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
}

Drošības apsvērumu dēļ un pierādāma valodas pilnīguma dēļ sarakstā nav iteratora ieviešanas. Tāpēc tas tiek definēts kā betona elementu kopums.

Saņēmēju "melnais saraksts".

Tāpat, lai aizliegtu žetonu sūtīšanu uz noteiktiem kontiem, varat izveidot “melno sarakstu”. Šajā gadījumā tiek izmantots tieši tas pats viedais līdzeklis, bet ar pārbaudītu adresi, lai pārliecinātos, ka tas nav iekļauts melnajā sarakstā:

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
}

Nosūtīšana ar izdevēja atļauju

Izmantojot viedo līdzekli, varat arī iestatīt iespēju nosūtīt viedo līdzekli tikai ar izdevēja atļauju (saistību/parāda etiķete). Izdevējs izsaka savu piekrišanu, ievietojot darījuma ID sava konta stāvoklī:

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

Mainiet tikai pret noteiktām monētām

Viedais īpašums ļauj to apmainīt tikai pret noteiktām monētām. Piemēram, lai atļautu apmaiņu tikai ar Bitcoin, varat izmantot šādu kodu:

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

Tirdzniecība pēc cenas no orākula

Viedā aktīvu skriptā varat iestatīt atļauju tirgoties tikai par cenu, kas fiksēta uzticama orākula stāvoklī. Šeit ir šāda skripta piemērs:

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
}

Šeit mēs saskaramies ar nepārprotamu punktu, pārbaudot tā aktīva ID, ar kuru tiek veikta tirdzniecība. Lieta tāda, ka, ja aktīva ID nav definēts, tad runa ir par VIĻŅIEM. Skriptā mēs pārliecināmies, ka tirdzniecība notiek tandēmā ar WAVES, tieši šādā veidā.

Fiksēts cenu pieaugums

Viedajam aktīvam var iestatīt fiksētu cenu, kas soli pa solim pieaugs noteiktā proporcijā. Šeit ir tāda īpašuma skripta piemērs, kura cena pieaugs par 5% katriem 1000 blokiem:

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
}


Intervāla tirdzniecība

Turklāt, pateicoties skriptam, viedo aktīvu tirdzniecību var ierobežot līdz iepriekš noteiktiem intervāliem. Šeit ir šāda skripta piemērs:

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

Skriptā mēs pārliecināmies, ka no tirdzniecības sākuma startHeight ne vairāk kā ierobežot intervāli. Intervāla garums ir vienāds ar laukā norādīto bloku skaitu intervāls.

Avots: www.habr.com

Pievieno komentāru