Waves smart assets: lisitra mainty sy fotsy, varotra eo anelanelan'ny fotoana

Waves smart assets: lisitra mainty sy fotsy, varotra eo anelanelan'ny fotoana

Tao amin'ny lahatsoratra roa teo aloha dia niresaka momba ny kaonty marani-tsaina sy ny fomba azo ampiasana azy ireo isika amin'ny fanaovana lavanty sy famoronana programa momba ny tsy fivadihanaary koa manampy miantoka ny mangarahara ny fitaovana ara-bola.

Hojerentsika izao ny fananana marani-tsaina sy tranga maro amin'ny fampiasana azy, ao anatin'izany ny fananana mangatsiaka sy ny famoronana famerana ny fifampiraharahana amin'ny adiresy voafaritra.

Ny Waves Smart Assets dia ahafahan'ny mpampiasa manarona sora-baventy amin'ny fananana, manaraka ny mekanika mitovy amin'ny Smart Accounts. Ny fifanakalozana vaovao tsirairay noforonina tamin'ny fampiasana fananana hendry dia hohamafisin'ny script aloha, ary avy eo amin'ny blockchain.

Tsara ny manamarika ireto fahasamihafana manaraka ireto eo amin'ny fananana marani-tsaina sy ny kaonty marani-tsaina:

  1. Ao amin'ny fehezan-dalàna momba ny fananana hendry dia tsy azo atao ny manamarina porofo (niresaka momba azy ireo izahay ao amin'ny lahatsoratra voalohany).
  2. Ao amin'ny kaody kaonty hendry, azonao atao ny manamarina ny ExchangeTransaction raha toa ka kaonty matcher ny kaontinao. Raha tsy izany dia ny baiko ihany no jerena. Ao amin'ny kaody manan-tsaina, tsy afaka manamarina mivantana ny baiko ianao; azonao atao ny manamarina ny ExchangeTransaction, ary, raha ilaina, manaisotra baiko avy aminy.
  3. Ny fananana marani-tsaina, tsy toy ny kaonty marani-tsaina, dia tsy manana fanjakana, saingy mbola afaka miditra amin'ny fanjakana kaonty avy amin'ny script izahay.

Ny fananana Smart dia manamora ny fanoratana fifanarahana, ka mahatonga ny fampiharana tranga maro ho fohy sy kanto.

Fanafihana fananana

Hanamafisana fananana amin'ny haavon'ny sakana iray targetHeight, azonao atao ny mametraka ity sanda ity amin'ny script an'ity fananana hendry manaraka ity:

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

Fepetra manokana matcher

Mba hametrahana mpifaninana manokana ho toy ny tiana dia azonao atao ny mametraka ny adiresiny ho mpandefa amin'ny sora-baventy manan-tsaina toa izao:

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

"Lisitra fotsy" an'ny mpandray

Mba hamelana ny mari-pamantarana halefa any amin'ny kaonty sasany ihany - mba hamoronana "lisitra fotsy" an'ny mpandray - azonao atao ny mampiasa fananana marani-tsaina miaraka amin'ity tetika manaraka ity izay manamarina ny fampidirana ao anaty lisitra:

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
}

Noho ny antony ara-piarovana sy ny fahafenoan'ny fiteny, ny lisitra dia tsy misy fampiharana fampitaovana. Noho izany dia faritana ho fitambarana singa mivaingana izy io.

"Lisitra mainty" ny mpandray

Toy izany koa, mba handrara ny fandefasana famantarana amin'ny kaonty sasany, azonao atao ny mamorona "lisitra mainty". Amin'ity tranga ity, ny fananana manan-tsaina mitovy amin'izany ihany no ampiasaina, fa miaraka amin'ny adiresy voamarina mba hahazoana antoka fa tsy ao anaty lisitra mainty izy io:

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
}

Mandefa nahazoana alalana avy amin'ny mpamatsy

Amin'ny fampiasana fananana hendry dia azonao atao ihany koa ny mametraka ny safidy handefasana fananana hendry raha tsy mahazo alalana avy amin'ny mpanome (mariky ny fanoloran-tena/trosa). Ny mpanome dia maneho ny fanekeny amin'ny fametrahana ny kaody ID amin'ny toetry ny kaontiny:

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

Takalo amin'ny vola madinika sasany

Ny fananana hendry dia manome alalana hanakalo izany amin'ny vola madinika sasany. Ohatra, raha tsy mamela ny fifanakalozana amin'ny Bitcoins fotsiny ianao dia azonao ampiasaina ity code manaraka ity:

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

Ny varotra amin'ny vidiny avy amin'ny oracle

Ao amin'ny script asset smart, azonao atao ny mametraka fahazoan-dàlana hivarotra raha tsy amin'ny vidiny voafetra amin'ny toetry ny oracle azo antoka. Ity misy ohatra amin'ny script toy izany:

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
}

Eto isika dia miatrika teboka tsy mazava rehefa manamarina ny ID ny fananana izay anaovana varotra. Ny tiana holazaina dia raha tsy voafaritra ny ID ID dia ny WAVES no resahina. Ao amin'ny script, ataontsika antoka fa ny varotra dia tanterahana miaraka amin'ny WAVES, amin'izany fomba izany.

Fisondrotry ny vidiny raikitra

Azonao atao ny mametraka vidiny raikitra ho an'ny fananana hendry, izay hampitombo tsikelikely amin'ny ampahany nomena. Ity misy ohatra amin'ny script fananana izay hitombo 5% ny vidiny isaky ny sakana 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
}


Varotra elanelam-potoana

Ary koa, noho ny script, ny varotra fananana hendry dia mety ho voafetra amin'ny elanelana efa voafaritra mialoha. Ity misy ohatra amin'ny script toy izany:

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

Ao amin'ny script dia ataontsika antoka fa hatramin'ny fiandohan'ny varotra startHeight tsy mihoatra ny fetra elanelana. Ny halavan'ny elanelana dia mitovy amin'ny isan'ny sakana voatondro ao amin'ny saha elanelana.

Source: www.habr.com

Add a comment