Programa de afiliados descentralizado de código aberto no blockchain Waves

Um programa de afiliados descentralizado baseado no blockchain Waves, implementado como parte de uma concessão do Waves Labs pela equipe da Bettex.

Post não é patrocinado! O programa é de código aberto, seu uso e distribuição são gratuitos. O uso do programa estimula o desenvolvimento de aplicativos dApp e, em geral, promove a descentralização, o que é benéfico para todos os usuários da Rede.

Programa de afiliados descentralizado de código aberto no blockchain Waves

O dApp apresentado para programas de afiliados é um modelo para projetos que incluem afiliados como parte de sua funcionalidade. O código pode ser usado como um modelo para cópia, como uma biblioteca ou como um conjunto de ideias para implementação técnica.

Em termos de funcionalidade, este é um sistema de afiliados comum que implementa o registro com um referenciador, acumulação multinível de remuneração por referências e motivação para se registrar no sistema (cashback). O sistema é um dApp “puro”, ou seja, a aplicação web interage diretamente com a blockchain sem backend próprio, banco de dados, etc.

São utilizadas técnicas que também podem ser úteis em muitos outros projetos:

  • Chamada de conta inteligente a crédito com reembolso imediato (no momento da chamada, não há tokens na conta para pagar a chamada, mas eles aparecem lá como resultado da chamada).
  • PoW-captcha - proteção contra chamadas automatizadas de alta frequência de funções de contas inteligentes - semelhante ao captcha, mas por meio da comprovação do uso de recursos de computação.
  • Solicitação de chaves de dados por modelo.

A aplicação consiste em:

  • código de conta inteligente na linguagem ride4dapps (que, conforme planejado, é mesclado na conta inteligente principal, para a qual você precisa implementar a funcionalidade de afiliado);
  • js wrapper que implementa uma camada de abstração sobre a API WAVES NODE REST;
  • código na estrutura vuejs, que é um exemplo de uso da biblioteca e do código RIDE.

Vamos descrever todos os recursos listados.

Chamar uma conta inteligente em dívida com reembolso imediato

Chamar InvokeScript requer o pagamento de uma taxa da conta que inicia a transação. Isso não é um problema se você estiver fazendo um projeto para geeks de blockchain que possuem uma certa quantidade de tokens WAVES em sua conta, mas se o produto for voltado para as massas, isso se torna um problema sério. Afinal, o usuário deve se atentar para a compra dos tokens WAVES (ou outro ativo adequado que possa ser utilizado para pagar as transações), o que aumenta o já considerável patamar de entrada no projeto. Podemos distribuir ativos para usuários que terão permissão para pagar por transações e enfrentar o risco de seu uso indevido quando sistemas automatizados são criados para bombear ativos líquidos de nosso sistema.

Seria muito conveniente se fosse possível chamar o InvokeScript “às custas do destinatário” (a conta inteligente na qual o script está instalado), e essa possibilidade existe, embora não de forma óbvia.

Se, dentro do InvokeScript, for feito um ScriptTransfer para o endereço do chamador, que compensa os tokens gastos na taxa, essa chamada será bem-sucedida, mesmo que não haja ativos na conta chamadora no momento da chamada. Isso é possível porque a verificação de tokens suficientes é feita após a chamada da transação, e não antes dela, de modo que é possível fazer transações a crédito, desde que sejam resgatadas imediatamente.

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

O código abaixo reembolsa a taxa gasta usando fundos da conta inteligente. Para se proteger contra o uso indevido desse recurso, você deve verificar se o chamador gasta a taxa no ativo certo e dentro de limites razoáveis:

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
}

Além disso, para proteger contra desperdício de fundos malicioso e sem sentido, é necessária proteção contra chamada automática (PoW-captcha).

PoW-captcha

A própria ideia do captcha proof-of-work não é nova e já foi implementada em diversos projetos, inclusive os baseados em WAVES. O objetivo da ideia é que, para realizar uma ação que desperdice os recursos do nosso projeto, o chamador também deve gastar seus próprios recursos, o que torna um ataque de esgotamento de recursos bastante caro. Para uma validação muito fácil e de baixo custo de que o remetente da transação resolveu o problema de PoW, existe uma verificação de ID da transação:

if take(toBase58String(i.transactionId), 3) != “123” então throw(“prova de trabalho falhou”) senão

Para realizar uma transação, o chamador deve escolher tais parâmetros para que seu código base58 (id) comece com os números 123, o que corresponde a uma média de algumas dezenas de segundos de tempo do processador e geralmente é razoável para nossa tarefa. Se for necessário um PoW mais simples ou mais complexo, a tarefa pode ser facilmente modificada de maneira óbvia.

