Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Limitar a quantidade qualificações (TabCoins) por publicação #1166

Closed
filipedeschamps opened this issue Dec 20, 2022 · 12 comments
Closed
Labels
back Envolve modificações no backend

Comments

@filipedeschamps
Copy link
Owner

filipedeschamps commented Dec 20, 2022

Contexto

Hoje qualquer pessoa pode depositar uma quantidade ilimitada de TabCoins em uma única publicação (enquanto essa pessoa possuir saldo). Olhando o que isso possibilitou, não posso dizer que foi saudável para a economia e o ecossistema de publicações do TabNews.

E há várias formas de abordar este assunto e a sugestão que vou dar aqui não é a forma final que eu gostaria que fosse, mas vai ser um ótimo teste para entender como a economia se comporta, porque ela vai sair de um extremo para o outro que é limitar 1 TabCoin por publicação, por usuário. Já pediram isso no passado e isso deveria ser o limite inicial de todas as contas na verdade.

E talvez ao invés de ser 1 TabCoin por usuário, ser 1 TabCoin por IP. Ou um limite x por IP.

Execução

Tudo se inicia no controller do /api/v1/contents/[username]/[slug]/tabcoins, no handler do POST:

.post(postValidationHandler, authorization.canRequest('update:content'), postHandler);

Talvez seja interessante usar o Firewall, assim como foi feito no endpoint de users:

firewall.canRequest('create:user'),

Onde o Firewall buscaria por registros prévios vindos do mesmo IP e decidiria fazer algo a respeito, como por exemplo, negar com um 429.

Efeito colateral nos testes

Uma coisa que é necessário considerar é o que deveria acontecer com os testes automatizados, pois temos cobertura das qualificações (e elas vão ser barradas por essa nova proteção):

https://github.com/filipedeschamps/tabnews.com.br/blob/main/tests/integration/api/v1/contents/%5Busername%5D/%5Bslug%5D/tabcoins/post.test.js

@gabrielsozinho
Copy link
Contributor

E talvez ao invés de ser 1 TabCoin por usuário, ser 1 TabCoin por IP. Ou um limite x por IP.

Se a pessoa usasse uma VPN ela conseguiria avaliar mais de uma vez, não é? Também existe o caso de 2 pessoas usarem o TabNews em uma mesma empresa ou residência, ai elas não conseguiriam avaliar o mesmo conteúdo.

A sugestão que eu tenho é: deixar o limite de 1 TabCoin para cada usuário e ter uma espécie de rate-limit elevado por IP, onde mesmo em contas diferentes, o IP não vai conseguir avaliar a mesma publicação durante aquele período.

Como eu disse, é só uma sugestão, podem (e devem) existir falhas, outras sugestões surgirão. 👍🏻

@filipedeschamps
Copy link
Owner Author

Se a pessoa usasse uma VPN ela conseguiria avaliar mais de uma vez, não é?

Correto, e acredito que quase toda medida de segurança tenha uma forma de abusar, a questão é que uma hora o abuso chega num estágio de: "vale a pena em questão de custo e tempo?" Se a gente der muito trabalho para alguém abusar, isto diminui drasticamente a curva deste abuso, onde quem abusar mesmo assim, devemos ser rápidos para identificar e anular a operação.

Também existe o caso de 2 pessoas usarem o TabNews em uma mesma empresa ou residência, ai elas não conseguiriam avaliar o mesmo conteúdo.

Correto! Por isso destaquei "Ou um limite x por IP." Há outros casos também que pessoas podem compartilhar o IP, e isto foi uma preocupação quando implementamos o Firewall. No caso de IPv4, mesmo quando a gente mascarava ele, a gente não teve problema (isso não quer dizer que não teremos no futuro). Mas de qualquer forma, acho importante colocarmos um limite sobre pessoas que possam estar vinculadas, e por hora, não sei se existe outro valor a não ser que seja o IP.

A sugestão que eu tenho é: deixar o limite de 1 TabCoin para cada usuário e ter uma espécie de rate-limit elevado por IP, onde mesmo em contas diferentes, o IP não vai conseguir avaliar a mesma publicação durante aquele período.

Perfeito, o Firewall consegue fazer isso, pois é o que faz para analisar a quantidade de contas criadas, ou publicações criadas 🤝

@cybernerd007
Copy link

Minha sugestão é quando for dado UpVote ou DownVote sejá adicionado um delay de 1 minuto para se aplicar mais uma ação assim vai desencorajar muitos pois levara muito tempo ate 5 minutos depois com os animos já calmos o "atacante" deva parar e por meio da sugestão que EU DEI AQUI a propria comunidade possa denunciar o "Atacante" assim Recomendo que seja adicionado um botão denunciar para que fique encarregado a um moderador decidir se foi um "ATAQUE" ou Não.

@braiansmarzaro
Copy link

Neste mesmo assunto, quero adicionar a Issue #1183 , que destacada o problema de votos contrários que um usuário pode aplicar à mesma publicação.

@rodrigoKulb
Copy link
Contributor

Acabei de ser pego por esse cara hahaha!

Captura de tela em 2023-03-15 20-47-45

@aprendendofelipe
Copy link
Collaborator

Não lembro se vi isso no repositório ou no TabNews, mas alguém citou que a qualificação agora é mais confiável, já que sabemos que é mais difícil que tenha sido manipulada por uma única pessoa. E eu concordo com isso, mas acho a limitação por IP muito fácil de burlar, então sou a favor de limitar por usuário e deixar um limite por IP mais flexível, mas não sem limite, pois isso também pode nos alertar quando alguém tentar manipular a economia usando mais de um usuário.

@aprendendofelipe
Copy link
Collaborator

aprendendofelipe commented Jun 5, 2023

Continuando a análise acima, mas agora baseado em dados, tenho uma opinião contrária a essa limitação...

Mais difícil de manipular não significa impossível, pois parte de quem não gostou da limitação acabou dando um jeito. Mas mesmo assim, nos casos que analisei, não é possível afirmar que está existindo manipulação.

Não tem mais votos duplicados?

Olhando só após 15 de fevereiro, pouco depois do limite de 1 voto a cada 72 horas por IP ser implementado, temos o seguinte:

  • Agrupando votante/conteúdo, temos 193 agrupamentos, ou seja, não foram votos únicos. O total de votos nesses casos soma 431.
  • 1/4 dos casos são de um único usuário que chegou a dar um voto por dia para 1 conteúdo ao longo de 8 dias (mas nada que pareça manipulação indevida).
  • Apenas 30 casos tem acima de 3 votos e apenas 6 possuem acima de 4.
  • Olhando apenas após 15 de abril (mudança na regra dos ganhos), são 55 casos e 124 votos, onde metade é daquele mesmo usuário.

Efeito colateral - Iniciou a queda brusca de votos no sistema

Uma outra parte dos usuários, que não deu um jeito de continuar votando duplicado, pode ter supervalorizado os votos, já que não pode dar votos em quantidade proporcional ao valor do conteúdo, acaba dando apenas 1, mas apenas para quem merecer muito. Concluo isso, pois os votos não foram redistribuídos, já que mesmo com a quantidade de TabCoins crescendo, os votos diminuíram 30% se comparar 40 dias antes com 40 dias depois da mudança. E o número de votos foi caindo bastante desde então. A queda só parou com a implementação dos novos critérios de ganho de TabCoins em abril, quando comparamos 40 dias antes com 40 dias depois dessa mudança, temos um aumento de 5% na quantidade de votos. Mas é importante observar que o número de publicações dobrou nesse mesmo comparativo de tempo. Se eliminarmos um período de explosão de usuários que ocorreu bem na mesma época da nova mecânica, e compararmos os 40 dias anteriores com os 40 últimos dias atuais, a queda na quantidade de votos é de 20% 9% [Edit: Comparando os últimos 40 dias com os 40 dias anteriores a mudança da regra de ganho de TabCoins, a queda na quantidade de votos foi de 9%].

[Edit 2] Apesar dos números acima serem verdadeiros, as mudanças em quantidade de votos seguem uma tendência bastante relacionada com o volume de publicações, então a queda de votos após a implementação da limitação por IP se deve mais pela redução de publicações no mesmo período. Já se olharmos o período recente existe um descolamento do número de votos vs publicações, em que nessa relação os votos diminuíram após as mudanças das regras em abril e a cerca de um mês se estabilizaram em um patamar menor.

Efeito na confiabilidade dos saldos dos conteúdos

Além da diminuição de votos, como essa supervalorização não é uniforme, ficamos com uma range muito grande de "valor" do voto, pois alguns usuários são muito mais criteriosos do que outros, então a métrica do saldo de votos fica mais imprecisa, pois não temos como saber se os votos de certos conteúdos foram dados pelos mais ou menos criteriosos.

