Tonnau asedau clyfar: rhestrau du a gwyn, masnachu egwyl

Tonnau asedau clyfar: rhestrau du a gwyn, masnachu egwyl

Yn y ddwy erthygl flaenorol buom yn siarad am gyfrifon smart a sut y gellir eu defnyddio am gynnal arwerthiannau a chreu rhaglenni teyrngarwcha help hefyd sicrhau tryloywder offerynnau ariannol.

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:

  1. Yn y cod ased smart, mae'n amhosibl gwirio proflenni (fe wnaethom siarad amdanynt yn yr erthygl gyntaf).
  2. 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.
  3. 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.

Ffynhonnell: hab.com

Ychwanegu sylw