Толкундар акылдуу активдер: кара тизмелер жана ак тизмелер, аралык соода

Толкундар акылдуу активдер: кара тизмелер жана ак тизмелер, аралык соода

Мурунку эки макалада биз смарт аккаунттар жана аларды кантип колдонсо болору жөнүндө сүйлөштүк. аукциондорду өткөрүү жана лоялдуулук программаларын түзүү үчүнжана да жардам берет финансылык инструменттердин ачыктыгын камсыз кылуу.

Эми биз акылдуу активдерди жана алар үчүн бир нече колдонуу учурларын, анын ичинде активдерди тоңдурууну жана берилген даректердеги транзакцияларга чектөөлөрдү киргизүүнү карайбыз.

Waves Smart Assets колдонуучуларга акылдуу каттоо эсептери сыяктуу эле механизмдерди ээрчип, активдерди жазууга мүмкүндүк берет. Акылдуу активдин жардамы менен түзүлгөн ар бир жаңы транзакция адегенде скрипт менен, андан кийин гана блокчейн менен ырасталат.

Акылдуу активдер менен акылдуу эсептердин ортосундагы төмөнкү айырмачылыктарды белгилей кетүү керек:

  1. Акылдуу активдин кодунда далилдерди текшерүү мүмкүн эмес (биз алар жөнүндө сүйлөштүк биринчи макалада).
  2. Акылдуу каттоо эсебинин кодунда сиз ExchangeTransaction'ты текшере аласыз, эгерде сиздин каттоо эсебиңиз дал келген каттоо эсеби болсо. Болбосо, буйрук гана текшерилет. Акылдуу актив кодунда сиз буйрукту түздөн-түз текшере албайсыз, ExchangeTransaction текшерип, керек болсо андан буйрутманы чыгара аласыз.
  3. Акылдуу актив, акылдуу аккаунттан айырмаланып, абалы жок, бирок бизде дагы эле скрипттен каттоо эсебинин абалына жетүү мүмкүнчүлүгү бар.

Акылдуу активдер келишимдерди жазууну абдан жөнөкөйлөтүп, көптөгөн иштерди кыска жана көрктүү кылат.

Актив тоңду

Белгилүү бир блоктун бийиктигине чейин активдерди тоңдурууга targetHeight, сиз жөн гана бул маанини төмөнкү акылдуу активдин скриптине орното аласыз:

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
}

Эмитенттин уруксаты менен жөнөтүү

Акылдуу актив менен сиз эмитенттин уруксаты менен гана акылдуу активди жөнөтүү опциясын орното аласыз (милдеттенме/карыз белгиси). Эмитент транзакциянын идентификаторун өзүнүн эсебинин абалына жайгаштыруу менен макулдугун билдирет:

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 баасы боюнча соода

Акылдуу актив скриптинде сиз ишенимдүү 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 аныкталбаса, анда биз 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
}

Сценарийде биз сооданын башынан бери ынанабыз startHeight ашкан эмес чек интервалдар. Интервалдын узундугу талаада көрсөтүлгөн блоктордун санына барабар аралык.

Source: www.habr.com

Комментарий кошуу