Nüüd vaatleme nutikaid varasid ja mitmeid nende kasutamise juhtumeid, sealhulgas varade külmutamist ja piirangute seadmist tehingutele määratud aadressidel.
Waves Smart Assets võimaldavad kasutajatel skripte varadele üle kanda, järgides sama mehhanismi nagu nutikad kontod. Iga nutika vara abil loodud uus tehing kinnitatakse esmalt skripti ja alles seejärel plokiahelaga.
Tasub tähele panna järgmisi erinevusi nutikate varade ja nutikate kontode vahel:
Nutivara koodis on tõendeid võimatu kontrollida (neist rääkisime esimeses artiklis).
Nutika konto koodis saate ExchangeTransactioni kontrollida ainult siis, kui teie konto on vastekonto. Vastasel juhul kontrollitakse ainult tellimust. Nutivara koodis ei saa tellimust otse kontrollida, vaid saab kontrollida ExchangeTransactionit ja vajadusel sealt tellimust välja võtta.
Nutivaral, erinevalt nutikast kontost, ei ole olekut, kuid meil on siiski juurdepääs konto olekutele skriptist.
Nutikad varad lihtsustavad oluliselt lepingute kirjutamist, muutes paljude juhtumite rakendamise ülevaatlikuks ja elegantseks.
Varade külmutamine
Varade külmutamiseks teatud ploki kõrgusele sihtKõrgus, saate selle väärtuse lihtsalt määrata järgmise nutika vara skriptis:
let targetHeight = 1500000
height >= targetHeight
height - функция языка, возращающая текущую высоту.
Matteri eritingimus
Konkreetse sobitaja soovitud määramiseks saate määrata selle saatja aadressi nutikas vara skriptis, mis näeb välja järgmine:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
Saajate "valge nimekiri".
Lubade saatmise lubamiseks ainult teatud kontodele – saajate valge nimekirja loomiseks – saate kasutada järgmise skeemi abil nutivara, mis kontrollib loendisse lisamist:
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
}
Turvakaalutlustel ja keele tõestatava täielikkuse huvides ei sisalda loend iteraatori rakendust. Seetõttu määratletakse see betoonelementide kogumina.
Saajate "must nimekiri".
Samamoodi saate teatud kontodele žetoonide saatmise keelamiseks luua "musta nimekirja". Sel juhul kasutatakse täpselt sama nutikat vara, kuid kontrollitakse aadressi, et veenduda, et see pole 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 väljaandja loal
Nutivara abil saab määrata ka võimaluse saata nutivara ainult väljaandja loal (kohustuse/võla silt). Väljastaja väljendab oma nõusolekut, lisades tehingu ID oma konto olekusse:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#убеждаемся, что в стейте эмитента содержится ID текущей транзакции
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Vahetage ainult teatud müntide vastu
Nutikas vara annab loa selle vahetamiseks ainult teatud müntide vastu. Näiteks ainult Bitcoinide vahetamise lubamiseks 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
}
Oraaklilt hinna järgi kauplemine
Nutikavara skriptis saate määrata loa kaubelda ainult usaldusväärse oraakli seisundis fikseeritud hinnaga. Siin on näide sellisest skriptist:
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
}
Siin seisame silmitsi ebaselge punktiga, kui kontrollime selle vara ID-d, millega kauplemine toimub. Asi on selles, et kui vara ID pole defineeritud, siis räägime LAINEST. Skriptis hoolitseme selle eest, et kauplemine toimuks paralleelselt WAVES-iga, täpselt sel viisil.
Fikseeritud hinnatõus
Nutivarale saab määrata fikseeritud hinna, mis etteantud proportsioonis samm-sammult tõuseb. 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
#на сколько процентов цена увеличивается за один шаг
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
}
Intervallkauplemine
Samuti saab tänu skriptile nutivaraga kauplemist piirata etteantud intervallidega. Siin on näide sellisest skriptist:
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval < limit
case _ => true
}
Skriptis veendume, et kauplemise algusest peale algusKõrgus mitte rohkem kui piirama intervallidega. Intervalli pikkus võrdub väljal määratud plokkide arvuga intervall.