Waves aktibo adimendunak: zerrenda zuri-beltzak, tarteko merkataritza

Waves aktibo adimendunak: zerrenda zuri-beltzak, tarteko merkataritza

Aurreko bi artikuluetan kontu adimendunez eta nola erabil daitezkeen hitz egin genuen enkanteak egiteko eta leialtasun programak sortzekoeta baita lagundu ere finantza-tresnen gardentasuna bermatzea.

Orain aktibo adimendunak eta haien erabileraren hainbat kasu aztertuko ditugu, besteak beste, aktiboak izoztea eta zehaztutako helbideetan transakzioen murrizketak sortzea.

Waves Smart Assets-ek erabiltzaileei scriptak gainjar ditzakete aktiboetan, kontu adimendunen mekanika bera jarraituz. Aktibo adimendun bat erabiliz sortutako transakzio berri bakoitza script-ak berretsiko du lehenik, eta gero bloke-kateak.

Azpimarratzekoa da aktibo adimendunen eta kontu adimendunen arteko desberdintasun hauek:

  1. Aktibo adimendun baten kodean, ezinezkoa da frogak egiaztatzea (horiei buruz hitz egin dugu lehen artikuluan).
  2. Kontu adimendunaren kodean, ExchangeTransaction egiazta dezakezu zure kontua pareko kontua bada bakarrik. Bestela, eskaera bakarrik egiaztatuko da. Aktibo adimendunen kodean, ezin duzu eskaera zuzenean egiaztatu; ExchangeTransaction egiazta dezakezu, eta, behar izanez gero, eskaera bat atera.
  3. Aktibo adimendun batek, kontu adimendun batek ez bezala, ez du egoerarik, baina oraindik ere kontu-egoeretarako sarbidea dugu scriptetik.

Aktibo adimendunek asko errazten dute kontratuen idazketa, kasu askoren ezarpena zehatza eta dotorea eginez.

Aktiboak izoztea

Aktiboak blokearen altuera jakin batera izozteko xedeAltuera, balio hau ezar dezakezu ondoko aktibo adimendunaren scriptean:

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

Matcher Baldintza Espezifikoa

Parekatzaile zehatz bat nahi den moduan ezartzeko, bere helbidea igorle gisa ezar dezakezu honelako itxura duen aktibo adimendunaren script batean:

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

Hartzaileen "zerrenda zuria".

Tokenak kontu jakin batzuetara soilik bidaltzeko - hartzaileen "zerrenda zuria" sortzeko - aktibo adimendun bat erabil dezakezu zerrendan sartzea egiaztatzen duen eskema honekin:

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
}

Segurtasun arrazoiengatik eta hizkuntzaren osotasun frogagarria dela eta, zerrendak ez du iteratzaileen inplementaziorik. Beraz, hormigoizko elementuen multzo gisa definitzen da.

Hartzaileen "zerrenda beltza".

Era berean, zenbait kontutara tokenak bidaltzea debekatzeko, "zerrenda beltza" sor dezakezu. Kasu honetan, aktibo adimendun bera erabiltzen da, baina helbidea egiaztatuta zerrenda beltzean ez dagoela ziurtatzeko:

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
}

Igorlearen baimenarekin bidaltzea

Aktibo adimendun bat erabiliz, aktibo adimendun bat igorlearen baimenarekin soilik bidaltzeko aukera ere ezar dezakezu (konpromisoa/zorra etiketa). Jaulkitzaileak bere baimena adierazten du transakzio IDa bere kontuaren egoeran jarriz:

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

Trukatu txanpon batzuengatik soilik

Aktibo adimendun batek txanpon batzuengatik soilik trukatzeko baimena ematen du. Adibidez, Bitcoins trukea soilik baimentzeko, honako kodea erabil dezakezu:

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

Orakuluaren prezioaren arabera negoziatzea

Aktibo adimendunen scriptean, orakulu fidagarri baten egoeran finkatutako prezioan soilik negoziatzeko baimena ezar dezakezu. Hona hemen horrelako gidoi baten adibide bat:

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
}

Hemen begi-bistakoa ez den puntu baten aurrean gaude merkataritza egiten den aktiboaren IDa egiaztatzean. Kontua da aktiboaren IDa definituta ez badago, WAVES buruz ari garela. Gidoian, merkataritza WAVESekin batera egiten dela ziurtatzen dugu, zehazki modu honetan.

Prezio finkoaren igoera

Prezio finko bat ezar dezakezu aktibo adimendun baterako, pausoz pauso igoko dena proportzio jakin batean. Hona hemen prezioa 5 bloke bakoitzeko % 1000 igoko den aktibo script baten adibide bat:

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
}


Tartekako merkataritza

Gainera, gidoiari esker, aktibo adimendun baten merkataritza aurrez zehaztutako tarteetara muga daiteke. Hona hemen horrelako gidoi baten adibide bat:

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

Gidoian hori ziurtatzen dugu merkataritzaren hasieratik hasierakoAltuera baino gehiago ez muga tarteak. Tartearen luzera eremuan zehaztutako bloke kopuruaren berdina da tarte.

Iturria: www.habr.com

Gehitu iruzkin berria