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:
Í kóða snjalleignar er ómögulegt að athuga sannanir (við ræddum um þær í fyrstu greininni).
Í 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.
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.