Ալիքների խելացի ակտիվներ. սև և սպիտակ ցուցակներ, ինտերվալային առևտուր

Ալիքների խելացի ակտիվներ. սև և սպիտակ ցուցակներ, ինտերվալային առևտուր

Նախորդ երկու հոդվածներում մենք խոսեցինք խելացի հաշիվների և դրանց օգտագործման մասին աճուրդների անցկացման և հավատարմության ծրագրեր ստեղծելու համարև նաև օգնել ապահովել ֆինանսական գործիքների թափանցիկությունը.

Այժմ մենք կանդրադառնանք խելացի ակտիվներին և դրանց օգտագործման մի քանի դեպքերին, ներառյալ ակտիվների սառեցումը և նշված հասցեներով գործարքների սահմանափակումների ստեղծումը:

Waves Smart Assets-ը թույլ է տալիս օգտվողներին ծածկել սկրիպտները ակտիվների վրա՝ հետևելով նույն մեխանիզմին, ինչ Smart Accounts-ը: Խելացի ակտիվի միջոցով ստեղծված յուրաքանչյուր նոր գործարք նախ կհաստատվի սկրիպտով, իսկ հետո միայն՝ բլոկչեյնով։

Հարկ է նշել հետևյալ տարբերությունները խելացի ակտիվների և խելացի հաշիվների միջև.

  1. Խելացի ակտիվի կոդում անհնար է ստուգել ապացույցները (մենք խոսեցինք դրանց մասին առաջին հոդվածում).
  2. Խելացի հաշվի կոդում դուք կարող եք ստուգել ExchangeTransaction-ը միայն այն դեպքում, եթե ձեր հաշիվը համապատասխանող հաշիվ է: Հակառակ դեպքում ստուգվում է միայն պատվերը։ Խելացի ակտիվի կոդում դուք չեք կարող ուղղակիորեն ստուգել պատվերը, կարող եք ստուգել ExchangeTransaction-ը և, անհրաժեշտության դեպքում, ստանալ պատվերը դրանից:
  3. Խելացի ակտիվը, ի տարբերություն խելացի հաշվի, չունի վիճակ, բայց մենք դեռևս մուտք ունենք հաշվի վիճակներին սկրիպտից:

Խելացի ակտիվները մեծապես պարզեցնում են պայմանագրերը գրելը, դարձնելով շատ գործերի իրականացումը հակիրճ և էլեգանտ:

Ակտիվների սառեցում

Ակտիվները որոշակի բլոկի բարձրության վրա սառեցնելու համար նպատակային բարձրություն, դուք պարզապես կարող եք սահմանել այս արժեքը հետևյալ խելացի ակտիվի սկրիպտում.

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
}

Սցենարում մենք համոզվում ենք, որ առևտրի սկզբից մեկնարկի բարձրությունը ոչ ավել քան սահմանափակում ընդմիջումներով. Ինտերվալի երկարությունը հավասար է դաշտում նշված բլոկների քանակին ընդմիջում.

Source: www.habr.com

Добавить комментарий