Por outro lado, sem um limite de votos por publicação, mesmo qua ainda existam diferentes critérios, quem é mais criterioso e também possui mais TabCoins para votar, pode dar mais votos aos conteúdos que achar que valem mais. Então o range do valor de um voto acaba diminuindo, e mesmo que ainda exista, com uma quantidade maior de votos podemos confiar mais na média. Além de que quem produz conteúdos melhores continua tendo mais poder, pois pode dar mais votos para um mesmo conteúdo, caso queira.

Experiência no TabNews

E tudo no sistema funciona de forma mais interessante quando o número de votos é maior, mesmo que o "peso" de 1 voto seja menor, o que é compensado pela quantidade. E votos com peso menor significa que mesmo quem ainda não consegue criar os conteúdos de maior destaque, ainda assim pode receber votos.

Conclusão

A limitação da quantidade de votos tinha como um dos objetivos melhorar a confiabilidade da qualificação dos conteúdos, mas deu start em um processo de queda na quantidade de votos em geral no sistema, o que não impacta na economia, mas impacta na experiência de uso do TabNews e piora a confiabilidade da qualificação ao invés de melhorar.

Por isso eu gostaria de propor retirarmos esse limite de 1 voto por publicação para ver qual será o comportamento, já que agora temos outras seguranças que dificultam a geração de TabCoins sem nenhum esforço e já dificultam a manipulação do ranqueamento.

@filipedeschamps
Copy link
Owner Author

Por isso eu gostaria de propor retirarmos esse limite de 1 voto por publicação para ver qual será o comportamento, já que agora temos outras seguranças que dificultam a geração de TabCoins sem nenhum esforço e já dificultam a manipulação do ranqueamento.

Bora!!! Vamos iniciar mais um experimento! Quanto mais fizermos isto, melhor o problema vai ser mapeado 🤝 💪

@aprendendofelipe
Copy link
Collaborator

Bora!!! Vamos iniciar mais um experimento! Quanto mais fizermos isto, melhor o problema vai ser mapeado 🤝 💪

Limite alterado de 1 para 3 votos... Vamos acompanhar! 🤝

@aprendendofelipe
Copy link
Collaborator

@filipedeschamps, podemos dar essa issue como concluída após o PR #1441 que fixou o limite em 3 votos?

Acho que o comportamento ficou legal e que não precisaremos de experimentos relacionados por enquanto. 👍

@andrecruzmendes
Copy link

andrecruzmendes commented Aug 21, 2023

Vou sugerir uma ideia, que não precisa ser considerada nessa issue especificamente, até porque ainda não sei como funciona a dinâmica por aqui (acabei de chegar).

A ideia é a seguinte: em vez de limitar as ações dos usuários, podemos definir um modelo matemático que apenas suaviza o impacto delas quando são repetidas.

Por exemplo, o peso dos votos de um mesmo usuário sobre um mesmo conteúdo poderia seguir uma simples função logarítmica:

$$ P = 1 + lg(N) $$

Onde $N$ é o número de vezes que o usuário executou essa mesma ação.

Nesse exemplo:

  • 1 voto conta 1
  • 2 contam 2
  • 3 contam aproximadamente 2,6
  • 4 contam 3
  • 5 contam aproximadamente 3,3
  • 6 contam aproximadamente 3,6
  • 7 contam aproximadamente 3,8
  • 8 contam 4
  • ...
  • 1024 contam apenas 11

Assim, o esforço para ter mais impacto cresce conforme as ações se repetem, mas o usuário não fica impedido de agir, portanto não é desmotivado a votar.

Isso também poderia ser aplicado a ações realizadas a partir de um mesmo IP, mas precisa ser analisado com atenção.

Como eu não tive tempo de analisar o código ainda, me perdoem se eu estiver sugerindo algo que não é aplicável na prática por não conhecer outras questões que deveria ter considerado. O intuito é apenas contribuir.

@aprendendofelipe
Copy link
Collaborator

Turma, como ninguém se opôs ao fechamento, estou dando a issue como concluída. 👍

Recomendo concentrar novas ideias sobre a economia na #1438. 🤝

Muito obrigado a todos que contribuíram com o assunto. 💪

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
back Envolve modificações no backend
Projects
None yet
Development

No branches or pull requests

7 participants