Waves Smart Verméigen: Blacklists a Whitelists, Intervallhandel

Waves Smart Verméigen: Blacklists a Whitelists, Intervallhandel

An den zwee virdrun Artikelen hu mir iwwer Smart Konten geschwat a wéi se kënne benotzt ginn. fir Auktioun ze halen an Loyalitéit Programmer ze kreéierenan och hëllefen garantéieren Transparenz vu Finanzinstrumenter.

Elo wäerte mir Smart Verméigen a verschidde Benotzungsfäll fir si kucken, dorënner Afréiere Verméigen a Restriktiounen op Transaktiounen op bestëmmten Adressen erstellen.

Waves Smart Assets erlaben d'Benotzer Verméigen ze schreiwen, no der selwechter Mechanik wéi Smart Konten. All nei Transaktioun erstallt mat engem Smart Asset gëtt als éischt vum Skript bestätegt, an nëmmen dann duerch de Blockchain.

Et ass derwäert déi folgend Differenzen tëscht Smart Verméigen a Smart Konten ze notéieren:

  1. Am Code vun engem Smart Asset ass et onméiglech Beweiser ze kontrolléieren (mir hunn iwwer si geschwat am éischten Artikel).
  2. Am Smart Kont Code kënnt Dir ExchangeTransaction nëmmen kontrolléieren wann Äre Kont e Matcher Kont ass. Soss gëtt nëmmen d'Bestellung iwwerpréift. Am Smart Asset Code kënnt Dir d'Bestellung net direkt iwwerpréiwen, Dir kënnt d'Austauschtransaktioun iwwerpréiwen, an d'Bestellung dovun extrahéieren wann néideg.
  3. E Smart Verméigen, am Géigesaz zu engem Smart Kont, huet kee Staat, awer mir hunn nach ëmmer Zougang zu de Kontstate vum Skript.

Smart Verméigen vereinfachen immens d'Schreiwe vu Kontrakter, sou datt d'Ëmsetzung vu ville Fäll präzis an elegant mécht.

Asset afréieren

Fir Verméigen bis zu enger bestëmmter Spär Héicht afréieren Zil Héicht, Dir kënnt dëse Wäert einfach am Skript vum folgende Smart Asset setzen:

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

Spezifesch Matcher Conditioun

Fir e spezifesche Matcher als de gewënschtenen ze setzen, kënnt Dir seng Adress als Sender an engem Smart Asset Skript wéi dëst setzen:

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

"Wäiss Lëscht" vun Empfänger

Fir Tokens nëmmen op bestëmmte Konten ze schécken - fir eng "wäiss Lëscht" vun Empfänger ze kreéieren - kënnt Dir e Smart Asset mat dem folgende Schema benotzen, deen d'Inklusioun an der Lëscht kontrolléiert:

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
}

Aus Sécherheetsgrënn a beweisbarer Sproochfinalitéit enthält d'Lëscht keng Iterator-Implementatioun. Dofir gëtt et als Set vu konkreten Elementer spezifizéiert.

"Schwaarz Lëscht" vun Empfänger

Ähnlech, fir Tokens op bestëmmte Konten ze schécken, kënnt Dir eng "schwaarz Lëscht" erstellen. An dësem Fall gëtt absolut deeselwechte Smart Asset benotzt, awer mat der Iwwerpréiwung vun der Adress fir d'Feele vun enger schwaarzer Lëscht:

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
}

Schéckt mat der Erlaabnis vum Emittent

Mat engem Smart Asset kënnt Dir och d'Optioun setzen fir e Smart Asset nëmmen mat der Erlaabnes vum Emittent ze schécken (Engagement / Scholdlabel). Den Emittent dréckt seng Zoustëmmung aus andeems hien d'Transaktiouns-ID am Staat vu sengem Kont postt:

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

Austausch nëmme fir bestëmmte Mënzen

E Smart Asset erlaabt d'Erlaabnis et nëmme fir bestëmmte Mënzen auszetauschen. Zum Beispill, fir den Austausch nëmme fir Bitcoins z'erméiglechen, kënnt Dir de folgende Code benotzen:

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

Handel mam Präis vum Orakel

Am Smart Asset Skript kënnt Dir d'Erlaabnis setzen fir ze handelen nëmmen zum Präis fixéiert am Staat vun engem zouverléissege Orakel. Hei ass e Beispill vun esou engem 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
}

Hei si mir mat engem net offensichtleche Punkt konfrontéiert wann Dir d'ID vum Verméigen iwwerpréift, deen gehandelt gëtt. De Fakt ass datt wann d'Asset ID net definéiert ass, da schwätze mir iwwer WAVES. Am Skript suerge mir fir datt den Handel an Tandem mat WAVES duerchgefouert gëtt, op dës Manéier.

Fixe Präiserhéijung

Dir kënnt e fixe Präis fir e Smart Verméigen setzen, dee Schrëtt fir Schrëtt an engem bestëmmten Undeel eropgeet. Hei ass e Beispill vun engem Asset Skript dat säi Präis ëm 5% all 1000 Block erhéicht:

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
}


Intervall Handel

Och, dank dem Skript, kann Smart Asset Trading op virbestëmmten Intervalle limitéiert ginn. Hei ass e Beispill vun esou engem Skript:

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

Am Skript suerge mir fir datt vum Ufank vum Handel Start Héicht passéiert net méi wéi limitéiert Intervalle. D'Längt vum Intervall ass gläich wéi d'Zuel vun de Blocks, déi am Feld spezifizéiert sinn Tëschenzäit.

Source: will.com

Setzt e Commentaire