Waves slim bates: swart en wit lyste, interval handel

Waves slim bates: swart en wit lyste, interval handel

In die vorige twee artikels het ons gepraat oor slim rekeninge en hoe dit gebruik kan word vir die hou van veilings en die skep van lojaliteitsprogrammeen ook help verseker deursigtigheid van finansiële instrumente.

Nou sal ons kyk na slim bates en verskeie gevalle van hul gebruik, insluitend die vries van bates en die skep van beperkings op transaksies by gespesifiseerde adresse.

Waves Smart Assets laat gebruikers toe om skrifte op bates te oorlê, volgens dieselfde meganika as Smart Accounts. Elke nuwe transaksie wat met 'n slim bate geskep word, sal eers deur die skrif bevestig word, en eers dan deur die blokketting.

Dit is die moeite werd om te let op die volgende verskille tussen slim bates en slim rekeninge:

  1. In die kode van 'n slim bate is dit onmoontlik om bewyse na te gaan (ons het daaroor gepraat in die eerste artikel).
  2. In die slim rekeningkode kan u ExchangeTransaction slegs nagaan as u rekening 'n bypassende rekening is. Andersins word slegs die bestelling nagegaan. In die slimbatekode kan jy nie die bestelling direk nagaan nie; jy kan die ExchangeTransaction nagaan en, indien nodig, 'n bestelling daaruit onttrek.
  3. 'n Slim bate, anders as 'n slim rekening, het nie 'n staat nie, maar ons het steeds toegang tot rekeningstate vanaf die skrif.

Slim bates vereenvoudig die skryf van kontrakte aansienlik, wat die implementering van baie gevalle bondig en elegant maak.

Bate vries

Om bates tot 'n sekere blokhoogte te vries teikenhoogte, kan jy eenvoudig hierdie waarde in die skrif van die volgende slim bate stel:

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

Matcher Spesifieke Toestand

Om 'n spesifieke pasmaat as die verlangde een te stel, kan jy sy adres as die sender in 'n slim bate-skrip stel wat soos volg lyk:

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

"Witlys" van ontvangers

Om toe te laat dat tokens slegs na sekere rekeninge gestuur word - om 'n "wit lys" van ontvangers te skep - kan jy 'n slim bate gebruik met die volgende skema wat kontroleer vir insluiting in die lys:

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
}

Vir sekuriteitsredes en bewysbare volledigheid van die taal, bevat die lys nie 'n iterator-implementering nie. Daarom word dit gedefinieer as 'n stel konkrete elemente.

"Swart lys" van ontvangers

Net so, om die stuur van tekens na sekere rekeninge te verbied, kan jy 'n "swart lys" skep. In hierdie geval word presies dieselfde slim bate gebruik, maar met die adres gemerk om te verseker dat dit nie op die swartlys is nie:

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
}

Stuur met toestemming van die uitreiker

Deur 'n slim bate te gebruik, kan jy ook die opsie stel om 'n slim bate slegs met die toestemming van die uitreiker te stuur (verbintenis/skuldetiket). Die uitreiker spreek sy toestemming uit deur die transaksie-ID in die staat van sy rekening te plaas:

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

Ruil slegs vir sekere munte

'n Slim bate laat toestemming toe om dit slegs vir sekere munte te ruil. Byvoorbeeld, om slegs ruil vir Bitcoins toe te laat, kan jy die volgende kode gebruik:

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

Handel volgens prys vanaf die orakel

In die slim bate script kan jy toestemming stel om slegs te handel teen die prys wat vasgestel is in die toestand van 'n betroubare orakel. Hier is 'n voorbeeld van so 'n skrif:

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
}

Hier word ons gekonfronteer met 'n nie-vanselfsprekende punt wanneer die ID van die bate waarmee verhandel word, gekontroleer word. Die punt is dat as die bate-ID nie gedefinieer is nie, dan praat ons van GOLWE. In die skrif maak ons ​​seker dat handel in tandem met WAVES uitgevoer word, presies op hierdie manier.

Vaste prysverhoging

Jy kan 'n vaste prys vir 'n slim bate stel, wat stap vir stap in 'n gegewe verhouding sal styg. Hier is 'n voorbeeld van 'n bate script waarvan die prys elke 5 blokke met 1000% sal styg:

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
}


Interval handel

Ook, danksy die skrif, kan die verhandeling van 'n slim bate beperk word tot voorafbepaalde intervalle. Hier is 'n voorbeeld van so 'n skrif:

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

In die skrif maak ons ​​seker dat vanaf die begin van die handel beginHoogte nie meer as beperk intervalle. Die lengte van die interval is gelyk aan die aantal blokke wat in die veld gespesifiseer is interval.

Bron: will.com

Voeg 'n opmerking