Бранови паметни средства: црно-бели списоци, интервално тргување

Бранови паметни средства: црно-бели списоци, интервално тргување

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

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

Waves Smart Assets им овозможува на корисниците да ги преклопуваат скриптите на средствата, следејќи ја истата механика како и Smart Accounts. Секоја нова трансакција создадена со помош на паметно средство ќе биде потврдена прво од скриптата, а дури потоа од блокчејнот.

Вреди да се забележат следните разлики помеѓу паметните средства и паметните сметки:

  1. Во кодот на паметно средство, невозможно е да се проверат доказите (зборувавме за нив во првата статија).
  2. Во кодот за паметна сметка, можете да го проверите ExchangeTransaction само ако вашата сметка е сметка за совпаѓање. Во спротивно, се проверува само нарачката. Во кодот за паметно средство, не можете директно да ја проверите нарачката; можете да ја проверите ExchangeTransaction и, доколку е потребно, да извлечете нарачка од неа.
  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
}

Испраќање со дозвола на издавачот

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

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
}

Овде се соочуваме со неочигледна точка при проверка на ID на средството со кое се врши тргување. Поентата е дека ако ID на средството не е дефинирано, тогаш зборуваме за WAVES. Во сценариото, ние се грижиме дека тргувањето се врши во тандем со WAVES, токму на овој начин.

Фиксно зголемување на цената

Можете да поставите фиксна цена за паметно средство, кое ќе се зголемува чекор по чекор во дадена пропорција. Еве пример за скрипта за средства чија цена ќе се зголемува за 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
}

Во сценариото се уверуваме дека од почетокот на тргувањето почетна висина не повеќе од ограничи интервали. Должината на интервалот е еднаква на бројот на блокови наведени во полето интервал.

Извор: www.habr.com

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