Upload de imagens e outros recursos para o TabNews com IPFS

Na discussão de uma issue do TabNews sobre o upload e armazenamento de imagens, apresentei como proposta o uso do IPFS para fins de armazenamento gratuito e distribuído.

Uma das preocupações é de usuários mal intencionados abusem do sistema "para fazer upload de imagens que nem serão usadas no TabNews." e, uma vez que o projeto não possui investimento, não terá como arcar com os custos de armazenamento.

O IPFS é um protocolo peer-to-peer que distribui um conteúdo (object) em blocos ou chuncks blocos de 256K entre os nós da rede. Achei inclusive um artigo recente que fala sobre o protocolo.

Existem vários gateways públicos que podem ser utilizados para recuperar arquivos na rede.

Minha proposta seria implementar na API do TabNews um camada de abstração para a recuperação de arquivos na rede IPFS (dentre outras estratégias de armazenamento ou CDNs) e realizar apenas um cache quando o recurso for requisitado na página, diminuindo o espaço de armazenamento necessário no servidor da aplicação.

De maneira bem simplificada, uma vez tendo sido instalado o IPFS, a inclusão e recuperação de conteúdo seria simples assim:

Inicializando o IPFS

ipfs init

Adicionando conteúdo na rede

ipfs add /path/to/file/image.png
added QmVNsHE5rboiDqxNrrN7Kxu1ovUHQB9tnk9pgucge8Gy5C image.png

Recuperando o conteúdo de um arquivo

ipfs cat QmVNsHE5rboiDqxNrrN7Kxu1ovUHQB9tnk9pgucge8Gy5C > /public/web/dir/image.png

Inicializando o próprio nó na rede

ipfs daemon

Recuperando o arquivo por meio do próprio nó

curl "http://127.0.0.1:8080/ipfs/QmVNsHE5rboiDqxNrrN7Kxu1ovUHQB9tnk9pgucge8Gy5C" --output /public/web/dir/image.png

Até já existe uma lib em Javascript que implementa o IPFS

Bem... isso resolve parte do problema, pois o IPFS é como se fosse uma combinação de Blockchain + Git e Torrent, então, assim como no Torrent, a disponibilidade do arquivo dependerá de quantos nós da rede ainda o mantêm!

Os nós da rede tem um recursos de Garbage Colletion que é disparado assim que o limite de 90% do espaço destinado ao IPFS é atingido, excluindo os arquivos desnecessários.

Para evitar a exclusão automática existe o recurso de Pinning. Por padrão o pinning é feito no seu nó local. Para maior garantia de persistência de seus arquivos você deve utilizar um pinning service (é... não existe almoço grátis!).

Em resumo, com IPFS é possível contornar parcialmente a questão dos custos e da distribuição de arquivos, mas sem a "garantia" que o conteúdo permanecerá acessível indefinidamente (a não ser pelo uso de pinning services como mencionado).

Penso que IPFS poderia ser um entre vários plugins ou drivers para API de armazenamento do TabNews.

Quem sabe um outro plugin poderia estar baseado no Rclone, que utiliza múltiplos provedores de armazenamento em nuvem simultaneamente e os expõe para o Sistema Operacional como um filesystem, bem... assunto para outra publicação!

Como teste, caso você esteja com o daemon do IPFS executando em seu computador com a extensão IPFS Companion no seu navegador acesse:

https://dweb.link/ipfs/QmaQMb398Tz6UUsHj5yYiTRhLHtHh3dXQM5C71Hn1gm1my

https://ipfs.io/ipfs/QmaQMb398Tz6UUsHj5yYiTRhLHtHh3dXQM5C71Hn1gm1my

ou no IP local:

http://127.0.0.1:8080/ipfs/QmaQMb398Tz6UUsHj5yYiTRhLHtHh3dXQM5C71Hn1gm1my

Ou diretamente pelos navegadores Opera ou Brave que já suportam nativamente o protocolo:

ipfs://QmaQMb398Tz6UUsHj5yYiTRhLHtHh3dXQM5C71Hn1gm1my

Ricardo, muito obrigado por trazer esse conteúdo para cá, é um conteúdo raríssimo e é uma honra ter isso no TabNews 🤝 espero que com o cresciento do site (ou pela descoberta do Google) mais pessoas caiam nesse conteúdo aqui 👍

No mais, como comentei na issue, fiquei fascinado por essa tecnologia e estou colocando a cabeça aqui para pensar de quais outras formas podemos nos beneficiar 👍