Waves smart asset: black and white list, interval trading

Waves smart asset: black and white list, interval trading

Sa nakaraang dalawang artikulo ay napag-usapan natin ang tungkol sa mga matalinong account at kung paano ito magagamit para sa pagdaraos ng mga auction at paglikha ng mga programa ng katapatanat tumulong din tiyakin ang transparency ng mga instrumento sa pananalapi.

Ngayon ay titingnan natin ang mga matalinong asset at ilang mga kaso ng paggamit ng mga ito, kabilang ang mga nagyeyelong asset at paggawa ng mga paghihigpit sa mga transaksyon sa mga tinukoy na address.

Binibigyang-daan ng Waves Smart Assets ang mga user na mag-overlay ng mga script sa mga asset, na sinusunod ang parehong mechanics gaya ng mga Smart Account. Ang bawat bagong transaksyon na ginawa gamit ang isang matalinong asset ay unang makukumpirma ng script, at pagkatapos lamang ng blockchain.

Ito ay nagkakahalaga ng pagpuna sa mga sumusunod na pagkakaiba sa pagitan ng mga smart asset at mga smart account:

  1. Sa code ng isang matalinong asset, imposibleng suriin ang mga patunay (napag-usapan namin ang tungkol sa mga ito sa unang artikulo).
  2. Sa smart account code, maaari mo lamang suriin ang ExchangeTransaction kung ang iyong account ay isang matcher account. Kung hindi, ang order lamang ang sinusuri. Sa smart asset code, hindi mo maaaring direktang suriin ang order; maaari mong suriin ang ExchangeTransaction, at, kung kinakailangan, kunin ang order mula dito.
  3. Ang isang matalinong asset, hindi tulad ng isang matalinong account, ay walang estado, ngunit mayroon pa rin kaming access sa mga estado ng account mula sa script.

Ang mga matalinong asset ay lubos na pinasimple ang pagsulat ng mga kontrata, na ginagawang maigsi at elegante ang pagpapatupad ng maraming kaso.

Pag-freeze ng asset

Upang i-freeze ang mga asset sa isang partikular na taas ng block targetHeight, maaari mo lang itakda ang value na ito sa script ng sumusunod na smart asset:

let targetHeight = 1500000
height >= targetHeight
 
height - функция языка, возращающая текущую высоту.

Tukoy na Kondisyon ng matcher

Para itakda ang isang partikular na matcher bilang ang gusto, maaari mong itakda ang address nito bilang nagpadala sa isang smart asset script na ganito ang hitsura:

match tx {
    case t : ExchangeTransaction =>
        t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
    case _ => true
}

"White list" ng mga tatanggap

Para payagan ang mga token na ipadala lang sa ilang partikular na account - para gumawa ng "white list" ng mga tatanggap - maaari kang gumamit ng smart asset na may sumusunod na scheme na tumitingin kung may kasama sa listahan:

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
}

Para sa mga kadahilanang pangseguridad at mapapatunayang pagkakumpleto ng wika, ang listahan ay hindi naglalaman ng pagpapatupad ng iterator. Samakatuwid ito ay tinukoy bilang isang hanay ng mga kongkretong elemento.

"Black list" ng mga tatanggap

Katulad nito, upang ipagbawal ang pagpapadala ng mga token sa ilang mga account, maaari kang lumikha ng isang "itim na listahan". Sa kasong ito, eksaktong parehong matalinong asset ang ginagamit, ngunit may naka-check na address upang matiyak na wala ito sa blacklist:

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
}

Nagpapadala nang may pahintulot ng nagbigay

Gamit ang isang smart asset, maaari mo ring itakda ang opsyong magpadala ng smart asset lang kung may pahintulot ng nagbigay (label ng pangako/utang). Ipinapahayag ng issuer ang pahintulot nito sa pamamagitan ng paglalagay ng transaction ID sa estado ng account nito:

match tx {
  case t : TransferTransaction =>
    let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
    #убеждаемся, что в стейте эмитента содержится ID текущей транзакции
    isDefined(getInteger(issuer, toBase58String(t.id)))
  case _ => false
}

Palitan lamang ng ilang mga barya

Ang isang matalinong asset ay nagbibigay-daan sa pahintulot na ipagpalit lamang ito sa ilang partikular na barya. Halimbawa, upang payagan lamang ang pagpapalitan ng mga Bitcoin, maaari mong gamitin ang sumusunod na code:

let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
  case t : ExchangeTransaction =>
    t.sellOrder.assetPair.priceAsset == BTCId ||
     t.sellOrder.assetPair.amountAsset == BTCId
  case _ => true
}

Trading sa pamamagitan ng presyo mula sa orakulo

Sa script ng matalinong asset, maaari kang magtakda ng pahintulot na mag-trade lamang sa presyong nakatakda sa estado ng isang maaasahang orakulo. Narito ang isang halimbawa ng naturang script:

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
}

Narito tayo ay nahaharap sa isang hindi halatang punto kapag sinusuri ang ID ng asset kung saan isinasagawa ang pangangalakal. Ang punto ay kung ang asset ID ay hindi tinukoy, kung gayon ang pinag-uusapan natin ay tungkol sa WAVES. Sa script, tinitiyak namin na ang pangangalakal ay isinasagawa kasabay ng WAVES, sa eksaktong ganitong paraan.

Nakapirming pagtaas ng presyo

Maaari kang magtakda ng nakapirming presyo para sa isang matalinong asset, na tataas nang sunud-sunod sa isang partikular na proporsyon. Narito ang isang halimbawa ng script ng asset na ang presyo ay tataas ng 5% bawat 1000 block:

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
}


Interval trading

Gayundin, salamat sa script, ang pangangalakal ng isang matalinong asset ay maaaring limitado sa mga paunang natukoy na agwat. Narito ang isang halimbawa ng naturang script:

let startHeight = 10000
let interval = 44000
let limit = 1500
 
match tx {
  case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
    (height - startHeight) % interval < limit
  case _ => true
}

Sa script tinitiyak namin na mula sa simula ng pangangalakal startHeight hindi hihigit sa limitasyon mga pagitan. Ang haba ng agwat ay katumbas ng bilang ng mga bloke na tinukoy sa field agwat.

Pinagmulan: www.habr.com

Magdagdag ng komento