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

Un programa de afiliados descentralizado basado en Waves blockchain, implementado como parte de una subvención de Waves Labs por parte del equipo de Bettex.

La publicación no está patrocinada! El programa es de código abierto, su uso y distribución es gratuito. El uso del programa estimula el desarrollo de aplicaciones dApp y, en general, promueve la descentralización, lo que es beneficioso para todos los usuarios de la Red.

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

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

En términos de funcionalidad, este es un sistema de afiliados ordinario que implementa el registro con un remitente, la acumulación de remuneración de varios niveles por referencias y la motivación para registrarse en el sistema (reembolso). El sistema es una dApp “pura”, es decir, la aplicación web interactúa directamente con la cadena de bloques sin su propio 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 automáticas de alta frecuencia de funciones de cuentas inteligentes, similar a 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 de ride4dapps (que, según lo planeado, se fusiona con la cuenta inteligente principal, para lo cual debe implementar la funcionalidad de afiliado);
  • contenedor js que implementa una capa 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.

Describamos todas las características enumeradas.

Llamar a una cuenta inteligente a endeudarse con reembolso inmediato

Llamar a InvokeScript requiere el pago de una tarifa de la cuenta que inicia la transacción. Esto no es un problema si estás haciendo un proyecto para geeks de blockchain que tienen una cierta cantidad de tokens WAVES en su cuenta, pero si el producto está dirigido a las masas, esto se convierte en un problema grave. Después de todo, el usuario debe asistir a la compra de tokens WAVES (u otro activo adecuado que pueda usarse para pagar las transacciones), lo que aumenta el ya considerable umbral para ingresar al proyecto. Podemos distribuir activos a los usuarios a quienes se les permitirá pagar las transacciones y enfrentar el riesgo de su uso indebido cuando se creen sistemas automatizados para extraer activos líquidos de nuestro sistema.

Sería muy conveniente que fuera posible llamar a InvokeScript “a expensas del destinatario” (la cuenta inteligente en la que está instalado el script), y esta posibilidad existe, aunque no de forma obvia.

Si, dentro de InvokeScript, se realiza un ScriptTransfer a la dirección de la persona que llama, que compensa los tokens gastados en la tarifa, dicha llamada tendrá éxito, incluso si no había activos en la cuenta que llama en el momento de la llamada. Esto es posible porque la verificación de tokens suficientes se realiza después de que se llama a la transacción, y no antes de ella, por lo que es posible realizar transacciones a crédito, siempre que se canjeen de inmediato.

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

El siguiente código reembolsa la tarifa gastada utilizando fondos de la cuenta inteligente. Para protegerse contra el uso indebido de esta función, debe verificar que la persona que llama gaste la 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, para protegerse contra el desperdicio de fondos malicioso y sin sentido, se requiere protección contra llamadas automáticas (PoW-captcha).

captcha de PoW

La idea misma del captcha de prueba de trabajo no es nueva y ya se ha implementado en varios proyectos, incluidos los basados ​​en WAVES. El punto de la idea es que para realizar una acción que desperdicie los recursos de nuestro proyecto, la persona que llama también debe gastar sus propios recursos, lo que hace que un ataque de agotamiento de 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 el problema de PoW, hay una verificación en la identificación de la transacción:

if take(toBase58String(i.transactionId), 3) != “123” then throw(“prueba de trabajo fallida”) else

Para realizar una transacción, la persona que llama debe elegir dichos parámetros para que su código base58 (id) comience con los números 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 se puede modificar fácilmente de manera obvia.

Consultar claves de datos por plantilla

Para utilizar la cadena de bloques como base de datos, es vital contar con herramientas API para consultar la base de datos como un valor de clave utilizando plantillas. Tal conjunto de herramientas apareció a principios de julio de 2019 como un parámetro ?partidos en la solicitud de la API REST /direcciones/datos?coincidencias=regexp. Ahora, si necesitamos obtener más de una clave y no todas las claves a la vez desde la aplicación web, sino solo algún 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 retiro de fondos para cualquier dirección usando la plantilla:

?matches=withdraw_${userAddress}_.*

Ahora analicemos los componentes de la solución terminada.

codigo vuejs

El código es una demostración de trabajo, cerca de 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 a un usuario en el sistema, consulta los datos de la transacción y también le permite retirar los fondos ganados a la cuenta del usuario.

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

Código en RIDE

Consiste en funciones de registro, fondos y retiros.

La función de registro registra a un usuario en el sistema. Tiene dos parámetros: referente (dirección del remitente) 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 el resto de funciones de este proyecto) utiliza la técnica de préstamo, el resultado de la función es financiar el pago de una tarifa por llamar a esta función. Gracias a esta solución, un usuario que acaba de crear una billetera puede trabajar de inmediato con el sistema y no debe confundirse con la cuestión de adquirir o recibir un activo que le permita pagar una tarifa de transacción.

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

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

Esto permite búsquedas hacia adelante y hacia atrás (referencia del usuario dado y todas las referencias del usuario dado).

La función de fondo es más una plantilla para desarrollar una funcionalidad real. En el formulario presentado, toma todos los fondos transferidos por la transacción y los distribuye a las cuentas de referencia de los niveles 1, 2 y 3, a la cuenta de "reembolso" y a la cuenta de "cambio" (todo lo que queda durante la distribución a anterior cuentas llega aquí).

Cashback es un medio para incentivar al usuario final a participar en el sistema de referencia. La parte de la comisión pagada por el sistema en forma de “cashback” puede ser retirada por el usuario de la misma forma que las recompensas por referidos.

Al usar el sistema de referencia, la función de fondo debe modificarse, integrarse en la lógica principal de la cuenta inteligente en la que funcionará el sistema. Por ejemplo, si se paga una recompensa de referencia por una apuesta realizada, la función de fondo debe integrarse en la lógica donde se realiza la apuesta (o se realiza otra acción objetivo por la cual se paga la recompensa). Hay tres niveles de recompensas de referencia codificadas en esta función. Si desea hacer más o menos niveles, esto también se corrige en el código. El porcentaje de recompensa está establecido por las constantes level1-level3, en el código se calcula como cantidad * nivel / 1000, es decir, el valor 1 corresponde a 0,1% (esto también se puede cambiar en el código).

La llamada de función cambia el saldo de la cuenta y también crea entradas con el fin de registrar 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 la transacción es el tiempo del bloque en el que se encuentra. Esto es más confiable que usar la marca de tiempo de la transacción en sí, especialmente porque no está disponible desde el invocable.
La función de retiro retira todas las recompensas acumuladas a la cuenta del usuario. Crea entradas con fines de registro:

# withdraw log: withdraw_user_txid=amount:timestamp

solicitud

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

Implementa métodos:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

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

Programa de afiliados DEX disponible en GitHub.com.

Fuente: habr.com

Añadir un comentario