Consultar chaves de dados por modelo

Para usar o blockchain como um banco de dados, é vital ter ferramentas de API para consultar o banco de dados como um valor de chave usando modelos. Esse kit de ferramentas apareceu no início de julho de 2019 como um parâmetro ?partidas na solicitação da API REST /endereços/dados?matches=regexp. Agora, se precisarmos obter mais de uma chave e não todas as chaves de uma vez do aplicativo da web, mas apenas alguns grupos, podemos fazer uma seleção pelo nome da chave. Por exemplo, neste projeto, as transações de retirada são codificadas como

withdraw_${userAddress}_${txid}

que permite obter uma lista de transações para retirada de fundos para qualquer endereço usando o modelo:

?matches=withdraw_${userAddress}_.*

Agora vamos analisar os componentes da solução finalizada.

código vuejs

O código é uma demonstração funcional, próxima a um projeto real. Ele implementa o login por meio do Waves Keeper e trabalha com a biblioteca afiliado.js, com a ajuda da qual registra um usuário no sistema, consulta os dados da transação e também permite que você retire os fundos ganhos para a conta do usuário.

Programa de afiliados descentralizado de código aberto no blockchain Waves

Código no RIDE

Consiste em registrar, financiar e retirar funções.

A função de cadastro cadastra um usuário no sistema. Possui dois parâmetros: referer (endereço do referenciador) e o parâmetro salt não utilizado no código da função, que é necessário para selecionar o id da transação (tarefa PoW-captcha).

A função (como o resto das funções neste projeto) usa a técnica de empréstimo, o resultado da função é financiar o pagamento de uma taxa para chamar esta função. Graças a esta solução, um usuário que acabou de criar uma carteira pode trabalhar imediatamente com o sistema e não precisa se preocupar com a questão de adquirir ou receber um ativo que lhe permite pagar uma taxa de transação.

O resultado da função de registro são dois registros:

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

Isso permite pesquisas diretas e inversas (referenciador deste usuário e todas as referências deste usuário).

A função de fundo é mais um modelo para o desenvolvimento de funcionalidade real. Na forma apresentada, ele pega todos os fundos transferidos pela transação e os distribui para as contas referenciadoras de 1º, 2º, 3º níveis, para a conta “cashback” e a conta “troco” (tudo o que resta durante a distribuição para contas anteriores fica aqui).

O cashback é um meio de incentivar o usuário final a participar do sistema de referência. A parte da comissão paga pelo sistema na forma de “cashback” pode ser sacada pelo usuário da mesma forma que as recompensas por indicações.

Ao usar o sistema de referência, a função do fundo deve ser modificada, incorporada à lógica principal da conta inteligente na qual o sistema funcionará. Por exemplo, se uma recompensa de referência for paga por uma aposta feita, a função de fundo deve ser incorporada à lógica em que a aposta é feita (ou outra ação de destino é executada pela qual a recompensa é paga). Existem três níveis de recompensas de referência codificadas neste recurso. Se você deseja criar mais ou menos níveis, isso também é corrigido no código. A porcentagem de recompensa é definida pelas constantes level1-level3, no código é calculada como quantidade * nível / 1000, ou seja, o valor 1 corresponde a 0,1% (isso também pode ser alterado no código).

A chamada de função altera o saldo da conta e também cria registros com a finalidade de registrar o formulário:

fund_address_txid = address:owner:inc:level:timestamp
Для получения timestamp (текущего времени) используется такая вот связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

Ou seja, o horário da transação é o horário do bloco no qual ela está localizada. Isso é mais confiável do que usar o registro de data e hora da própria transação, especialmente porque não está disponível no callable.
A função de retirada retira todas as recompensas acumuladas para a conta do usuário. Cria entradas para fins de registro:

# withdraw log: withdraw_user_txid=amount:timestamp

Aplicação

A parte principal do aplicativo é a biblioteca afiliado.js, que é uma ponte entre os modelos de dados afiliados e a API WAVES NODE REST. Implementa uma camada de abstração independente da estrutura (qualquer uma pode ser usada). As funções ativas (registrar, retirar) assumem que o Waves Keeper está instalado no sistema, a própria biblioteca não verifica isso.

Implementa métodos:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

A funcionalidade dos métodos é óbvia pelos nomes, os parâmetros e os dados de retorno são descritos no código. A função de registro requer comentários adicionais - ela inicia o ciclo de seleção do ID da transação para que comece em 123 - este é o captcha PoW descrito acima, que protege contra registros em massa. A função encontra uma transação com o id necessário e a assina por meio do Waves Keeper.

Programa de afiliados DEX disponível em GitHub.com.

Fonte: habr.com

Adicionar um comentário