Waves slimme activa: zwarte en witte lijsten, intervalhandel

Waves slimme activa: zwarte en witte lijsten, intervalhandel

In de vorige twee artikelen hebben we gesproken over slimme accounts en hoe deze kunnen worden gebruikt voor het houden van veilingen en het opzetten van loyaliteitsprogramma'sen ook helpen zorgen voor transparantie van financiële instrumenten.

Nu zullen we kijken naar slimme activa en verschillende gevallen van het gebruik ervan, waaronder het bevriezen van activa en het creëren van beperkingen op transacties op specifieke adressen.

Met Waves Smart Assets kunnen gebruikers scripts over assets heen leggen, volgens dezelfde mechanismen als Smart Accounts. Elke nieuwe transactie die met een slimme asset wordt gemaakt, wordt eerst door het script bevestigd en pas daarna door de blockchain.

Het is de moeite waard om de volgende verschillen tussen slimme activa en slimme accounts te vermelden:

  1. In de code van een slim bezit is het onmogelijk om proefdrukken te controleren (we hebben erover gesproken). in het eerste artikel).
  2. In de slimme accountcode kunt u ExchangeTransaction alleen controleren als uw account een matcheraccount is. Anders wordt alleen de bestelling gecontroleerd. In de smart asset code kunt u de order niet direct controleren; u kunt wel de Wisseltransactie controleren en hier eventueel een order uit halen.
  3. Een smart asset heeft, in tegenstelling tot een smart account, geen status, maar we hebben nog steeds toegang tot accountstatussen vanuit het script.

Slimme assets vereenvoudigen het schrijven van contracten enorm, waardoor de implementatie van veel zaken beknopt en elegant wordt.

Bevriezing van activa

Om activa te bevriezen tot een bepaalde blokhoogte doelHoogte, kun je deze waarde eenvoudig instellen in het script van de volgende slimme asset:

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

Matcher-specifieke voorwaarde

Om een ​​specifieke matcher als de gewenste in te stellen, kunt u het adres ervan als afzender instellen in een slim activascript dat er als volgt uitziet:

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

"Witte lijst" van ontvangers

Om toe te staan ​​dat tokens alleen naar bepaalde accounts worden verzonden - om een ​​"witte lijst" van ontvangers te creëren - kunt u een slimme asset gebruiken met het volgende schema dat controleert op opname in de lijst:

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
}

Om veiligheidsredenen en aantoonbare volledigheid van de taal bevat de lijst geen iteratorimplementatie. Daarom wordt het gedefinieerd als een reeks concrete elementen.

"Zwarte lijst" van ontvangers

Om het verzenden van tokens naar bepaalde accounts te verbieden, kunt u op dezelfde manier een ‘zwarte lijst’ maken. In dit geval wordt precies hetzelfde slimme activum gebruikt, maar dan wordt het adres gecontroleerd om er zeker van te zijn dat het niet op de zwarte lijst staat:

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
}

Verzenden met toestemming van de uitgever

Bij gebruik van een smart asset kunt u ook de optie instellen om een ​​smart asset alleen te versturen met toestemming van de uitgever (label van verplichting/schuld). De uitgever geeft zijn toestemming door het transactie-ID in de status van zijn rekening te plaatsen:

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

Alleen inwisselen voor bepaalde munten

Een slim bezit geeft toestemming om het alleen voor bepaalde munten in te wisselen. Om bijvoorbeeld alleen de uitwisseling van Bitcoins toe te staan, kunt u de volgende code gebruiken:

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

Handelen op prijs van het orakel

In het slimme activascript kunt u toestemming instellen om alleen te handelen tegen de prijs die is vastgelegd in de staat van een betrouwbaar orakel. Hier is een voorbeeld van zo’n script:

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
}

Hier worden we geconfronteerd met een niet voor de hand liggend punt bij het controleren van de ID van het activum waarmee wordt gehandeld. Het punt is dat als de asset-ID niet is gedefinieerd, we het over WAVES hebben. In het script zorgen we ervoor dat de handel samen met WAVES wordt uitgevoerd, precies op deze manier.

Vaste prijsverhoging

U kunt voor een slimme asset een vaste prijs instellen, die stap voor stap in een bepaalde verhouding stijgt. Hier is een voorbeeld van een activascript waarvan de prijs elke 5 blokken met 1000% zal stijgen:

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
}


Intervalhandel

Dankzij het script kan de handel in een slim activum bovendien worden beperkt tot vooraf bepaalde intervallen. Hier is een voorbeeld van zo’n script:

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

In het script zorgen we ervoor dat dit vanaf het begin van de handel gebeurt beginHoogte maximaal begrenzing intervallen. De lengte van het interval is gelijk aan het aantal blokken dat in het veld is opgegeven interval.

Bron: www.habr.com

Voeg een reactie