Ahora veremos los activos inteligentes y varios casos de su uso, incluida la congelación de activos y la creación de restricciones a las transacciones en direcciones específicas.
Waves Smart Assets permite a los usuarios superponer scripts en activos, siguiendo la misma mecánica que las cuentas inteligentes. Cada nueva transacción creada utilizando un 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:
En el código de un activo inteligente, es imposible comprobar las pruebas (hablamos de ellas en el primer artículo).
En el código de cuenta inteligente, puede verificar ExchangeTransaction solo si su cuenta es una cuenta de comparación. En caso contrario, sólo se comprueba el pedido. En el código de activo inteligente, no puede verificar la orden directamente; puede verificar ExchangeTransaction y, si es necesario, extraer una orden de ella.
Un activo inteligente, a diferencia de una cuenta inteligente, no tiene 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 activos
Para congelar activos a una determinada altura de bloque altura del objetivo, simplemente puede establecer este valor en el script del siguiente activo inteligente:
let targetHeight = 1500000
height >= targetHeight
height - функция языка, возращающая текущую высоту.
Condición específica del comparador
Para configurar un comparador específico como el deseado, puede configurar su dirección como remitente en un script de activo inteligente que se ve así:
match tx {
case t : ExchangeTransaction =>
t.sender == addressFromString("3PJaDyprvekvPXPuAtxrapacuDJopgJRaU3")
case _ => true
}
"Lista blanca" de destinatarios
Para 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 la inclusión 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 razones de seguridad y la integridad demostrable del lenguaje, la lista no contiene una implementación de iterador. Por tanto se define como un conjunto de elementos concretos.
"Lista negra" de destinatarios
Del mismo modo, para prohibir el envío de tokens a determinadas cuentas, puedes crear una “lista negra”. En este caso, se utiliza exactamente el mismo activo inteligente, pero con la dirección marcada para garantizar que no esté 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 autorización del emisor.
Al utilizar un activo inteligente, también puede configurar la opción para enviar un activo inteligente solo con el permiso del emisor. (etiqueta compromiso/deuda). El emisor expresa su consentimiento colocando el ID de la transacción en el estado de su cuenta:
match tx {
case t : TransferTransaction =>
let issuer = extract(addressFromString("3P6ms9EotRX8JwSrebeTXYVnzpsGCrKWLv4"))
#убеждаемся, что в стейте эмитента содержится ID текущей транзакции
isDefined(getInteger(issuer, toBase58String(t.id)))
case _ => false
}
Cambie solo por ciertas monedas
Un activo inteligente permite el permiso para cambiarlo sólo por determinadas monedas. Por ejemplo, para permitir únicamente el intercambio de Bitcoins, puedes utilizar 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 por precio del oráculo
En el script de activos inteligentes, puede establecer permiso para negociar solo al precio fijado en el estado de un oráculo confiable. A continuación se muestra un ejemplo de dicho 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 encontramos ante un punto no evidente a la hora de comprobar el ID del activo con el que se realiza la negociación. La cuestión es que si el ID del activo no está definido, entonces estamos hablando de WAVES. En el guión nos aseguramos de que las operaciones se realicen en conjunto con WAVES, exactamente de esta manera.
Aumento de precio fijo
Puede establecer un precio fijo para un activo inteligente, que aumentará paso a paso en una proporción determinada. A continuación se muestra un ejemplo de un script de activos cuyo precio aumentará 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
}
Comercio de intervalos
Además, gracias al script, la negociación de un activo inteligente se puede limitar a intervalos predeterminados. A continuación se muestra un ejemplo de dicho 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 desde el inicio del trading altura inicial no más que límitar intervalos. La longitud del intervalo es igual al número de bloques especificados en el campo intervalo.