AsestĂ«t inteligjente Waves: lista tĂ« ‘zezë’ dhe ‘tĂ« bardhë’, tregtimi me intervale

AsestĂ«t inteligjente Waves: lista tĂ« ‘zezë’ dhe ‘tĂ« bardhë’, tregtimi me intervale

Në dy artikujt e kaluar, ne folëm për llogaritë inteligjente dhe se si ato mund të përdoren për të zhvilluar ankande dhe për të krijuar programe besnikërie, si dhe ndihmojnë të sigurojnë transparencën e mjeteve financiare.

Tani do të shqyrtojmë asestët inteligjente dhe disa raste të aplikimit të tyre, duke përfshirë ndalimin e aktiveve dhe krijimin e kufizimeve për transaksionet në adresat e caktuara.

AsestĂ«t inteligjente Waves lejojnĂ« pĂ«rdoruesit tĂ« aplikojnĂ« skripta mbi asestĂ«, duke ndjekur tĂ« njĂ«jtĂ«n mekanikĂ« si nĂ« rastin e llogarive inteligjente. Çdo transaksion i ri, i krijuar duke pĂ«rdorur asetin inteligjent, do tĂ« verifikohet fillimisht nga skripta, dhe vetĂ«m pastaj nga blockchain.

Duhet theksuar dallimet e mëposhtme midis aseteve inteligjente dhe llogarive inteligjente:

  1. Në kodin e asetit inteligjent nuk mund të kryhet një verifikim provash (për të cilat ne folëm në artikullin e parë).
  2. Në kodin e llogarisë inteligjente, mund të kontrolloni ExchangeTransaction vetëm nëse llogaria juaj është një llogari për përputhje. Ndryshe, kontrollohet vetëm porosia. Në kodin e asetit inteligjent, nuk mund të kontrolloni direkt porosinë, por mund të kontrolloni ExchangeTransaction dhe nga ajo për nevojë të nxirrni porosinë.
  3. Në asetin inteligjent, ndryshe nga llogaria inteligjente, nuk ka gjendje, por ne ende kemi qasje në gjendjet e llogarive nga skripti.

Asetet inteligjente e thjeshtojnë ndjeshëm shkruarjen e kontratave, duke e bërë zbatimin e shumë rasteve të qartë dhe të elegant.

Bllokimi i aktivëve

Për të bllokuar aktivet deri në një lartësi të caktuar blloku targetHeight, thjesht mund të caktoni këtë vlerë në skriptin e asetit inteligjent të mëposhtëm:

let targetHeight = 1500000
height >= targetHeight

height - funksioni i gjuhës që kthen lartësinë aktuale.

Kushti i caktuar për përputhjen

Për të vendosur si dëshiruar një përputhje të caktuar, mund të caktoni adresën e saj si dërgues në skriptin e asetit inteligjent të këtij formati:

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

«Lista e bardhë» e marrësve

PĂ«r tĂ« lejuar dĂ«rgimin e tokeneve vetĂ«m nĂ« llogari tĂ« caktuara — pĂ«r tĂ« krijuar njĂ« "listĂ« tĂ« bardhĂ«" tĂ« marrĂ«sve — mund tĂ« pĂ«rdorni njĂ« smart-asset me skemĂ«n e mĂ«poshtme qĂ« verifikon pĂ«rfshirjen nĂ« listĂ«:

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
}

Për arsye sigurie dhe provueshmërie të përfundimeve të gjuhës, lista nuk përmban implementimin e një iteratori. Prandaj, ajo është e caktuar si një set i elementeve të caktuara.

"Lista e zezë" e marrësve

Po ashtu, për të ndaluar dërgimin e tokeneve në llogari të caktuara, mund të krijoni një "listë të zezë". Këtë e realizon sërish një smart-asset identik, por me verifikimin e adresës për mos përfshirjen në listën e zezë:

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
}

Dërgimi me lejen e emitentit

Me ndihmën e smart-asset-it, gjithashtu mund të vendosni opsionin e dërgimit të smart-asset-it vetëm me miratimin e emetuesit (etiketë angazhimi/borxhi). Emetuesi shpreh dakordësinë e tij duke vendosur ID-në e transaksionit në gjendjen e llogarisë së tij:

match tx {
  case t : TransferTransaction =>
    let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
    #sigurohemi që në gjendjen e emetuesit përmban ID-në e transaksionit aktual
    isDefined(getInteger(issuer, toBase58String(t.id)))
  case _ => false
}

Këmbimi vetëm për monedha të caktuara

Smart-asset-i lejon miratimin që ta shkëmbeni vetëm për monedha të caktuara. Për shembull, për të lejuar këmbimin vetëm për bitcoin, mund të përdorni këtë kod:

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

Tregtimi sipas çmimit nga orakulli

Në skriptin e smart-asset-it, mund të përcaktoni lejen për tregtim vetëm sipas çmimit të regjistruar në gjendjen e orakullit të besueshëm. Ja një shembull i këtij skripti:

let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
 
match tx {
  #ndalojmë transferimin e asetëve
  case t: TransferTransaction | MassTransferTransaction => false
  case e: ExchangeTransaction =>
    #sigurohemi që tregtimi bëhet sipas çmimit të caktuar në aktin e orakullit për këtë aset
    let correctPrice = e.price == extract(getInteger(oracle, assetId))
    #sigurohemi që tregtimi bëhet në këmbim të WAVES
    let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset) 
correctPrice && correctPriceAsset
  case _ => true
}

Këtu ne përballemi me një moment të paqartë gjatë verifikimit të ID-së së asetëve me të cilat bëhet tregti. E vërteta është se, nëse ID-ja e asetëve nuk është e përcaktuar, atëherë bëhet fjalë për WAVES. Në skript, ne sigurohemi që tregtimi bëhet në çift me WAVES, pikërisht në këtë mënyrë.

Rritje e fikstuar e çmimit

ËshtĂ« e mundur tĂ« vendosni njĂ« çmim fikst qĂ« do tĂ« rritet hap pas hapi nĂ« njĂ« proporcion tĂ« caktuar. Ja njĂ« shembull skripti tĂ« asetĂ«ve, çmimi i tĂ« cilit do tĂ« rritet me 5% çdo 1000 bllokĂ«:

let startPrice = 10
let startHeight = 1000
let interval = 1000
#sa sa sa herë rritet çmimi për një hap
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
}


Tregtimi me intervale

Gjithashtu, falë skriptit, tregtia e asetit inteligjent mund të kufizohet në intervale të përcaktuara paraprakisht. Ja një shembull i tillë skripti:

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

Në skript ne sigurohemi që nga fillimi i tregtisë startHeight nuk ka kaluar më shumë se limit intervalesh. Gjatësia e intervalit është e barabartë me numrin e bllokave të përcaktuar në fushën interval.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster