Um programa de afiliados descentralizado no blockchain Waves, implementado como parte de uma concessão do Waves Labs pela equipe Bettex.
A postagem não está anunciando! O programa é de código aberto, seu uso e distribuição são gratuitos. A aplicação do programa estimula o desenvolvimento de aplicativos dApp e geralmente promove a descentralização, o que é benéfico para todos os usuários da rede.

Introduzido pelo dApp para programas afiliados é um modelo para projetos que incluem afiliados como parte de sua funcionalidade. O código pode ser usado como um modelo para copiar, como uma biblioteca ou como um conjunto de idéias para implementação técnica.
Em termos de funcionalidade, este é um sistema afiliado regular que implementa o registro com um referenciador, acumulação em vários níveis de recompensas por referências e motivação para o registro no sistema (reembolso). O sistema é dApp "puro", ou seja, o aplicativo da web interage diretamente com o blockchain sem seu back-end, banco de dados, etc.
São usadas técnicas que também podem ser úteis em muitos outros projetos:
- Ligar para uma conta inteligente com crédito e com reembolso imediato (no momento da ligação, não há tokens na conta para pagar pela ligação, mas eles aparecem lá como resultado da ligação).
- PoW-captcha - proteção contra chamadas automatizadas de alta frequência de funções de conta inteligente - um análogo do captcha, mas através da prova do uso de recursos de computação.
- Solicitação de chaves de dados por modelo.
O aplicativo consiste em:
- código de conta inteligente no idioma ride4dapps (que, por design, é mesclado na conta inteligente principal, para a qual você precisa implementar a funcionalidade de afiliado);
- js wrappers que implementam o nível de abstração na API WAVES NODE REST;
- código na estrutura vuejs, que é um exemplo de uso da biblioteca e do código RIDE.
Nós descrevemos todos esses recursos.
Ligue para uma conta inteligente com crédito com reembolso imediatoAs chamadas InvokeScript exigem uma taxa da conta inicial da transação. Isso não é um problema se você estiver executando um projeto para geeks de blockchain que tenham alguns tokens WAVES em sua conta, mas se o produto for voltado para uso amplo, isso se tornará um problema sério. Afinal, o usuário deve cuidar da compra de tokens WAVES (ou outro ativo adequado com o qual você pode pagar por transações), o que aumenta o limite já considerável para a entrada no projeto. Podemos distribuir ativos aos usuários, o que nos permitirá pagar pelas transações e enfrentar o risco de uso indevido quando sistemas automatizados são criados para bombear ativos líquidos de nosso sistema.
Seria muito conveniente se fosse possível fazer a chamada do InvokeScript "às custas do destinatário" (a conta inteligente na qual o script está instalado), e essa possibilidade, embora não de maneira óbvia, existe.
Se você executar ScriptTransfer dentro do InvokeScript no endereço do chamador, que compensa os tokens gastos com taxa, essa chamada será bem-sucedida, mesmo se não houver ativos na conta de chamada no momento da chamada. Isso é possível devido ao fato de que um número suficiente de tokens é verificado depois que uma transação é chamada, e não antes dela, para que seja possível tornar as transações de crédito sujeitas ao seu pagamento imediato.
ScriptTransfer (i.caller, i.fee, unit)O código abaixo reembolsa a taxa gasta às custas da conta inteligente. Para se proteger contra o uso indevido desse recurso, você deve verificar se o chamador está gastando uma 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, a proteção contra desperdício de fundos malicioso e sem sentido exige proteção contra chamadas automáticas (PoW-captcha)
PoW-captchaA idéia de captcha de prova de trabalho não é nova e já foi implementada em vários projetos, incluindo aqueles implementados com base no WAVES. A ideia é que, para a ação que desperdice os recursos de nosso projeto, o chamador também precise gastar seus próprios recursos, o que torna o ataque à exaustão de recursos bastante caro. Para uma validação muito fácil e de baixo custo de que o remetente da transação resolveu a tarefa PoW, há uma verificação do ID da transação:
se pegar (toBase58String (i.transactionId), 3)! = "123" e depois jogar ("prova de falha no trabalho")Para realizar uma transação, o chamador deve selecionar esses parâmetros para que seu código base58 (id) inicie em 123, o que corresponde a uma média de algumas dezenas de segundos de tempo do processador e geralmente é razoável para a nossa tarefa. Se for necessário um PoW mais simples ou mais complexo, é fácil refinar a tarefa de maneira óbvia.
Solicitação de chaves de dados por modeloPara usar o blockchain como um banco de dados, é vital ter ferramentas de API para consultar o banco de dados como modelos de valores-chave. Esse kit de ferramentas apareceu no início de julho de 2019 como o parâmetro
? Matches para a solicitação
/ endereços / dados da API REST
? Matches = regexp . Agora, se precisarmos obter não uma chave e nem todas as chaves de um aplicativo Web de uma só vez, mas apenas alguns grupos, poderemos 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 retirar fundos para qualquer endereço, de acordo com o modelo:
?matches=withdraw_${userAddress}_.*
Agora vamos analisar os componentes da solução turnkey.
Código VuejsO código é uma demonstração funcional próxima a um projeto real. Ele implementa o login através do Waves Keeper e trabalha com a biblioteca affiliate.js, com a ajuda de que ele registra o usuário no sistema, pesquisa dados de transações e também permite que você retire fundos ganhos para a conta do usuário.
Código RIDEConsiste em registrar, financiar e retirar funções.
A função de registro é registrada no sistema do usuário. Ele possui dois parâmetros: referenciador (endereço do referenciador) e o parâmetro salt, que não é usado no código de função, necessário para selecionar o ID da transação (tarefa PoW-captcha).
A função (como as outras funções deste projeto) usa a técnica de empréstimo, o resultado da função é o financiamento de uma taxa para chamar essa função. Graças a essa decisão, o usuário que acabou de criar a carteira pode trabalhar imediatamente com o sistema e não precisa se surpreender com a questão de comprar ou receber um ativo que permita pagar uma taxa de transação.
O resultado da função de registro é duas entradas:
${owner)_referer = referer ${referer}_referral_${owner} = owner
Isso permite pesquisas diretas e reversas (referenciador deste usuário e todas as referências deste usuário).
A função do fundo provavelmente é um modelo para o desenvolvimento de funcionalidades reais. Na forma apresentada, ele pega todos os fundos transferidos pela transação e os distribui para as contas dos referenciadores 1, 2, 3, para a conta "cashback" e a conta "change" (tudo o que resta na distribuição para as contas anteriores cai aqui).
O reembolso é um meio de estimular o usuário final a participar do sistema de referência. O usuário pode retirar a parte da comissão paga pelo sistema na forma de "reembolso" da mesma maneira que as recompensas por referências.
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 a taxa de referência for paga pela aposta feita, a função do fundo deve ser incorporada à lógica em que a aposta é feita (ou outra ação direcionada é executada, pela qual a taxa é paga). Esta função codifica três níveis de recompensas por referência. Se você precisar fazer mais ou menos níveis, isso também será corrigido no código. O percentual de remuneração é definido pelas constantes nível1-nível3, no código é considerado 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 entradas com a finalidade de efetuar logon no formulário:
fund_address_txid = address:owner:inc:level:timestamp timestamp ( ) func getTimestamp() = { let block = extract(blockInfoByHeight(height)) toString(block.timestamp) }
Ou seja, o tempo da transação é o tempo do bloco em que está localizado. Isso é mais confiável do que usar o carimbo de data / hora da própria transação, principalmente porque não é acessível a partir de chamada.
A função de retirada exibe todas as recompensas acumuladas na conta do usuário. Cria entradas para fins de registro em log:
# withdraw log: withdraw_user_txid=amount:timestamp
AppA parte principal do aplicativo é a biblioteca affiliate.js, que é uma ponte entre os modelos de dados do afiliado e a API REST do WAVES NODE. Implementa um nível de abstração independente da estrutura (qualquer um pode ser usado). 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 nos nomes, nos parâmetros e nos dados retornados são descritos no código. A função de registro requer comentários adicionais - inicia o ciclo de correspondência do ID da transação para começar em 123 - este é o PoW-captcha descrito acima, que protege contra registros em massa. A função localiza a transação com o ID desejado e a assina através do Waves Keeper.
O programa de afiliados da DEX está disponível no
GitHub.com .