In zwei vorherigen Artikeln haben wir über intelligente Konten gesprochen und darüber, wie sie zur Durchführung von Auktionen und zur Erstellung von Treueprogrammen verwendet werden können und auch dazu beitragen , die Transparenz von Finanzinstrumenten zu gewährleisten .
Jetzt werden wir uns mit intelligenten Assets und mehreren Fällen ihrer Anwendung befassen, einschließlich des Einfrierens von Assets und der Schaffung von Einschränkungen für Transaktionen an bestimmten Adressen.Mit Waves Smart Assets können Benutzer Skripts auf Assets überlagern, und zwar auf dieselbe Weise wie bei Smart Accounts. Jede neue Transaktion, die mit dem Smart Asset erstellt wurde, wird zuerst vom Skript und erst dann von der Blockchain bestätigt.
Beachten Sie die folgenden Unterschiede zwischen Smart Assets und Smart Accounts:
- Es ist unmöglich, Beweise im Smart Asset Code zu überprüfen (wir haben im ersten Artikel darüber gesprochen ).
- Im Code des Smart-Kontos können Sie ExchangeTransaction nur überprüfen, wenn Ihr Konto ein Übereinstimmungskonto ist. Andernfalls wird nur die Bestellung geprüft. Sie können die Bestellung nicht direkt im Smart Asset-Code überprüfen, Sie können die ExchangeTransaction überprüfen und bei Bedarf die Bestellung daraus extrahieren.
- Ein Smart Asset hat im Gegensatz zu einem Smart Account keinen Status, aber wir haben weiterhin Zugriff auf die Kontostatus über das Skript.
Intelligente Assets vereinfachen das Verfassen von Verträgen erheblich und machen die Implementierung vieler Fälle präzise und elegant.
Einfrieren von AssetsUm Assets auf eine bestimmte
targetHeight- Blockhöhe einzufrieren, können Sie diesen Wert einfach im Skript des folgenden Smart Assets festlegen:
let targetHeight = 1500000 height >= targetHeight height - , .
Spezifische Matcher-BedingungUm ein bestimmtes Matchr wie gewünscht festzulegen, können Sie seine Adresse als Absender im Smart Asset-Skript des folgenden Formulars angeben:
match tx { case t : ExchangeTransaction => t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3") case _ => true }
Weiße Liste der EmpfängerDamit Token nur an bestimmte Konten gesendet werden können - um eine „weiße Liste“ von Empfängern zu erstellen - können Sie ein Smart Asset mit dem folgenden Schema verwenden, mit dem überprüft wird, ob es in der Liste enthalten ist:
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 Gründen der Sicherheit und der nachweisbaren Sprachkonsistenz enthält die Liste keine Iterator-Implementierung. Daher wird es als eine Reihe spezifischer Elemente definiert.
Blacklist-EmpfängerUm das Senden von Token an bestimmte Konten zu verhindern, können Sie auf die gleiche Weise eine „schwarze Liste“ erstellen. In diesem Fall wird genau dasselbe Smart Asset verwendet, wobei jedoch die Adresse auf Abwesenheit auf der schwarzen Liste überprüft wird:
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 }
Senden mit Genehmigung des EmittentenMit einem Smart Asset können Sie auch festlegen, dass ein Smart Asset nur mit Genehmigung des Emittenten gesendet werden soll
(Commitment / Debt Label ). Der Emittent erklärt sich damit einverstanden, indem er die Transaktions-ID in den Stil seines Kontos einfügt:
match tx { case t : TransferTransaction => let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")) #, ID isDefined(getInteger(issuer, toBase58String(t.id))) case _ => false }
Tauschen Sie nur gegen bestimmte MünzenEin Smart Asset erlaubt die Erlaubnis, es nur gegen bestimmte Münzen umzutauschen. Um beispielsweise den Umtausch nur gegen Bitcoins zuzulassen, können Sie den folgenden Code verwenden:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' match tx { case t : ExchangeTransaction => t.sellOrder.assetPair.priceAsset == BTCId || t.sellOrder.assetPair.amountAsset == BTCId case _ => true }
Handel zum OrakelpreisIm Smart Asset-Skript können Sie die Berechtigung zum Handeln nur zu dem Preis festlegen, der in der Geschichte des zuverlässigen Orakels festgelegt ist. Hier ist ein Beispiel für ein solches Skript:
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 sehen wir uns einem nicht offensichtlichen Moment gegenüber, wenn wir die ID des Vermögenswerts überprüfen, mit dem der Handel ausgeführt wird. Tatsache ist, dass wir über WAVES sprechen, wenn die Asset-ID nicht definiert ist. Im Skript stellen wir auf diese Weise sicher, dass der Handel mit WAVES gepaart ist.
FestpreiserhöhungSie können einen festen Preis für ein intelligentes Asset festlegen, der sich in einem bestimmten Anteil schrittweise erhöht. Hier ist ein Beispiel für ein Asset-Skript, dessen Preis alle 1000 Blöcke um 5% steigt:
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 }
IntervallhandelDank des Skripts kann der Handel mit intelligenten Assets auch auf vorgegebene 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 < limit case _ => true }
Im Skript stellen wir sicher, dass seit Beginn des Handels
startHeight nicht mehr als
Grenzintervalle verstrichen sind . Die Intervalllänge entspricht der Anzahl der im
Intervallfeld angegebenen Blöcke.