Programa de afiliados de código abierto descentralizado en la cadena de bloques Waves

Un programa de afiliados descentralizado en la cadena de bloques Waves, implementado como parte de una subvención de Waves Labs por el equipo de Bettex.

La publicación no es publicitaria.
! El programa es de código abierto, su uso y distribución es gratuita. La aplicación del programa estimula el desarrollo de aplicaciones dApp y, en general, promueve la descentralización, lo cual es beneficioso para todos los usuarios de la red.

imagen

Introducido por dApp para programas de afiliados es una plantilla para proyectos que incluyen afiliados como parte de su funcionalidad. El código se puede usar como plantilla para copiar, como biblioteca o como conjunto de ideas para implementación técnica.

En términos de funcionalidad, este es un sistema de afiliación regular que implementa el registro con un referente, la acumulación de recompensas en varios niveles por referencias y la motivación para el registro en el sistema (devolución de efectivo). El sistema es dApp "puro", es decir, la aplicación web interactúa directamente con la cadena de bloques sin su backend, base de datos, etc.

Se utilizan técnicas que también pueden ser útiles en muchos otros proyectos:

  • Llamar a una cuenta inteligente a crédito con reembolso inmediato (en el momento de la llamada, no hay tokens en la cuenta para pagar la llamada, pero aparecen allí como resultado de la llamada).
  • PoW-captcha: protección contra llamadas automatizadas de alta frecuencia de funciones de cuentas inteligentes, un análogo de captcha, pero a través de la prueba del uso de recursos informáticos.
  • Solicitud de claves de datos por plantilla.

La aplicación consta de:

  • código de cuenta inteligente en el idioma ride4dapps (que, por diseño, se fusionó con la cuenta inteligente principal, para la cual debe implementar la funcionalidad de afiliado);
  • js wrappers que implementan el nivel de abstracción sobre la API WAVES NODE REST;
  • código en el marco vuejs, que es un ejemplo del uso de la biblioteca y el código RIDE.

Describimos todas estas características.

Llame a una cuenta inteligente a crédito con reembolso inmediato

Las llamadas a InvokeScript requieren una tarifa de la cuenta que inicia la transacción. Esto no es un problema si está haciendo un proyecto para geeks de blockchain que tienen algunos tokens WAVES en su cuenta, pero si el producto está destinado a un uso generalizado, esto se convierte en un problema grave. Después de todo, el usuario debe asegurarse de comprar tokens WAVES (u otro activo adecuado con el que pueda pagar las transacciones), lo que aumenta el umbral ya considerable para ingresar al proyecto. Podemos distribuir activos a los usuarios, lo que nos permitirá pagar las transacciones y enfrentar el riesgo de su mal uso cuando se crean sistemas automatizados para bombear activos líquidos de nuestro sistema.

Sería muy conveniente si fuera posible hacer que InvokeScript llame "a expensas del destinatario" (la cuenta inteligente en la que está instalado el script), y existe tal posibilidad, aunque no de una manera obvia.

Si ejecuta ScriptTransfer dentro de InvokeScript a la dirección de la persona que llama, que compensa los tokens gastados en la tarifa, entonces dicha llamada tendrá éxito, incluso si no había activos en la cuenta de llamadas en el momento de la llamada. Esto es posible debido al hecho de que se verifica un número suficiente de tokens después de que se llama una transacción, y no antes, para que sea posible realizar transacciones a crédito sujetas a su reembolso inmediato.

ScriptTransfer (i.caller, i.fee, unit)

El siguiente código reembolsa la tarifa gastada a expensas de la cuenta inteligente. Para protegerse contra el mal uso de esta función, debe usar el cheque de que la persona que llama está gastando una tarifa en el activo correcto y dentro de límites razonables:

func checkFee(i:Invocation) = { if i.fee > maxFee then throw(“unreasonable large fee”) else if i.feeAssetId != unit then throw(“fee must be in WAVES”) else true } 

Además, la protección contra el desperdicio de fondos malicioso y sin sentido requiere protección contra llamadas automáticas (PoW-captcha)

PoW-captcha

La idea del captcha de prueba de trabajo no es nueva y ya se ha implementado en varios proyectos, incluidos los implementados sobre la base de WAVES. La idea es que para la acción que desperdicia los recursos de nuestro proyecto, la persona que llama también debe gastar sus propios recursos, lo que hace que el ataque al agotamiento de los recursos sea bastante costoso. Para una validación muy fácil y de bajo costo de que el remitente de la transacción ha resuelto la tarea PoW, hay una verificación para la identificación de la transacción:

if take (toBase58String (i.transactionId), 3)! = "123" y luego arrojar ("error en la prueba de trabajo") más

Para realizar una transacción, la persona que llama debe seleccionar dichos parámetros para que su código base58 (id) comience en 123, lo que corresponde a un promedio de un par de decenas de segundos de tiempo de procesador y generalmente es razonable para nuestra tarea. Si se requiere un PoW más simple o más complejo, entonces la tarea es fácil de refinar de una manera obvia.

Solicitud de claves de datos por plantilla

