Waves smart assets: swarte en wite listen, yntervalhannel

Waves smart assets: swarte en wite listen, yntervalhannel

Yn 'e foarige twa artikels hawwe wy praat oer tûke akkounts en hoe't se kinne wurde brûkt foar it hâlden fan feilingen en it meitsjen fan loyaliteitsprogramma'sen ek helpe soargje foar transparânsje fan finansjele ynstruminten.

No sille wy sjogge nei tûke aktiva en ferskate gefallen fan har gebrûk, ynklusyf it befriezen fan aktiva en it meitsjen fan beheiningen op transaksjes op spesifisearre adressen.

Waves Smart Assets kinne brûkers skripts op aktiva oerlaapje, neffens deselde meganika as Smart Accounts. Elke nije transaksje makke mei in tûke asset sil earst wurde befêstige troch it skript, en allinich dan troch de blockchain.

It is de muoite wurdich op te merken de folgjende ferskillen tusken tûke aktiva en tûke akkounts:

  1. Yn 'e koade fan in tûke asset is it ûnmooglik om bewiis te kontrolearjen (wy hawwe oer har praat yn it earste artikel).
  2. Yn 'e tûke akkountkoade kinne jo ExchangeTransaction allinich kontrolearje as jo akkount in matcher-akkount is. Oars wurdt allinnich de oarder kontrolearre. Yn 'e tûke assetkoade kinne jo de bestelling net direkt kontrolearje; jo kinne de ExchangeTransaction kontrolearje, en, as nedich, in bestelling derút ekstrahearje.
  3. In tûke asset, yn tsjinstelling ta in tûk akkount, hat gjin steat, mar wy hawwe noch tagong ta akkount steaten út it skript.

Tûke aktiva ferienfâldigje it skriuwen fan kontrakten sterk, wêrtroch de ymplemintaasje fan in protte gefallen bondich en elegant is.

Asset freeze

Om aktiva te befriezen nei in bepaalde blokhichte targetHeight, kinne jo dizze wearde gewoan ynstelle yn it skript fan 'e folgjende smart asset:

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

Matcher Spesifike Betingst

Om in spesifike matcher yn te stellen as de winske, kinne jo it adres ynstelle as de stjoerder yn in tûk assetskript dat der sa útsjocht:

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

"Wite list" fan ûntfangers

Om tokens allinich nei bepaalde akkounts te stjoeren - om in "wite list" fan ûntfangers te meitsjen - kinne jo in tûke asset brûke mei it folgjende skema dat kontrolearret foar opname yn 'e 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
}

Om feiligensredenen en bewiisbere folsleinens fan 'e taal befettet de list gjin ymplemintaasje fan iterator. Dêrom wurdt it definiearre as in set fan konkrete eleminten.

"Swarte list" fan ûntfangers

Lykas, om it ferstjoeren fan tokens nei bepaalde akkounts te ferbieden, kinne jo in "swarte list" oanmeitsje. Yn dit gefal wurdt krekt deselde tûke asset brûkt, mar mei it adres kontrolearre om te soargjen dat it net op 'e swarte list stiet:

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
}

Ferstjoere mei tastimming fan de útjouwer

Mei it brûken fan in smart asset kinne jo ek de opsje ynstelle om in smart asset allinich te stjoeren mei de tastimming fan 'e útjouwer (ferplichting / skuldlabel). De útjouwer drukt syn ynstimming út troch de transaksje-ID te pleatsen yn 'e steat fan syn akkount:

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

Ruilje allinich foar bepaalde munten

In tûke asset jout tastimming om it allinich te wikseljen foar bepaalde munten. Bygelyks, om allinich útwikseling foar Bitcoins ta te stean, kinne jo de folgjende koade brûke:

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

Hannelje troch priis fan it orakel

Yn it smart asset-skript kinne jo tastimming ynstelle om allinich te hanneljen tsjin 'e priis fêststeld yn' e steat fan in betrouber orakel. Hjir is in foarbyld fan sa'n skript:

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
}

Hjir wurde wy konfrontearre mei in net-foar de hân lizzende punt by it kontrolearjen fan de ID fan 'e asset wêrmei hannel wurdt útfierd. It punt is dat as de asset ID net definiearre is, dan prate wy oer WAVES. Yn it skript soargje wy derfoar dat hannel wurdt útfierd yn tandem mei WAVES, krekt op dizze manier.

Fêste priisferheging

Jo kinne in fêste priis ynstelle foar in tûke asset, dy't stap foar stap sil tanimme yn in opjûne ferhâlding. Hjir is in foarbyld fan in assetskript wêrfan de priis elke 5 blokken mei 1000% sil tanimme:

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
}


Ynterval trading

Ek, tank oan it skript, kin hannel fan in tûke asset wurde beheind ta foarbepaalde yntervallen. Hjir is in foarbyld fan sa'n skript:

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

Yn it skript soargje wy derfoar dat fan it begjin fan hannel startHeight net mear as limyt yntervallen. De lingte fan it ynterval is lyk oan it oantal blokken spesifisearre yn it fjild tuskenskoft.

Boarne: www.habr.com

Add a comment