
In den beiden vorherigen Artikeln haben wir über Smart-Accounts und deren Verwendung gesprochen , und sie helfen auch dabei, .
Jetzt betrachten wir Smart-Assets und einige Anwendungsfälle, einschließlich der Einfrierung von Vermögenswerten und der Festlegung von Transaktionsbeschränkungen für bestimmte Adressen.
Waves Smart-Assets ermöglichen es den Nutzern, Skripte auf Assets anzuwenden, wobei die gleiche Mechanik wie bei Smart-Accounts verwendet wird. Jede neue Transaktion, die mit einem Smart-Asset erstellt wird, wird zunächst vom Skript und dann von der Blockchain bestätigt.
Es sind folgende Unterschiede zwischen Smart-Assets und Smart-Accounts zu beachten:
- Im Code des Smart-Assets kann keine Überprüfung von Proofs erfolgen (über die wir gesprochen haben ).
- Im Code des Smart-Accounts kann die ExchangeTransaction nur dann überprüft werden, wenn Ihr Konto ein Matching-Account ist. Andernfalls wird nur der Auftrag überprüft. Im Code des Smart-Assets kann der Auftrag nicht direkt überprüft werden, stattdessen kann die ExchangeTransaction überprüft werden, aus der bei Bedarf der Auftrag extrahiert werden kann.
- Ein Smart-Asset hat im Gegensatz zu einem Smart-Konto keinen Zustand, aber wir haben dennoch Zugang zu den Zuständen der Konten aus dem Skript.
Smart-Assets erleichtern das Schreiben von Verträgen erheblich und machen die Umsetzung vieler Anwendungsfälle prägnant und elegant.
Vermögenswerte einfrieren
Um Vermögenswerte bis zu einer bestimmten Blockhöhe einzufrieren targetHeight, können Sie diesen Wert im Skript des folgenden Smart-Assets einfach festlegen:
let targetHeight = 1500000
height >= targetHeight
height - eine Funktion der Sprache, die die aktuelle Höhe zurückgibt.
Bedingung für einen bestimmten Matcher
Um einen bestimmten Matcher als gewünscht festzulegen, können Sie seine Adresse im Skript des Smart-Assets als Absender angeben:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
Whitelist der Empfänger
Um das Senden von Token nur auf bestimmte Konten zu erlauben — eine „Whitelist“ der Empfänger zu erstellen — können Sie ein Smart-Asset mit folgendem Schema verwenden, das die Zugehörigkeit zur Liste überprüft:
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
}
Aus Sicherheits- und Nachweisgründen enthält die Liste keine Iterator-Implementierung. Daher wird sie als Menge konkreter Elemente definiert.
Schwarzliste der Empfänger
Ebenso können Sie eine "Schwarzliste" erstellen, um den Versand von Tokens an bestimmte Konten zu verhindern. Hierbei wird ein absolut identischer Smart-Asset verwendet, jedoch mit einer Adressüberprüfung, um sicherzustellen, dass diese nicht auf der Schwarzliste steht:
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
}
Versand mit Genehmigung des Emittenten
Mit einem Smart-Asset können Sie auch die Option einrichten, dass Smart-Assets nur mit Genehmigung des Emittenten gesendet werden. (commitment/debt label). Der Emittent erklärt sein Einverständnis, indem er die Transaktions-ID im Zustand seines Kontos platziert:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
# sicherstellen, dass die ID der aktuellen Transaktion im Zustand des Emittenten vorhanden ist
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Austausch nur gegen bestimmte Münzen
Der Smart-Asset erlaubt es, den Austausch nur gegen bestimmte Münzen zu autorisieren. Zum Beispiel, um den Austausch nur gegen Bitcoins zu erlauben, kann der folgende Code verwendet werden:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
match tx {
case t : ExchangeTransaction =>
t.sellOrder.assetPair.priceAsset == BTCId ||
t.sellOrder.assetPair.amountAsset == BTCId
case _ => true
}
Handel zum Preis des Orakels
Im Skript des Smart-Assets kann erlaubt werden, dass nur zum zum Zustand des zuverlässigen Orakels fixierten Preis gehandelt wird. Hier ist ein Beispiel für ein solches Skript:
let oracle = Address(base58'3PLNmokt22NrSiNvCLvwMUP84LCMJqbXwAD')
let assetId = toBase58String(base58'oWgJN6YGZFtZrV8BWQ1PGktZikgg7jzGmtm16Ktyvjd')
match tx {
#verhindern die Übertragung des Assets
case t: TransferTransaction | MassTransferTransaction => false
case e: ExchangeTransaction =>
#sicherstellen, dass der Handel zum im Oracle-Status für dieses Asset festgelegten Preis erfolgt
let correctPrice = e.price == extract(getInteger(oracle, assetId))
#sicherstellen, dass der Handel gegen WAVES erfolgt
let correctPriceAsset = !isDefined(e.sellOrder.assetPair.priceAsset)
correctPrice && correctPriceAsset
case _ => true
}
Hier stoßen wir auf einen nicht offensichtlichen Punkt bei der Überprüfung der ID des Assets, mit dem gehandelt wird. Das Problem ist, dass, wenn die ID des Assets nicht definiert ist, es sich um WAVES handelt. Im Skript stellen wir sicher, dass der Handel in Kombination mit WAVES erfolgt, genau so.
Feste Preissteigerung
Es kann ein fester Preis für den Smart-Asset festgelegt werden, der schrittweise in einem bestimmten Verhältnis erhöht wird. Hier ist ein Beispiel für ein Asset-Skript, dessen Preis alle 1000 Blöcke um 5% erhöht wird:
let startPrice = 10
let startHeight = 1000
let interval = 1000
# um wie viel Prozent der Preis pro Schritt steigt
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
}
Intervallhandel
Dank des Skripts kann der Handel mit Smart Assets auch auf zuvor definierte Intervalle beschränkt werden. Hier ist ein Beispiel für ein solches Skript:
let startHeight = 10000
let interval = 44000
let limit = 1500
match tx {
case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction =>
(height - startHeight) % interval true
}
Im Skript stellen wir sicher, dass seit dem Beginn des Handels startHeight nicht mehr als limit Intervalle vergangen sind. Die Länge des Intervalls entspricht der Anzahl der Blöcke, die im Feld angegeben sind. interval.
Quelle: habr.com
