
Kahes eelmises artiklis rÀÀkisime nutiakontodest ja sellest, kuidas neid saab kasutada , samuti aitavad need .
Praegu vaatame nutikad varad ja mitmeid nende rakendamise juhtumeid, sealhulgas varade kĂŒlmutamist ja transaktsioonide piirangute seadmist mÀÀratud aadressidele.
Wavesi nutikad varad vÔimaldavad kasutajatel varadele skripte rakendada, jÀrgides sama mehhanismi nagu nutikontode puhul. Iga uus tehing, mis luuakse nutika vara abil, kinnitatakse esmalt skripti ja seejÀrel plokiahela poolt.
MÀrkimist vÀÀrivad jÀrgmised erinevused nutikate varade ja nutikontode vahel:
- Nutika vara koodis ei saa tÔendite kontrolli teostada (millest rÀÀkisime ).
- Nutika konto koodis saab kontrollida ExchangeTransaction'i ainult siis, kui teie konto on vastendava konto tĂŒĂŒp. Vastasel juhul kontrollitakse ainult tellimust. Nutikate varade koodis ei saa tellimust otse kontrollida, kuid saab kontrollida ExchangeTransaction'i ning vajadusel sealt tellimust vĂ€lja vĂ”tta.
- Nutikatel varadel, erinevalt nutikast kontost, ei ole olekut, kuid meil on siiski juurdepÀÀs kontode olekutele skriptist.
Nutikad varad lihtsustavad lepingute loomist oluliselt, muutes paljude juhtumite rakendamise lakooniliseks ja elegantseks.
Varade kĂŒlmutamine
Varade kĂŒlmutamiseks kindla ploki kĂ”rgusel targetHeight, saab selle vÀÀrtuse lihtsalt skriptis jĂ€rgmise nutika vara jaoks mÀÀrata:
let targetHeight = 1500000
height >= targetHeight
height - funktsioon keeles, mis tagastab hetke kÔrguse.
Konkreetse vastendi tingimus
Soovitud spetsiifilise vastendi mÀÀramiseks saate mÀÀrata selle aadressi saatjana skriptis jÀrgmisel kujul:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
âValge nimekiriâ vastuvĂ”tjate jaoks
Kuna lubada tokenite saatmist ainult teatud kontodele â luua «valge nimekiri» saajatele â saate kasutada nutitaimi jĂ€rgmise skeemiga, mis kontrollib nimekirja kuuluvust:
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
}
Turvalisuse ja tÔestatava lÔpetatuse eesmÀrgil ei sisalda nimekiri iteratsiooni rakendust. SeetÔttu on see mÀÀratud kindlate elementide kogumina.
«Must nimekiri» saajatele
Sama tÔhusalt, et keelata tokenite saatmine teatud kontodele, saate luua «mustade nimekirjade». Selle jaoks kasutatakse tÀpselt sama nutitaime, kuid aadressi kontrollimisega, et see ei oleks mustas nimekirjas:
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
}
Saatmine emitendi loal
Nutitelefoni kasutamine vÔimaldab ka seada nutitelefoni saatmise valiku ainult emitendi loal (kohustuse/velle mÀrge). Emitent vÀljendab oma nÔusolekut, paigutades tehingu ID oma konto staatusesse:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#veenduge, et emitendi olekus oleks praeguse tehingu ID
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Vahetus ainult teatud mĂŒntide vastu
Nutitelefon vĂ”imaldab lubada vahetada seda ainult teatud mĂŒntide vastu. NĂ€iteks, et lubada vahetust ainult bitcoinide vastu, vĂ”ite kasutada jĂ€rgmist koodi:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
case t : ExchangeTransaction =>
t.sellOrder.assetPair.priceAsset == BTCId ||
t.sellOrder.assetPair.amountAsset == BTCId
case _ => true
}
Kaubandus orakli hinnaga
Nutitelefoni skripti saab seadistada lubama kaubelda ainult orakli staatustes fikseeritud hinnaga. Siin on nÀide sellisest skriptist:
let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
match tx {
#keelame vara ĂŒlekande
case t: TransferTransaction | MassTransferTransaction => false
case e: ExchangeTransaction =>
#kontrollime, et kauplemine toimub orakli olekus mÀÀratud hinnaga selle vara jaoks
let correctPrice = e.price == extract(getInteger(oracle, assetId))
#kontrollime, et kauplemine toimub WAVES'i vastu
let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset)
correctPrice && correctPriceAsset
case _ => true
}
Siin kohtame ebaselget hetke vara ID kontrollimisel, millega kaubeldakse. Asi on selles, et kui vara ID pole mÀÀratletud, tÀhendab see, et tegemist on WAVES'iga. Skriptis veendume, et kauplemine toimub WAVES'iga, just nii.
Fikseeritud hinnatÔus
Saame seada nutivara fikseeritud hinna, mis tÔuseb jÀrk-jÀrgult mÀÀratud osas. Siin on nÀide vara skriptist, mille hind tÔuseb 5% iga 1000 ploki jÀrel:
let startPrice = 10
let startHeight = 1000
let interval = 1000
# kui palju protsentides hind ĂŒhe sammu jooksul tĂ”useb
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
}
Intervalliline kauplemine
Samuti vÔimaldab skript piirata nutiressursiga kauplemist etteantud intervallide abil. Siin on sellise skripti nÀide:
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval true
}
Skriptis veendume, et alates kauplemise algusest startHeight on möödunud mitte rohkem kui limit intervalle. Intervalli pikkus on vÔrdne plokkide kogustega, mis on mÀÀratud vÀljal interval.
Allikas: habr.com