Para usar blockchain como base de datos, es vital contar con herramientas API para consultar la base de datos como plantillas key-val. Tal kit de herramientas apareció a principios de julio de 2019 como el parámetro ? Matches para la solicitud / direcciones / datos de API REST ? Matches = regexp . Ahora, si necesitamos obtener no una clave y no todas las claves de una aplicación web a la vez, sino solo un grupo, entonces podemos hacer una selección por el nombre de la clave. Por ejemplo, en este proyecto, las transacciones de retiro se codifican como

 withdraw_${userAddress}_${txid} 

que le permite obtener una lista de transacciones para retirar fondos para cualquier dirección dada de acuerdo con la plantilla:

 ?matches=withdraw_${userAddress}_.* 

Ahora analizaremos los componentes de la solución llave en mano.

Código Vuejs

El código es una demostración funcional cercana a un proyecto real. Implementa el inicio de sesión a través de Waves Keeper y trabaja con la biblioteca affiliate.js, con la ayuda de la cual registra al usuario en el sistema, sondea los datos de las transacciones y también le permite retirar los fondos ganados a la cuenta del usuario.

imagen

Código de paseo

Consiste en registrar, financiar y retirar funciones.

La función de registro se registra con el sistema del usuario. Tiene dos parámetros: el referente (dirección de referencia) y el parámetro salt, que no se usa en el código de función, que se necesita para seleccionar la identificación de la transacción (tarea PoW-captcha).

La función (como las otras funciones de este proyecto) utiliza la técnica de préstamo, el resultado de la función es financiar una tarifa por llamar a esta función. Gracias a esta decisión, el usuario que acaba de crear la billetera puede trabajar inmediatamente con el sistema y no tiene que preocuparse por la cuestión de comprar o recibir un activo que le permite pagar una tarifa de transacción.

El resultado de la función de registro son dos entradas:

 ${owner)_referer = referer ${referer}_referral_${owner} = owner 

Esto permite búsquedas directas e inversas (referencia de este usuario y todas las referencias de este usuario).

Es más probable que la función de fondo sea una plantilla para desarrollar una funcionalidad real. En la forma presentada, toma todos los fondos transferidos por la transacción y los distribuye a las cuentas de los referentes 1, 2, 3, a la cuenta de "devolución de efectivo" y la cuenta de "cambio" (todo lo que queda al distribuir a las cuentas anteriores cae aquí).

El reembolso es un medio para estimular al usuario final a participar en el sistema de referencia. El usuario puede retirar la parte de la comisión pagada por el sistema en forma de "devolución de efectivo" de la misma manera que las recompensas por referencias.

Cuando se utiliza el sistema de referencia, la función del fondo debe modificarse, incorporarse a la lógica principal de la cuenta inteligente en la que funcionará el sistema. Por ejemplo, si la tarifa de referencia se paga por la apuesta realizada, entonces la función del fondo debe integrarse en la lógica donde se realiza la apuesta (o se realiza otra acción específica, por la cual se paga la tarifa). Esta función codifica tres niveles de recompensas de referencia. Si necesita hacer más o menos niveles, esto también se corrige en el código. El porcentaje de la remuneración se establece por las constantes de nivel 1-nivel 3, en el código se considera como cantidad * nivel / 1000 , es decir, el valor 1 corresponde al 0.1% (esto también se puede cambiar en el código).

La llamada a la función cambia el saldo de la cuenta y también crea entradas con el fin de iniciar sesión en el formulario:

 fund_address_txid = address:owner:inc:level:timestamp   timestamp ( )     func getTimestamp() = { let block = extract(blockInfoByHeight(height)) toString(block.timestamp) } 

Es decir, el tiempo de transacción es el tiempo del bloque en el que se encuentra. Esto es más confiable que el uso de la marca de tiempo de la transacción en sí, especialmente porque no es accesible desde invocable.
La función de retiro muestra todas las recompensas acumuladas en la cuenta de usuario. Crea entradas para fines de registro:

 # withdraw log: withdraw_user_txid=amount:timestamp 

App

La parte principal de la aplicación es la biblioteca affiliate.js, que es un puente entre los modelos de datos afiliados y la API WAVES NODE REST. Implementa un nivel de abstracción independiente del marco (se puede usar cualquiera). Las funciones activas (registrar, retirar) suponen que Waves Keeper está instalado en el sistema, la propia biblioteca no verifica esto.

Implementa métodos:

 fetchReferralTransactions fetchWithdrawTransactions fetchMyBalance fetchReferrals fetchReferer withdraw register 

La funcionalidad de los métodos es obvia por los nombres, los parámetros y los datos devueltos que se describen en el código. La función de registro requiere comentarios adicionales: inicia el ciclo de coincidencia de id de transacción para que comience en 123. Este es el PoW-captcha descrito anteriormente, que protege contra registros masivos. La función encuentra la transacción con la identificación deseada y luego la firma a través de Waves Keeper.

El programa de afiliación de DEX está disponible en GitHub.com .

Source: https://habr.com/ru/post/459590/


All Articles