Waves smart assets: ασπρόμαυρες λίστες, διαλειμματικές συναλλαγές

Waves smart assets: ασπρόμαυρες λίστες, διαλειμματικές συναλλαγές

Στα δύο προηγούμενα άρθρα μιλήσαμε για τους έξυπνους λογαριασμούς και πώς μπορούν να χρησιμοποιηθούν για τη διεξαγωγή δημοπρασιών και τη δημιουργία προγραμμάτων επιβράβευσηςκαι επίσης βοήθεια διασφάλιση της διαφάνειας των χρηματοπιστωτικών μέσων.

Τώρα θα εξετάσουμε τα έξυπνα περιουσιακά στοιχεία και αρκετές περιπτώσεις χρήσης τους, συμπεριλαμβανομένης της δέσμευσης περιουσιακών στοιχείων και της δημιουργίας περιορισμών στις συναλλαγές σε συγκεκριμένες διευθύνσεις.

Τα Waves Smart Assets επιτρέπουν στους χρήστες να επικαλύπτουν σενάρια σε στοιχεία, ακολουθώντας τους ίδιους μηχανισμούς με τους Smart Accounts. Κάθε νέα συναλλαγή που δημιουργείται χρησιμοποιώντας ένα έξυπνο στοιχείο θα επιβεβαιώνεται πρώτα από το σενάριο και μόνο μετά από το blockchain.

Αξίζει να σημειωθούν οι ακόλουθες διαφορές μεταξύ έξυπνων στοιχείων και έξυπνων λογαριασμών:

  1. Στον κωδικό ενός έξυπνου περιουσιακού στοιχείου, είναι αδύνατο να ελέγξετε τις αποδείξεις (μιλήσαμε για αυτές στο πρώτο άρθρο).
  2. Στον κωδικό έξυπνου λογαριασμού, μπορείτε να ελέγξετε το ExchangeTransaction μόνο εάν ο λογαριασμός σας είναι λογαριασμός αντιστοίχισης. Διαφορετικά, ελέγχεται μόνο η παραγγελία. Στον κωδικό έξυπνου στοιχείου, δεν μπορείτε να ελέγξετε απευθείας την παραγγελία, μπορείτε να ελέγξετε το ExchangeTransaction και, εάν είναι απαραίτητο, να εξαγάγετε μια παραγγελία από αυτό.
  3. Ένα έξυπνο στοιχείο, σε αντίθεση με έναν έξυπνο λογαριασμό, δεν έχει κατάσταση, αλλά εξακολουθούμε να έχουμε πρόσβαση στις καταστάσεις λογαριασμού από το σενάριο.

Τα έξυπνα περιουσιακά στοιχεία απλοποιούν σημαντικά τη σύνταξη των συμβολαίων, καθιστώντας την υλοποίηση πολλών περιπτώσεων συνοπτική και κομψή.

Πάγωμα περιουσιακών στοιχείων

Για να παγώσει τα περιουσιακά στοιχεία σε ένα συγκεκριμένο ύψος μπλοκ Ύψος στόχου, μπορείτε απλώς να ορίσετε αυτήν την τιμή στο σενάριο του παρακάτω έξυπνου στοιχείου:

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

Συγκεκριμένη κατάσταση αντιστοιχίας

Για να ορίσετε μια συγκεκριμένη αντιστοίχιση ως την επιθυμητή, μπορείτε να ορίσετε τη διεύθυνσή της ως αποστολέα σε ένα σενάριο έξυπνου στοιχείου που μοιάζει με αυτό:

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

«Λευκή λίστα» παραληπτών

Για να επιτρέψετε την αποστολή διακριτικών μόνο σε συγκεκριμένους λογαριασμούς - για να δημιουργήσετε μια "λευκή λίστα" παραληπτών - μπορείτε να χρησιμοποιήσετε ένα έξυπνο στοιχείο με το ακόλουθο σχήμα που ελέγχει τη συμπερίληψη στη λίστα:

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
}

Για λόγους ασφαλείας και αποδεδειγμένης πληρότητας της γλώσσας, η λίστα δεν περιέχει εφαρμογή επαναλήπτη. Ως εκ τούτου ορίζεται ως ένα σύνολο από συγκεκριμένα στοιχεία.

«Μαύρη λίστα» παραληπτών

Ομοίως, για να απαγορεύσετε την αποστολή διακριτικών σε συγκεκριμένους λογαριασμούς, μπορείτε να δημιουργήσετε μια «μαύρη λίστα». Σε αυτήν την περίπτωση, χρησιμοποιείται ακριβώς το ίδιο έξυπνο στοιχείο, αλλά με επιλεγμένη τη διεύθυνση για να διασφαλιστεί ότι δεν βρίσκεται στη μαύρη λίστα:

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
}

Αποστολή με άδεια του εκδότη

Χρησιμοποιώντας ένα έξυπνο στοιχείο, μπορείτε επίσης να ορίσετε την επιλογή αποστολής ενός έξυπνου στοιχείου μόνο με την άδεια του εκδότη (ετικέτα δέσμευσης/χρέους). Ο εκδότης εκφράζει τη συγκατάθεσή του τοποθετώντας το αναγνωριστικό συναλλαγής στην κατάσταση του λογαριασμού του:

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

Ανταλλάξτε μόνο για ορισμένα νομίσματα

Ένα έξυπνο περιουσιακό στοιχείο επιτρέπει την ανταλλαγή του μόνο για ορισμένα νομίσματα. Για παράδειγμα, για να επιτρέπεται η ανταλλαγή μόνο για Bitcoins, θα μπορούσατε να χρησιμοποιήσετε τον ακόλουθο κώδικα:

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

Συναλλαγές ανά τιμή από το μαντείο

Στο σενάριο έξυπνου περιουσιακού στοιχείου, μπορείτε να ορίσετε άδεια για συναλλαγές μόνο στην τιμή που καθορίζεται στην κατάσταση ενός αξιόπιστου χρησμού. Ακολουθεί ένα παράδειγμα τέτοιου σεναρίου:

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
}

Εδώ βρισκόμαστε αντιμέτωποι με ένα μη προφανές σημείο κατά τον έλεγχο της ταυτότητας του περιουσιακού στοιχείου με το οποίο πραγματοποιείται η διαπραγμάτευση. Το θέμα είναι ότι αν δεν οριστεί το αναγνωριστικό στοιχείου, τότε μιλάμε για WAVES. Στο σενάριο, φροντίζουμε οι συναλλαγές να γίνονται παράλληλα με τα WAVES, ακριβώς με αυτόν τον τρόπο.

Σταθερή αύξηση τιμής

Μπορείτε να ορίσετε μια σταθερή τιμή για ένα έξυπνο στοιχείο, το οποίο θα αυξάνεται βήμα προς βήμα σε μια δεδομένη αναλογία. Ακολουθεί ένα παράδειγμα ενός σεναρίου ενεργητικού του οποίου η τιμή θα αυξάνεται κατά 5% κάθε 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
}


Διαστημικές συναλλαγές

Επίσης, χάρη στο σενάριο, η διαπραγμάτευση ενός έξυπνου περιουσιακού στοιχείου μπορεί να περιοριστεί σε προκαθορισμένα διαστήματα. Ακολουθεί ένα παράδειγμα τέτοιου σεναρίου:

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

Στο σενάριο φροντίζουμε ότι από την έναρξη της διαπραγμάτευσης Ύψος εκκίνησης όχι περισσότερο από περιορίσει διαστήματα. Το μήκος του διαστήματος είναι ίσο με τον αριθμό των μπλοκ που καθορίζονται στο πεδίο διάστημα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο