Išmaniųjų išteklių bangos: juodieji ir baltieji sąrašai, intervalinė prekyba

Išmaniųjų išteklių bangos: juodieji ir baltieji sąrašai, intervalinė prekyba

Ankstesniuose dviejuose straipsniuose kalbėjome apie išmaniąsias paskyras ir apie tai, kaip jomis naudotis aukcionams rengti ir lojalumo programoms kurtiir taip pat padėti užtikrinti finansinių priemonių skaidrumą.

Dabar apžvelgsime išmanųjį turtą ir kelis jo naudojimo atvejus, įskaitant turto įšaldymą ir operacijų apribojimų nustatymą nurodytais adresais.

„Waves Smart Assets“ leidžia vartotojams perdengti scenarijus ant išteklių, laikantis tos pačios mechanikos kaip ir išmaniosios paskyros. Kiekviena nauja operacija, sukurta naudojant išmanųjį turtą, pirmiausia bus patvirtinta scenarijaus, o tik tada blokų grandinės.

Verta atkreipti dėmesį į šiuos išmaniųjų išteklių ir išmaniųjų paskyrų skirtumus:

  1. Išmaniojo turto kode neįmanoma patikrinti įrodymų (apie juos kalbėjome pirmame straipsnyje).
  2. Išmaniosios paskyros kode galite patikrinti „ExchangeTransaction“, tik jei jūsų paskyra yra atitikimo paskyra. Kitu atveju tikrinamas tik užsakymas. Išmaniojo turto kode negalite tiesiogiai patikrinti pavedimo, galite patikrinti ExchangeTransaction ir, jei reikia, iš jo ištraukti pavedimą.
  3. Išmanusis turtas, skirtingai nei išmanioji paskyra, neturi būsenos, bet vis tiek turime prieigą prie paskyros būsenų iš scenarijaus.

Išmanieji turtai labai supaprastina sutarčių rašymą, todėl daugelio atvejų įgyvendinimas yra glaustas ir elegantiškas.

Turto įšaldymas

Įšaldyti turtą iki tam tikro bloko aukščio tikslinis aukštis, galite tiesiog nustatyti šią vertę šio išmaniojo turto scenarijuje:

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

Specifinė atitikmens sąlyga

Norėdami nustatyti konkretų atitikmenį kaip norimą, galite nustatyti jo adresą kaip siuntėjo išmaniojo turto scenarijuje, kuris atrodo taip:

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

"Baltasis sąrašas" gavėjų

Norėdami leisti žetonus siųsti tik į tam tikras paskyras – sukurti „baltąjį gavėjų sąrašą“ – galite naudoti išmanųjį turtą su tokia schema, kuri tikrina, ar jie įtraukti į sąrašą:

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
}

Dėl saugumo priežasčių ir įrodomo kalbos išsamumo sąraše nėra iteratoriaus diegimo. Todėl jis apibrėžiamas kaip betoninių elementų rinkinys.

„Juodasis sąrašas“ gavėjų

Panašiai, norėdami uždrausti siųsti žetonus į tam tikras paskyras, galite sukurti „juodąjį sąrašą“. Šiuo atveju naudojamas lygiai tas pats išmanusis išteklius, bet patikrinus adresą, kad įsitikintumėte, jog jo nėra juodajame sąraše:

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
}

Siuntimas su leidėjo leidimu

Naudodami išmanųjį turtą taip pat galite nustatyti parinktį siųsti išmanųjį turtą tik gavus išdavėjo leidimą (įsipareigojimo / skolos etiketė). Išdavėjas išreiškia savo sutikimą savo sąskaitos būsenoje įvesdamas operacijos ID:

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

Keiskite tik į tam tikras monetas

Išmanusis turtas suteikia leidimą jį keisti tik į tam tikras monetas. Pavyzdžiui, norėdami leisti keistis tik į Bitcoins, galite naudoti šį kodą:

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

Prekyba pagal kainą iš orakulo

Išmaniojo turto scenarijuje galite nustatyti leidimą prekiauti tik už kainą, fiksuotą patikimo orakulo būsenoje. Štai tokio scenarijaus pavyzdys:

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
}

Čia mes susiduriame su neakivaizdžiu momentu, kai tikriname turto, su kuriuo vykdoma prekyba, ID. Esmė ta, kad jei turto ID neapibrėžtas, tai mes kalbame apie BANGAS. Scenarijuje užtikriname, kad prekyba būtų vykdoma kartu su WAVES, būtent tokiu būdu.

Fiksuotas kainos padidėjimas

Galite nustatyti fiksuotą išmaniojo turto kainą, kuri palaipsniui didės tam tikra proporcija. Štai turto scenarijaus pavyzdys, kurio kaina padidės 5 % kas 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
}


Intervalinė prekyba

Be to, dėl scenarijaus prekyba išmaniuoju turtu gali būti apribota iš anksto nustatytais intervalais. Štai tokio scenarijaus pavyzdys:

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

Scenarijuje įsitikiname, kad nuo pat prekybos pradžios startHeight ne daugiau nei apriboti intervalais. Intervalo ilgis lygus lauke nurodytam blokų skaičiui intervalas.

Šaltinis: www.habr.com

Добавить комментарий