Nawr byddwn yn edrych ar asedau smart a sawl achos o'u defnydd, gan gynnwys rhewi asedau a chreu cyfyngiadau ar drafodion mewn cyfeiriadau penodedig.
Mae Waves Smart Assets yn galluogi defnyddwyr i droshaenu sgriptiau ar asedau, gan ddilyn yr un mecaneg â Chyfrifon Clyfar. Bydd pob trafodiad newydd a grëir gan ddefnyddio ased smart yn cael ei gadarnhau yn gyntaf gan y sgript, a dim ond wedyn gan y blockchain.
Mae'n werth nodi'r gwahaniaethau canlynol rhwng asedau smart a chyfrifon smart:
Yn y cod ased smart, mae'n amhosibl gwirio proflenni (fe wnaethom siarad amdanynt yn yr erthygl gyntaf).
Yn y cod cyfrif smart, dim ond os yw'ch cyfrif yn gyfrif cyfatebol y gallwch chi wirio ExchangeTransaction. Fel arall, dim ond y gorchymyn sy'n cael ei wirio. Yn y cod asedau craff, ni allwch wirio'r archeb yn uniongyrchol; gallwch wirio'r ExchangeTransaction, ac, os oes angen, tynnu archeb ohono.
Nid oes gan ased craff, yn wahanol i gyfrif smart, gyflwr, ond mae gennym ni fynediad o hyd i daleithiau cyfrif o'r sgript.
Mae asedau craff yn symleiddio ysgrifennu contractau yn fawr, gan wneud gweithredu llawer o achosion yn gryno ac yn gain.
Rhewi asedau
I rewi asedau i uchder bloc penodol targedUchder, gallwch chi osod y gwerth hwn yn sgript yr ased craff canlynol:
let targetHeight = 1500000
height >= targetHeight
height - функция языка, возращающая текущую высоту.
Cyflwr Penodol i Gydweddydd
I osod cyfatebol penodol fel yr un a ddymunir, gallwch osod ei gyfeiriad fel yr anfonwr mewn sgript asedau clyfar sy'n edrych fel hyn:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
"Rhestr wen" o dderbynwyr
Er mwyn caniatáu i docynnau gael eu hanfon i rai cyfrifon yn unig - i greu "rhestr wen" o dderbynwyr - gallwch ddefnyddio ased smart gyda'r cynllun canlynol sy'n gwirio i'w gynnwys yn y rhestr:
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
}
Am resymau diogelwch a chyflawnder profedig yr iaith, nid yw'r rhestr yn cynnwys gweithrediad iterator. Felly fe'i diffinnir fel set o elfennau concrit.
"Rhestr ddu" o dderbynwyr
Yn yr un modd, i wahardd anfon tocynnau i rai cyfrifon, gallwch greu “rhestr ddu”. Yn yr achos hwn, defnyddir yr un ased craff yn union, ond gyda'r cyfeiriad wedi'i wirio i sicrhau nad yw ar y rhestr ddu:
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
}
Anfon gyda chaniatâd y cyhoeddwr
Gan ddefnyddio ased smart, gallwch hefyd osod yr opsiwn i anfon ased smart gyda chaniatâd y cyhoeddwr yn unig (label ymrwymiad/dyled). Mae'r cyhoeddwr yn mynegi ei gydsyniad trwy osod ID y trafodiad yng nghyflwr ei gyfrif:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#убеждаемся, что в стейте эмитента содержится ID текущей транзакции
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Cyfnewid dim ond ar gyfer darnau arian penodol
Mae ased smart yn caniatáu caniatâd i'w gyfnewid am ddarnau arian penodol yn unig. Er enghraifft, i ganiatáu cyfnewid am Bitcoins yn unig, gallech ddefnyddio'r cod canlynol:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
case t : ExchangeTransaction =>
t.sellOrder.assetPair.priceAsset == BTCId ||
t.sellOrder.assetPair.amountAsset == BTCId
case _ => true
}
Masnachu yn ôl pris o'r oracl
Yn y sgript asedau craff, gallwch chi osod caniatâd i fasnachu dim ond am y pris a bennir yng nghyflwr oracl dibynadwy. Dyma enghraifft o sgript o'r fath:
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
}
Yma rydym yn wynebu pwynt nad yw'n amlwg wrth wirio ID yr ased y cynhelir masnachu ag ef. Y pwynt yw, os nad yw'r ID ased wedi'i ddiffinio, yna rydym yn siarad am TONNAU. Yn y sgript, rydym yn sicrhau bod masnachu'n cael ei wneud ar y cyd â WAVES, yn union fel hyn.
Cynnydd pris sefydlog
Gallwch osod pris sefydlog ar gyfer ased smart, a fydd yn cynyddu gam wrth gam mewn cyfran benodol. Dyma enghraifft o sgript ased y bydd ei phris yn cynyddu 5% bob 1000 bloc:
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
}
Masnachu egwyl
Hefyd, diolch i'r sgript, gellir cyfyngu masnachu ased craff i gyfnodau a bennwyd ymlaen llaw. Dyma enghraifft o sgript o'r fath:
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval < limit
case _ => true
}
Yn y sgript rydym yn gwneud yn siŵr bod o ddechrau masnachu cychwynUchder dim mwy na cyfyngu ar ysbeidiau. Mae hyd y cyfwng yn hafal i nifer y blociau a nodir yn y maes cyfwng.