Այժմ մենք կանդրադառնանք խելացի ակտիվներին և դրանց օգտագործման մի քանի դեպքերին, ներառյալ ակտիվների սառեցումը և նշված հասցեներով գործարքների սահմանափակումների ստեղծումը:
Waves Smart Assets-ը թույլ է տալիս օգտվողներին ծածկել սկրիպտները ակտիվների վրա՝ հետևելով նույն մեխանիզմին, ինչ Smart Accounts-ը: Խելացի ակտիվի միջոցով ստեղծված յուրաքանչյուր նոր գործարք նախ կհաստատվի սկրիպտով, իսկ հետո միայն՝ բլոկչեյնով։
Հարկ է նշել հետևյալ տարբերությունները խելացի ակտիվների և խելացի հաշիվների միջև.
Խելացի ակտիվի կոդում անհնար է ստուգել ապացույցները (մենք խոսեցինք դրանց մասին առաջին հոդվածում).
Խելացի հաշվի կոդում դուք կարող եք ստուգել ExchangeTransaction-ը միայն այն դեպքում, եթե ձեր հաշիվը համապատասխանող հաշիվ է: Հակառակ դեպքում ստուգվում է միայն պատվերը։ Խելացի ակտիվի կոդում դուք չեք կարող ուղղակիորեն ստուգել պատվերը, կարող եք ստուգել ExchangeTransaction-ը և, անհրաժեշտության դեպքում, ստանալ պատվերը դրանից:
Խելացի ակտիվը, ի տարբերություն խելացի հաշվի, չունի վիճակ, բայց մենք դեռևս մուտք ունենք հաշվի վիճակներին սկրիպտից:
Խելացի ակտիվները մեծապես պարզեցնում են պայմանագրերը գրելը, դարձնելով շատ գործերի իրականացումը հակիրճ և էլեգանտ:
Ակտիվների սառեցում
Ակտիվները որոշակի բլոկի բարձրության վրա սառեցնելու համար նպատակային բարձրություն, դուք պարզապես կարող եք սահմանել այս արժեքը հետևյալ խելացի ակտիվի սկրիպտում.
let targetHeight = 1500000
height >= targetHeight
height - функция языка, возращающая текущую высоту.
Համապատասխանեցման հատուկ պայման
Հատուկ համընկնողը որպես ցանկալի սահմանելու համար կարող եք դրա հասցեն որպես ուղարկող սահմանել խելացի ակտիվի սցենարով, որն ունի հետևյալ տեսքը.
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
Ստացողների «սպիտակ ցուցակը».
Որպեսզի թոքեններն ուղարկվեն միայն որոշակի հաշիվներին՝ ստացողների «սպիտակ ցուցակ» ստեղծելու համար, կարող եք օգտագործել խելացի ակտիվը հետևյալ սխեմայով, որը ստուգում է ցանկում ներառելու համար.
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
}
Անվտանգության նկատառումներից ելնելով և լեզվի ապացուցելի ամբողջականությունից ելնելով, ցանկը չի պարունակում կրկնվող կատարում: Հետևաբար այն սահմանվում է որպես կոնկրետ տարրերի մի շարք:
Ստացողների «սև ցուցակ».
Նմանապես, որոշակի հաշիվներին նշաններ ուղարկելն արգելելու համար կարող եք ստեղծել «սև ցուցակ»: Այս դեպքում օգտագործվում է ճիշտ նույն խելացի ակտիվը, բայց հասցեն ստուգված է, որպեսզի համոզվեք, որ այն սև ցուցակում չէ.
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
}
Ուղարկում թողարկողի թույլտվությամբ
Օգտագործելով խելացի ակտիվը, կարող եք նաև սահմանել խելացի ակտիվ ուղարկելու տարբերակը միայն թողարկողի թույլտվությամբ (պարտքի/պարտքի պիտակ) Թողարկողը արտահայտում է իր համաձայնությունը՝ տեղադրելով գործարքի ID-ն իր հաշվի վիճակում.
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#убеждаемся, что в стейте эмитента содержится ID текущей транзакции
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Փոխանակեք միայն որոշակի մետաղադրամների համար
Խելացի ակտիվը թույլ է տալիս այն փոխանակել միայն որոշակի մետաղադրամներով: Օրինակ՝ միայն բիթքոյններով փոխանակումը թույլատրելու համար կարող եք օգտագործել հետևյալ կոդը.
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
case t : ExchangeTransaction =>
t.sellOrder.assetPair.priceAsset == BTCId ||
t.sellOrder.assetPair.amountAsset == BTCId
case _ => true
}
Առևտուր ըստ գնի Oracle-ից
Խելացի ակտիվների սկրիպտում դուք կարող եք առևտուր անելու թույլտվություն սահմանել միայն հուսալի օրակլի վիճակում հաստատված գնով: Ահա այսպիսի սցենարի օրինակ.
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
}
Այստեղ մենք բախվում ենք ոչ ակնհայտ կետի՝ ստուգելով այն ակտիվի ID-ն, որով իրականացվում է առևտուր: Բանն այն է, որ եթե ակտիվի ID-ն սահմանված չէ, ապա խոսքը WAVES-ի մասին է։ Սցենարում մենք համոզվում ենք, որ առևտուրն իրականացվում է WAVES-ի հետ տանդեմում, հենց այս ձևով։
Ֆիքսված գնի բարձրացում
Դուք կարող եք ֆիքսված գին սահմանել խելացի ակտիվի համար, որը քայլ առ քայլ կավելանա տվյալ համամասնությամբ: Ահա ակտիվի սցենարի օրինակ, որի գինը կբարձրանա 5%-ով յուրաքանչյուր 1000 բլոկից.
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
}
Ինտերվալային առևտուր
Բացի այդ, սցենարի շնորհիվ խելացի ակտիվի առևտուրը կարող է սահմանափակվել կանխորոշված ընդմիջումներով: Ահա այսպիսի սցենարի օրինակ.
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval < limit
case _ => true
}
Սցենարում մենք համոզվում ենք, որ առևտրի սկզբից մեկնարկի բարձրությունը ոչ ավել քան սահմանափակում ընդմիջումներով. Ինտերվալի երկարությունը հավասար է դաշտում նշված բլոկների քանակին ընդմիջում.