Waves snjalleignir: svartir og hvítir listar, milliviðskipti

Waves snjalleignir: svartir og hvítir listar, milliviðskipti

Í fyrri tveimur greinum ræddum við um snjalla reikninga og hvernig hægt er að nota þá fyrir að halda uppboð og búa til vildarkerfiog líka aðstoð tryggja gagnsæi fjármálagerninga.

Nú munum við skoða snjalleignir og nokkur tilvik um notkun þeirra, þar á meðal að frysta eignir og búa til takmarkanir á viðskiptum á tilgreindum heimilisföngum.

Waves Smart Assets gerir notendum kleift að leggja yfir forskriftir á eignir, eftir sömu aflfræði og Smart Accounts. Hver ný viðskipti sem búin eru til með snjalleign verða fyrst staðfest af handritinu og aðeins síðan af blockchain.

Vert er að taka eftir eftirfarandi mun á snjalleignum og snjallreikningum:

  1. Í kóða snjalleignar er ómögulegt að athuga sannanir (við ræddum um þær í fyrstu greininni).
  2. Í snjallreikningskóðanum geturðu aðeins athugað ExchangeTransaction ef reikningurinn þinn er samsvarandi reikningur. Annars er aðeins pöntunin hakað. Í snjalleignakóðanum geturðu ekki athugað pöntunina beint; þú getur athugað ExchangeTransaction og, ef nauðsyn krefur, sótt pöntunina úr henni.
  3. Snjalleign, ólíkt snjallreikningi, hefur ekki ástand, en við höfum samt aðgang að reikningsstöðu frá handritinu.

Snjallar eignir einfalda til muna ritun samninga og gera framkvæmd margra mála hnitmiðaða og glæsilega.

Frysting eigna

Að frysta eignir í ákveðna blokkarhæð markhæð, þú getur einfaldlega stillt þetta gildi í handriti eftirfarandi snjalleignar:

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

Matcher sérstakt ástand

Til að stilla ákveðna samsvörun sem þann sem óskað er eftir geturðu stillt heimilisfang hans sem sendanda í snjalleignaskriftu sem lítur svona út:

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

"Hvítur listi" yfir viðtakendur

Til að leyfa að tákn séu send eingöngu á ákveðna reikninga - til að búa til "hvítan lista" yfir viðtakendur - geturðu notað snjalleign með eftirfarandi kerfi sem athugar hvort það sé skráð á listanum:

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
}

Af öryggisástæðum og sannanlega heilleika tungumálsins inniheldur listinn ekki endurtekningarútfærslu. Þess vegna er það skilgreint sem mengi steypuþátta.

„Svartur listi“ yfir viðtakendur

Á sama hátt, til að banna að senda tákn á ákveðna reikninga, geturðu búið til „svartan lista“. Í þessu tilviki er nákvæmlega sama snjalleignin notuð, en með heimilisfangið athugað til að tryggja að það sé ekki á svörtum lista:

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
}

Sending með leyfi útgefanda

Með því að nota snjalleign geturðu einnig stillt þann möguleika að senda snjalleign aðeins með leyfi útgefanda (skuldbinding/skuldamerki). Útgefandi lýsir samþykki sínu með því að setja færslukennið í stöðu reiknings síns:

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

Skiptu aðeins fyrir ákveðnar mynt

Snjalleign veitir leyfi til að skipta henni aðeins fyrir ákveðnar mynt. Til dæmis, til að leyfa aðeins skipti fyrir Bitcoins, gætirðu notað eftirfarandi kóða:

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

Viðskipti eftir verði frá véfréttinum

Í snjalleignaforritinu geturðu stillt leyfi til að eiga viðskipti aðeins á því verði sem er fast í ástandi áreiðanlegrar véfréttar. Hér er dæmi um slíkt handrit:

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
}

Hér stöndum við frammi fyrir óljósu atriði þegar athugað er auðkenni eignarinnar sem viðskipti eru með. Málið er að ef eignakennið er ekki skilgreint, þá erum við að tala um BYLGJUR. Í handritinu tryggjum við að viðskipti fari fram samhliða WAVES, nákvæmlega á þennan hátt.

Föst verðhækkun

Hægt er að setja fast verð fyrir snjalleign sem hækkar skref fyrir skref í ákveðnu hlutfalli. Hér er dæmi um eignaskrift þar sem verð hækkar um 5% á 1000 blokkum:

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
}


Tímaviðskipti

Einnig, þökk sé handritinu, er hægt að takmarka viðskipti með snjalleign við fyrirfram ákveðið millibil. Hér er dæmi um slíkt handrit:

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

Í handritinu tryggjum við að frá upphafi viðskipta byrjunHæð ekki meira en takmarka millibili. Lengd bilsins er jöfn fjölda blokka sem tilgreind eru í reitnum bil.

Heimild: www.habr.com

Bæta við athugasemd