Vou esclarecer desde já que não sou especialista nesta área, mas já demonstrei interesse nesta tecnologia mais de uma vez, mas tentar brincar com ela muitas vezes causava alguma dor. Hoje comecei a experimentar novamente e obtive alguns resultados que gostaria de compartilhar. Resumindo, será descrito o processo de instalação do IPFS e alguns recursos (tudo foi feito no ubuntu, não tentei em outras plataformas). Se você perdeu o que é IPFS, está escrito com alguns detalhes aqui: habr.com/en/post/314768
Instalação
Para a pureza do experimento, sugiro instalá-lo imediatamente em algum servidor externo, pois consideraremos algumas armadilhas ao trabalhar em modo local e remoto. Aí, se quiser, não vai ser demolido por muito tempo, não tem muito.
Observação: é melhor instalar o IPFS em nome do usuário que o usará com mais frequência. O fato é que a seguir consideraremos a opção de montagem via FUSE e há sutilezas.
cd ~
curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
tar xvf go1.12.9.linux-amd64.tar.gz
sudo chown -R root:root ./go
sudo mv go /usr/local
rm go1.12.9.linux-amd64.tar.gz
Depois disso, você pode executar os seguintes comandos:
versões de atualização ipfs - para ver todas as versões disponíveis para download. versão de atualização do ipfs - para ver a versão atualmente instalada (até que tenhamos o IPFS instalado, não haverá nenhuma). instalação do ipfs-update mais recente - instale a versão mais recente do IPFS. Em vez de mais recente, respectivamente, você pode especificar qualquer versão desejada na lista de versões disponíveis.
Instalando ipfs
ipfs-update install latest
Verificar
ipfs --version
Diretamente com a instalação em termos gerais tudo.
Iniciar IPFS
Inicialização
Primeiro você precisa realizar a inicialização.
ipfs init
Em resposta, você receberá algo assim:
ipfs init
initializing IPFS node at /home/USERNAME/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmeCWX1DD7HnXXXXXXXXXXXXXXXXXXXXXXXXxxx
to get started, enter:
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
Hello and Welcome to IPFS!
██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗ ███████╗
██║██╔═══╝ ██╔══╝ ╚════██║
██║██║ ██║ ███████║
╚═╝╚═╝ ╚═╝ ╚══════╝
If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!
-------------------------------------------------------
| Warning: |
| This is alpha software. Use at your own discretion! |
| Much is missing or lacking polish. There are bugs. |
| Not yet secure. Read the security notes for more. |
-------------------------------------------------------
Check out some of the other files in this directory:
./about
./help
./quick-start <-- usage examples
./readme <-- this file
./security-notes
Aqui, na minha opinião, começa o interessante. A galera na fase de instalação já está começando a usar tecnologias próprias. O hash proposto QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv não é gerado especificamente para você, mas integrado no lançamento. Ou seja, antes do lançamento, eles prepararam um texto de boas-vindas, despejaram no IPFS e adicionaram o endereço ao instalador. Eu acho que é muito legal. E este arquivo (mais precisamente, a pasta inteira) agora pode ser visualizado não só localmente, mas também no gateway oficial ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. Ao mesmo tempo, você pode ter certeza de que o conteúdo da pasta não mudou de forma alguma, pois se tivesse mudado, o hash também teria mudado.
Aliás, neste caso, o IPFS tem algumas semelhanças com o servidor de controle de versão. Se você fizer alterações nos arquivos de origem da pasta e despejar a pasta novamente no IPFS, ela receberá um novo endereço. Ao mesmo tempo, a pasta antiga não irá a lugar nenhum e estará disponível no endereço anterior.
Lançamento direto
ipfs daemon
Você deverá receber uma resposta como esta:
ipfs daemon
Initializing daemon...
go-ipfs version: 0.4.22-
Repo version: 7
System version: amd64/linux
Golang version: go1.12.7
Swarm listening on /ip4/x.x.x.x/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
Abrindo as portas para a Internet
Preste atenção a estas duas linhas:
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Agora, se você instalou o IPFS localmente, você acessará as interfaces IPFS em endereços locais e tudo estará disponível para você (por exemplo, localhost:5001/webui/). Mas quando instalado em um servidor externo, por padrão, os gateways ficam fechados para a Internet. Gateways dois:
Até agora, ambas as portas (5001 e 8080) podem ser abertas para experimentos, mas em um servidor de combate, é claro, a porta 5001 deve ser fechada com um firewall. Há também a porta 4001, necessária para que outros pares possam encontrá-lo. Deve ser deixado aberto a solicitações externas.
Abra ~/.ipfs/config para edição e encontre estas linhas nele:
Se o webui funcionar para você, as configurações do IPFS podem ser alteradas diretamente nele, incluindo a visualização de estatísticas, mas a seguir considerarei as opções de configuração diretamente por meio do arquivo de configuração, o que geralmente não é crítico. É melhor lembrar exatamente onde está a configuração e o que fazer com ela, caso contrário, se o web face não funcionar, será mais difícil.
Configurando uma interface web para funcionar com seu servidor
Aqui está a primeira armadilha, que durou cerca de três horas.
Se você instalou o IPFS em um servidor externo, mas não instalou ou executou o IPFS localmente, ao acessar /webui na interface da web, você verá um erro de conexão:
O fato é que o webui, na minha opinião, funciona de forma muito ambígua. Primeiro, ele tenta se conectar à API do servidor onde a interface está aberta (com base no endereço do navegador, é claro). e se não funcionar lá, ele tenta se conectar ao gateway local. E se você tiver IPFS rodando localmente, então o webui funcionará bem para você, somente você trabalhará com IPFS local, e não externo, embora tenha aberto o webui em um servidor externo. Aí você carrega os arquivos, mas por algum motivo você não os vê assim em um servidor externo…
E se não estiver rodando localmente, teremos um erro de conexão. No nosso caso, o erro provavelmente se deve ao CORS, que também é indicado pelo webui, sugerindo adicionar um config.
Reiniciamos o ipfs e vemos que o webui se conectou com sucesso (em qualquer caso, deveria, se você abriu os gateways para solicitações externas, conforme descrito acima).
Agora você pode fazer upload de pastas e arquivos diretamente pela interface web, bem como criar suas próprias pastas.
Montando o sistema de arquivos FUSE
Aqui está um recurso bastante interessante.
Arquivos (assim como pastas), podemos adicionar não só através da interface web, mas também diretamente no terminal, por exemplo
ipfs add test -r
added QmfYuz2gegRZNkDUDVLNa5DXzKmxxxxxxxxxx test/test.txt
added QmbnzgRVAP4fL814h5mQttyqk1aURxxxxxxxxxxxx test
O último hash é o hash da pasta raiz.
Usando esse hash, podemos abrir uma pasta em qualquer nó ipfs (que pode encontrar nosso nó e obter o conteúdo), podemos na interface web na porta 5001 ou 8080, ou podemos localmente via ipfs.
ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt
Mas você ainda pode abri-lo como uma pasta normal.
Vamos criar duas pastas na raiz e conceder direitos a elas ao nosso usuário.
Você pode criar pastas em outros locais e especificar o caminho para elas por meio dos parâmetros do daemon ipfs -mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path
Agora, a leitura desta pasta é um tanto incomum.
ls -la /ipfs
ls: reading directory '/ipfs': Operation not permitted
total 0
Ou seja, não há acesso direto à raiz desta pasta. Mas você pode obter o conteúdo conhecendo o hash.
ls -la /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx
total 0
-r--r--r-- 1 root root 10 Aug 31 07:03 test.txt
cat /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx/test.txt
test
test
Ao mesmo tempo, até o preenchimento automático funciona dentro da pasta quando o caminho é especificado.
Como eu disse acima, existem sutilezas nessa montagem: por padrão, as pastas FUSE montadas estão disponíveis apenas para o usuário atual (mesmo o root não será capaz de ler essa pasta, sem mencionar outros usuários do sistema). Se você deseja disponibilizar essas pastas para outros usuários, então na configuração você precisa alterar "FuseAllowOther": false para "FuseAllowOther": true. Mas isso não é tudo. Se você executar o IPFS como root, estará tudo bem. E se for em nome de um usuário comum (mesmo sudo), você receberá um erro
mount helper error: fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf
Neste caso, você precisa editar /etc/fuse.conf descomentando a linha #user_allow_other.
Depois disso, reinicie o ipfs.
Problemas conhecidos com FUSE
O problema foi percebido mais de uma vez: após reiniciar o ipfs com montagem (e talvez em outros casos), os pontos de montagem /ipfs e /ipns ficam indisponíveis. Não há acesso a eles e ls -la /ipfs mostra ???? na lista de direitos.
Encontrei esta solução:
fusermount -z -u /ipfs
fusermount -z -u /ipns
Em seguida, reinicie o ipfs.
Adicionando um serviço
Claro, rodar no terminal só é adequado para testes iniciais. No modo de combate, o daemon deve iniciar automaticamente na inicialização do sistema.
Em nome do sudo, crie o arquivo /etc/systemd/system/ipfs.service e escreva nele:
USERNAME, é claro, deve ser substituído pelo seu usuário (e talvez o caminho completo para o programa ipfs seja diferente para você (você deve especificar o caminho completo)).
Ativamos o serviço.
sudo systemctl enable ipfs.service
Iniciamos o serviço.
sudo service ipfs start
Verificando o status do serviço.
sudo service ipfs status
Para a pureza do experimento, será possível reinicializar o servidor no futuro para verificar se o ipfs inicia automaticamente com sucesso.
Adicionando festas conhecidas por nós
Considere uma situação em que temos nós IPFS instalados em um servidor externo e localmente. Em um servidor externo, adicionamos algum arquivo e tentamos obtê-lo via IPFS localmente por CID. O que vai acontecer? É claro que o servidor local provavelmente não sabe nada sobre nosso servidor externo e simplesmente tentará encontrar o arquivo por CID “perguntando” a todos os pares IPFS disponíveis (com os quais já conseguiu “se familiarizar”). Esses, por sua vez, perguntarão aos outros. E assim por diante, até que o arquivo seja encontrado. Na verdade, a mesma coisa acontece quando tentamos passar o arquivo pelo gateway oficial ipfs.io. Se você tiver sorte, o arquivo será encontrado em alguns segundos. E se não, não será encontrado nem em poucos minutos, o que prejudica muito o conforto do trabalho. Mas sabemos onde esse arquivo aparecerá pela primeira vez. Então, por que não dizemos imediatamente ao nosso servidor local "Pesquise lá primeiro"? Aparentemente, isso pode ser feito.
1. Vamos para o servidor remoto e olhamos na configuração ~/.ipfs/config
2. Execute sudo service ipfs status e procure por entradas do Swarm nele, por exemplo:
Swarm announcing /ip4/ip_вашего_сервера/tcp/4001
3. Adicionamos a partir disso o endereço geral no formato "/ip4/ip_your_server/tcp/4001/ipfs/$PeerID".
4. Para maior confiabilidade, tentaremos adicionar esse endereço aos pares por meio de nosso webui local.
5. Se tudo estiver bem, abra a configuração local ~/.ipfs/config, encontre “Bootstrap” nele: [...
e adicione o endereço recebido primeiro ao array.
Reinicie o IPFS.
Agora vamos adicionar o arquivo ao servidor externo e tentar solicitá-lo no servidor local. Deve voar rápido.
Mas esta funcionalidade ainda não está estável. Pelo que entendi, mesmo que especifiquemos o endereço de um peer no Bootstrap, o ipfs altera a lista de conexões ativas com peers durante a operação. De qualquer forma, está em andamento a discussão sobre isso e os desejos quanto à possibilidade de especificar festas permanentes aqui e parece que deveria adicione alguma funcionalidade a [email protegido]+
A lista de peers atuais pode ser visualizada tanto na webui quanto no terminal.
ipfs swarm peers
E aqui e ali você pode adicionar seu banquete manualmente.
Até que esta funcionalidade seja melhorada, você pode escrever uma ferramenta para verificar uma conexão com o peer desejado e, se não, adicionar uma conexão.
Raciocínio
Entre aqueles que já estão familiarizados com o IPFS, existem argumentos a favor e contra o IPFS. Basicamente, ontem discussão e me levou a pesquisar o IPFS novamente. E com relação à discussão mencionada acima: não posso dizer que me oponho fortemente a qualquer argumento dos que falaram (discordo apenas do fato de um programador e meio usar IPFS). Em geral, ambos estão certos à sua maneira (especialmente comentar sobre cheques faz você pensar). Mas se descartarmos a avaliação moral e jurídica, quem fará a avaliação técnica desta tecnologia? Pessoalmente, tenho uma sensação interior de que “isso deve ser feito de forma inequívoca, tem certas perspectivas”. Mas por que exatamente, não existe uma formulação clara. Por exemplo, se você observar as ferramentas centralizadas existentes, verá que, em muitos aspectos, elas estão muito à frente (estabilidade, velocidade, capacidade de gerenciamento, etc.). No entanto, tenho uma ideia que parece fazer sentido e que dificilmente poderá ser implementada sem esses sistemas descentralizados. É claro que estou exagerando, mas formularia desta forma: o princípio da divulgação de informações na Internet deve ser mudado.
Deixe-me explicar. Se você pensar bem, agora temos informações distribuídas de acordo com o princípio “Espero que aquele a quem as dei as proteja e que não sejam perdidas ou recebidas por aqueles a quem não foram destinadas”. Como exemplo, é fácil considerar vários serviços de correio, armazenamento em nuvem, etc. E com o que acabamos? No centro de Habré Segurança da informação está na primeira linha e quase todos os dias recebemos notícias sobre mais um vazamento global. Em princípio, todas as coisas mais interessantes estão listadas em <ironia> maravilhosa artigo O verão está quase acabando. Quase não há mais dados vazados. Ou seja, os principais gigantes da Internet estão se tornando maiores, acumulando cada vez mais informações, e esses vazamentos são uma espécie de explosões atômicas de informações. Isso nunca aconteceu antes e aqui está novamente. Ao mesmo tempo, embora muitos compreendam que existem riscos, continuarão a confiar os seus dados a empresas terceiras. Em primeiro lugar, não há muita alternativa e, em segundo lugar, prometem que taparam todos os buracos e que isso nunca mais acontecerá.
Que opção eu vejo? Parece-me que os dados deveriam inicialmente ser distribuídos abertamente. Mas abertura, neste caso, não significa que tudo deva ser fácil de ler. Estou falando da abertura de armazenamento e distribuição, mas não da abertura total na leitura. Presumo que as informações devam ser distribuídas com chaves públicas. Afinal, o princípio das chaves públicas/privadas já é antigo, quase como a Internet. Se a informação não for confidencial e se destinar a um amplo círculo, ela será imediatamente divulgada com uma chave pública (mas ainda de forma criptografada, qualquer pessoa pode descriptografá-la com a chave disponível). E se não, então é colocado sem chave pública, e a própria chave é transferida para quem deveria ter acesso a essa informação. Ao mesmo tempo, quem deveria lê-lo deveria ter apenas uma chave, e onde conseguir essa informação, ele não deveria realmente subir - ele apenas a puxa da rede (este é o novo princípio de distribuição por conteúdo, não por endereço).
Assim, para um ataque em massa, os invasores precisarão obter um grande número de chaves privadas, e é improvável que isso seja feito em um só lugar. Essa tarefa, a meu ver, é mais difícil do que hackear um serviço específico.
E aqui se encerra outro problema: a confirmação da autoria. Agora na Internet você pode encontrar muitas citações escritas por nossos amigos. Mas onde está a garantia de que foram eles que os escreveram? Agora, se cada registro desse tipo fosse acompanhado de uma assinatura digital, seria muito mais fácil. E não importa onde esteja essa informação, o principal é a assinatura, que, claro, é difícil de falsificar.
E aqui está o que é interessante: o IPFS já possui ferramentas de criptografia (afinal, ele é baseado na tecnologia blockchain). A chave privada é imediatamente especificada na configuração.
Não sou especialista em segurança e não sei exatamente como usá-las corretamente, mas me parece que essas chaves são usadas no nível de troca entre nós IPFS. E também js-ipfs e exemplos de projetos como órbita-dbem que funciona órbita.chat. Ou seja, teoricamente, cada dispositivo (móvel e não só) pode ser facilmente equipado com suas próprias máquinas de criptografia-descriptografia. Nesse caso, resta apenas a todos cuidar de salvar suas chaves privadas, e cada um será responsável por sua própria segurança, e não ficará refém de outro fator humano de algum gigante superpopular da Internet.
Apenas usuários registrados podem participar da pesquisa. Entrarpor favor
Você já ouviu falar sobre IPFS antes?
Nunca ouvi falar de IPFS, mas parece interessante
Não ouvi e não quero ouvir
Ouvi mas não estou interessado
Ouvi, mas não entendi, mas agora parece interessante