Waves active inteligente: liste alb-negru, tranzacționare pe intervale

Waves active inteligente: liste alb-negru, tranzacționare pe intervale

În cele două articole precedente am vorbit despre conturile inteligente și despre cum pot fi utilizate pentru organizarea de licitații și crearea de programe de loialitateși, de asemenea, ajutor asigurarea transparenței instrumentelor financiare.

Acum vom analiza activele inteligente și mai multe cazuri de utilizare a acestora, inclusiv înghețarea activelor și crearea de restricții asupra tranzacțiilor la adresele specificate.

Waves Smart Assets permite utilizatorilor să suprapună scripturi pe active, urmând aceeași mecanică ca și Conturile inteligente. Fiecare nouă tranzacție creată folosind un activ inteligent va fi confirmată mai întâi de script și abia apoi de blockchain.

Merită remarcat următoarele diferențe între activele inteligente și conturile inteligente:

  1. În codul unui activ inteligent, este imposibil să se verifice dovezi (am vorbit despre ele în primul articol).
  2. În codul de cont inteligent, puteți verifica ExchangeTransaction numai dacă contul dvs. este un cont de potrivire. În caz contrar, se verifică doar comanda. În codul smart asset, nu puteți verifica direct comanda; puteți verifica ExchangeTransaction și, dacă este necesar, puteți prelua comanda de pe aceasta.
  3. Un activ inteligent, spre deosebire de un cont inteligent, nu are o stare, dar încă avem acces la stările contului din script.

Activele inteligente simplifică foarte mult scrierea contractelor, făcând implementarea multor cazuri concisă și elegantă.

Înghețarea activelor

Pentru a îngheța activele la o anumită înălțime a blocului targetHeight, puteți pur și simplu să setați această valoare în scriptul următorului element inteligent:

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

Condiție specifică pentru potrivire

Pentru a seta o anumită potrivire ca fiind cea dorită, îi puteți seta adresa ca expeditor într-un script de active inteligente care arată astfel:

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

„Lista albă” de destinatari

Pentru a permite ca tokenurile să fie trimise numai către anumite conturi - pentru a crea o „listă albă” de destinatari - puteți utiliza un activ inteligent cu următoarea schemă care verifică includerea în listă:

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
}

Din motive de securitate și caracterul complet demonstrat al limbajului, lista nu conține o implementare a iteratorului. Prin urmare, este definit ca un set de elemente concrete.

„Lista neagră” a destinatarilor

În mod similar, pentru a interzice trimiterea de jetoane către anumite conturi, puteți crea o „listă neagră”. În acest caz, este utilizat exact același activ inteligent, dar cu adresa verificată pentru a vă asigura că nu se află pe lista neagră:

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
}

Trimitere cu permisiunea emitentului

Folosind un activ inteligent, puteți seta și opțiunea de a trimite un activ inteligent numai cu permisiunea emitentului (etichetă de angajament/datorie). Emitentul își exprimă consimțământul prin plasarea ID-ului tranzacției în starea contului său:

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

Schimbați doar pentru anumite monede

Un activ inteligent permite permisiunea de a-l schimba numai pentru anumite monede. De exemplu, pentru a permite schimbul numai pentru Bitcoins, puteți utiliza următorul cod:

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

Tranzacționarea după preț de la oracol

În scriptul de active inteligente, puteți seta permisiunea de a tranzacționa numai la prețul fixat în starea unui oracol de încredere. Iată un exemplu de astfel de script:

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
}

Aici ne confruntăm cu un punct care nu este evident atunci când verificăm ID-ul activului cu care se tranzacționează. Ideea este că dacă ID-ul activului nu este definit, atunci vorbim despre WAVES. În script, ne asigurăm că tranzacționarea se desfășoară în tandem cu WAVES, exact în acest fel.

Creștere fixă ​​de preț

Puteți seta un preț fix pentru un activ inteligent, care va crește pas cu pas într-o anumită proporție. Iată un exemplu de script de active al cărui preț va crește cu 5% la fiecare 1000 de blocuri:

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
}


Tranzacționare pe intervale

De asemenea, datorită scriptului, tranzacționarea unui activ inteligent poate fi limitată la intervale predeterminate. Iată un exemplu de astfel de script:

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

În script ne asigurăm că de la începutul tranzacționării startHeight nu mai mult de limita intervale. Lungimea intervalului este egală cu numărul de blocuri specificat în câmp interval.

Sursa: www.habr.com

Adauga un comentariu