Паметна средства таласа: црне и беле листе, интервално трговање

Паметна средства таласа: црне и беле листе, интервално трговање

У претходна два чланка смо говорили о паметним налозима и како се они могу користити за одржавање аукција и креирање програма лојалностиа такође и помоћ обезбедити транспарентност финансијских инструмената.

Сада ћемо погледати паметна средства и неколико случајева њихове употребе, укључујући замрзавање средстава и стварање ограничења за трансакције на одређеним адресама.

Паметна средства Вавес-а омогућавају корисницима да преклопе скрипте на средства, пратећи исту механику као паметни налози. Сваку нову трансакцију креирану помоћу паметног средства прво ће потврдити скрипта, а тек онда блок ланац.

Вреди напоменути следеће разлике између паметних средстава и паметних налога:

  1. У коду паметне имовине немогуће је проверити доказе (причали смо о њима у првом чланку).
  2. У коду паметног налога можете да проверите ЕкцхангеТрансацтион само ако је ваш налог налог за подударање. У супротном, проверава се само редослед. У коду паметног средства, не можете директно да проверите налог; можете да проверите ЕкцхангеТрансацтион и, ако је потребно, издвојите налог из њега.
  3. Паметно средство, за разлику од паметног налога, нема стање, али ми и даље имамо приступ стањима налога из скрипте.

Паметна средства у великој мери поједностављују писање уговора, чинећи имплементацију многих случајева концизном и елегантном.

Замрзавање имовине

За замрзавање средстава на одређену висину блока таргетХеигхт, можете једноставно поставити ову вредност у скрипту следећег паметног средства:

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

Специфични услови за меч

Да бисте поставили одређено подударање као жељено, можете поставити његову адресу као пошиљаоца у скрипти паметног средства која изгледа овако:

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

„Бела листа“ прималаца

Да бисте дозволили слање токена само на одређене налоге – да бисте направили „белу листу“ прималаца – можете користити паметно средство са следећом шемом која проверава да ли је укључена у листу:

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
}

Из безбедносних разлога и доказиве комплетности језика, листа не садржи имплементацију итератора. Стога се дефинише као скуп бетонских елемената.

„Црна листа“ прималаца

Слично томе, да бисте забранили слање токена на одређене налоге, можете креирати „црну листу“. У овом случају се користи потпуно исто паметно средство, али са провереном адресом да би се осигурало да није на црној листи:

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
}

Слање уз дозволу издаваоца

Користећи паметно средство, такође можете подесити опцију слања паметног средства само уз дозволу издаваоца (ознака обавеза/дуга). Издавалац изражава своју сагласност тако што ставља ИД трансакције у стање свог рачуна:

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

Замена само за одређене новчиће

Паметна имовина дозвољава дозволу да се размени само за одређене новчиће. На пример, да бисте дозволили размену само за биткоине, можете користити следећи код:

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

Трговање по цени од пророчишта

У скрипти паметне имовине можете подесити дозволу за трговину само по цени која је фиксна у стању поузданог пророчанства. Ево примера такве скрипте:

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
}

Овде се суочавамо са неочигледном тачком приликом провере ИД-а средства са којим се тргује. Поента је да ако ИД средства није дефинисан, онда говоримо о ТАЛАСИМА. У скрипти се старамо да се трговање одвија у тандему са ВАВЕС-ом, управо на овај начин.

Фиксно повећање цене

Можете поставити фиксну цену за паметно средство, које ће се повећавати корак по корак у датој пропорцији. Ево примера скрипте средства чија ће цена порасти за 5% на сваких 1000 блокова:

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
}


Интервално трговање

Такође, захваљујући скрипти, трговање паметном имовином може бити ограничено на унапред одређене интервале. Ево примера такве скрипте:

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

У скрипти то водимо рачуна од почетка трговања стартХеигхт не више од ограничити интервалима. Дужина интервала је једнака броју блокова наведених у пољу интервал.

Извор: ввв.хабр.цом

Додај коментар