En dos artículos anteriores, hablamos sobre cuentas inteligentes y cómo se pueden usar para realizar subastas y crear programas de lealtad , y también para ayudar a garantizar la transparencia de los instrumentos financieros .
Ahora consideraremos los activos inteligentes y varios casos de su aplicación, incluida la congelación de activos y la creación de restricciones en las transacciones en direcciones específicas.Waves Smart Assets permite a los usuarios superponer scripts en activos, siguiendo la misma mecánica que con las cuentas inteligentes. Cada nueva transacción creada usando el activo inteligente será confirmada primero por el script, y solo luego por la cadena de bloques.
Vale la pena señalar las siguientes diferencias entre activos inteligentes y cuentas inteligentes:
- Es imposible verificar las pruebas en el código de activo inteligente (hablamos de ellas en el primer artículo ).
- En el código de la cuenta inteligente, puede verificar ExchangeTransaction solo si su cuenta es una cuenta coincidente. De lo contrario, solo se verifica el pedido. No puede verificar el pedido directamente en el código de activo inteligente, puede verificar ExchangeTransaction y, si es necesario, extraer el pedido de él.
- Un activo inteligente, a diferencia de una cuenta inteligente, no tiene un estado, pero aún tenemos acceso a los estados de la cuenta desde el script.
Los activos inteligentes simplifican enormemente la redacción de contratos, haciendo que la implementación de muchos casos sea concisa y elegante.
Congelación de activosPara congelar activos a una determinada
altura de bloque
targetHeight , simplemente puede establecer este valor en el script del siguiente activo inteligente:
let targetHeight = 1500000 height >= targetHeight height - , .
Condición específica de MatcherPara establecer una coincidencia específica como desee, puede especificar su dirección como remitente en el script de activos inteligentes de la siguiente forma:
match tx { case t : ExchangeTransaction => t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3") case _ => true }
Lista blanca de destinatariosPara permitir que los tokens se envíen solo a ciertas cuentas, para crear una "lista blanca" de destinatarios, puede usar un activo inteligente con el siguiente esquema, que verifica si está en la lista:
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 }
Por seguridad y consistencia comprobable del lenguaje, la lista no contiene una implementación de iterador. Por lo tanto, se define como un conjunto de elementos específicos.
Destinatarios de la lista negraDel mismo modo, para prohibir el envío de tokens a ciertas cuentas, puede crear una "lista negra". En este caso, se usa exactamente el mismo activo inteligente, pero con la dirección marcada por ausencia en la lista negra:
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 }
Envío con permiso del emisorAl usar un activo inteligente, también puede configurar la opción de enviar un activo inteligente solo con el permiso del emisor
(etiqueta de compromiso / deuda ). El emisor expresa su consentimiento colocando la identificación de la transacción al estilo de su cuenta:
match tx { case t : TransferTransaction => let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4")) #, ID isDefined(getInteger(issuer, toBase58String(t.id))) case _ => false }
Cambiar solo por ciertas monedasUn activo inteligente permite permiso para cambiarlo solo por ciertas monedas. Por ejemplo, para permitir el intercambio solo de bitcoins, puede usar el siguiente código:
let BTCId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' match tx { case t : ExchangeTransaction => t.sellOrder.assetPair.priceAsset == BTCId || t.sellOrder.assetPair.amountAsset == BTCId case _ => true }
Comercio a precio de oráculoEn el script de activos inteligentes, puede establecer el permiso para comerciar solo al precio fijado en la historia del oráculo confiable. Aquí hay un ejemplo de tal 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 }
Aquí nos enfrentamos a un momento no obvio al verificar la identificación del activo con el que se realiza la operación. El hecho es que si la identificación del activo no está definida, entonces estamos hablando de WAVES. En el script, nos aseguramos de que el comercio esté emparejado con WAVES, de esta manera.
Aumento de precio fijoPuede establecer un precio fijo para un activo inteligente, que aumentará gradualmente en una proporción determinada. Aquí hay un script de activos de ejemplo, cuyo precio aumentará en un 5% cada 1000 bloques:
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 }
Intervalo de comercioAdemás, gracias al script, el comercio de activos inteligentes puede limitarse a intervalos predeterminados. Aquí hay un ejemplo de tal script:
let startHeight = 10000 let interval = 44000 let limit = 1500 match tx { case t: TransferTransaction | MassTransferTransaction | ExchangeTransaction => (height - startHeight) % interval < limit case _ => true }
En el script, nos aseguramos de que no
hayan pasado más de los intervalos
límite desde el inicio de la negociación
startHeight . La longitud del intervalo es igual al número de bloques especificados en el campo de
intervalo .