Waves byen entelijan: lis nwa ak blan, komès entèval

Waves byen entelijan: lis nwa ak blan, komès entèval

Nan de atik anvan yo nou te pale sou kont entelijan ak fason yo ka itilize pou fè vann piblik ak kreye pwogram lwayoteepi tou ede asire transparans nan enstriman finansye yo.

Koulye a, nou pral gade byen entelijan ak plizyè ka itilizasyon yo, ki gen ladan konjelasyon byen ak kreye restriksyon sou tranzaksyon nan adrès espesifye.

Waves Smart Assets pèmèt itilizatè yo kouvri scripts sou byen yo, swiv menm mekanik ak Smart Accounts. Chak nouvo tranzaksyon kreye lè l sèvi avèk yon avantaj entelijan pral konfime premye pa script la, epi sèlman Lè sa a, pa blockchain la.

Li vo sonje diferans sa yo ant byen entelijan ak kont entelijan:

  1. Nan kòd la nan yon avantaj entelijan, li enposib tcheke prèv (nou te pale sou yo nan premye atik la).
  2. Nan kòd kont entelijan an, ou ka tcheke ExchangeTransaction sèlman si kont ou a se yon kont matcher. Sinon, se sèlman lòd la tcheke. Nan kòd avantaj entelijan an, ou pa ka tcheke lòd la dirèkteman; ou ka tcheke Echanj Tranzaksyon an, epi, si sa nesesè, rekipere lòd la nan li.
  3. Yon avantaj entelijan, kontrèman ak yon kont entelijan, pa gen yon eta, men nou toujou gen aksè a eta kont nan script la.

Byen entelijan anpil senplifye ekri nan kontra yo, fè aplikasyon an nan anpil ka kout ak elegant.

Byen friz

Pou friz byen nan yon wotè blòk sèten targetHeight, ou ka tou senpleman mete valè sa a nan script avantaj entelijan sa a:

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

Kondisyon Espesifik Matcher

Pou mete yon matche espesifik kòm youn vle a, ou ka mete adrès li kòm moun k la nan yon script avantaj entelijan ki sanble sa a:

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

"Lis blan" moun k ap resevwa yo

Pou pèmèt marqueur yo dwe voye sèlman nan sèten kont - pou kreye yon "lis blan" nan benefisyè - ou ka itilize yon avantaj entelijan ak konplo sa a ki tcheke pou enklizyon nan lis la:

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
}

Pou rezon sekirite ak konplè langaj pwouve, lis la pa genyen yon aplikasyon iteratè. Se poutèt sa li defini kòm yon seri eleman konkrè.

"Lis nwa" moun k ap resevwa yo

Menm jan an tou, pou entèdi voye jeton nan sèten kont, ou ka kreye yon "lis nwa". Nan ka sa a, yo itilize egzakteman menm avantaj entelijan, men adrès la tcheke pou asire li pa sou lis nwa a:

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
}

Voye ak pèmisyon konpayi an

Sèvi ak yon avantaj entelijan, ou kapab tou mete opsyon pou voye yon avantaj entelijan sèlman avèk pèmisyon konpayi an. (etikèt angajman/dèt). Emetteur a eksprime konsantman li lè li mete ID tranzaksyon an nan eta kont li:

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

Echanj sèlman pou kèk pyès monnen

Yon avantaj entelijan pèmèt pèmisyon pou chanje li sèlman pou sèten pyès monnen. Pou egzanp, pou pèmèt sèlman echanj pou Bitcoins, ou ta ka itilize kòd sa a:

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

Komès pa pri soti nan Oracle la

Nan script avantaj entelijan an, ou ka mete pèmisyon nan komès sèlman nan pri a fiks nan eta a nan yon Oracle serye. Men yon egzanp yon script konsa:

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
}

Isit la nou ap fè fas ak yon pwen ki pa evidan lè tcheke ID nan avantaj la ak ki komès yo te pote soti. Pwen an se ke si ID a byen pa defini, Lè sa a, nou ap pale sou WAVES. Nan script la, nou asire w ke komès fèt an tandem ak WAVES, egzakteman nan fason sa a.

Ogmantasyon pri fiks

Ou ka mete yon pri fiks pou yon avantaj entelijan, ki pral ogmante etap pa etap nan yon pwopòsyon bay yo. Isit la se yon egzanp yon script avantaj ki gen pri a ap ogmante pa 5% chak 1000 blòk:

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
}


Komès entèval

Epitou, gras a script la, komès nan yon avantaj entelijan ka limite a entèval Predetermined. Men yon egzanp yon script konsa:

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

Nan script la nou asire w ke depi nan kòmansman an nan komès startHeight pa plis pase limite entèval. Longè entèval la egal a kantite blòk espesifye nan jaden an entèval.

Sous: www.habr.com

Add nouvo kòmantè