Activos inteligentes de Waves: listas blancas y negras, comercio de intervalos

Activos inteligentes de Waves: listas blancas y negras, comercio de intervalos

En los dos artículos anteriores hablamos sobre cuentas inteligentes y cómo se pueden utilizar. para realizar subastas y crear programas de fidelizacióny también ayudar garantizar la transparencia de los instrumentos financieros.

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:

  1. En el código de un activo inteligente, es imposible comprobar las pruebas (hablamos de ellas en el primer artículo).
  2. 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.
  3. 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.

Fuente: habr.com

Añadir un comentario