Pular para o conteúdo principal

Serviço de conteúdo

Um registro do protocolo nunca carrega um arquivo. Ele carrega um CID — um hash autodescritivo de conteúdo armazenado em outro lugar — o que mantém um recibo de 10 MB fora de uma carga de gossip que cada nó deve armazenar e reproduzir, ao mesmo tempo que ainda permite a um árbitro estabelecer que a imagem que ele olha é a que a parte assinou.

Alguém ainda tem de guardar os bytes. Esse alguém é o seu nó, e ele já está fazendo isso: o serviço de conteúdo está ligado por padrão e não precisa de configuração.

Por que está no nó e não em um daemon

A primeira versão disto fixava (pin) por meio de um daemon Kubo separado, alcançado por --ipfs-api-url. Aquilo funcionava, e custava mais do que parecia: uma segunda identidade de peer na rede, um runtime Go e sua memória residente ao lado da do nó, e uma superfície de controle /api/v0 não autenticada na porta 5001 que permite a qualquer um que a alcance fixar, desfixar e ler tudo o que o daemon guarda — mitigada apenas por vinculá-la a loopback.

O problema mais profundo era o padrão. Executar um daemon é trabalho, então fixar era opcional, então quase ninguém o teria ligado — e uma garantia de durabilidade em que ninguém opta não é uma garantia. Um nó agora fala bitswap em processo, sobre a mesma identidade libp2p com que já faz gossip, o que permite que o comportamento esteja ligado por padrão. Isso, por sua vez, é o que faz o prêmio de recompensa medir algo real: com todos servindo, o multiplicador separa os nós que genuinamente guardam e respondem pelo conteúdo dos nós que estão offline ou podaram, em vez de separar os operadores que se deram ao trabalho de instalar Go dos que não.

O que o seu nó guarda, e o que não

Ele guarda o conteúdo referenciado pelos registros de anexos que aceitou, dentro de sua janela de retenção. Ele não busca cada CID que vê — um nó que buscasse estaria armazenando o que quer que qualquer um decidisse apontar para ele.

Esse limite não é uma promessa, é aritmética: um anexo deve nomear uma liquidação, e uma liquidação precisa de uma reserva real contra escrow real. O teto do que se pede ao seu disco é o volume de negociações real da rede, não a paciência de um estranho.

Tudo que é recuperado é conferido contra seu CID antes de ser guardado, quer tenha vindo de um peer ou de um gateway.

Pergunte ao seu nó o que ele está guardando:

curl -s -X POST http://localhost:7080/rpc -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"getHeldContent","params":{"cid":"bafkrei..."}}'
# {"jsonrpc":"2.0","id":1,"result":{"content":"<base64>"}} ← guardado
# {"jsonrpc":"2.0","id":1,"result":{"content":null}} ← não guardado

De onde vem a primeira cópia

Bitswap move blocos entre peers que já os têm; ele não cria o primeiro. O conteúdo entra na rede por meio de qualquer serviço de pinning para o qual a interface o subiu, então o primeiro nó a querer um CID tem de obtê-lo da rede IPFS mais ampla, conferir os bytes contra o CID, e servi-lo aos seus peers a partir de então.

--content-gateway https://ipfs.example.com # padrão: https://ipfs.filebase.io

O gateway é transporte não confiável, não uma autoridade. Ele pode servir os bytes errados, nenhum byte, ou registrar quem pediu o quê; ele não pode mudar qual conteúdo um CID nomeia, porque o CID é um hash desse conteúdo. Os bytes que não são o que o CID nomeia são recusados, e um gateway que substitui qualquer coisa é indistinguível de um que simplesmente está fora do ar.

A privacidade é a única coisa que a verificação não corrige: quem opera o gateway descobre que o seu nó pediu este CID. É por isso que o flag existe — aponte-o para o seu próprio — e por isso é um fallback e não uma primeira escolha. O seu nó prefere seus peers.

Se você já executa Kubo

--ipfs-api-url http://127.0.0.1:5001 ainda funciona e agora significa algo mais estreito do que antes: o conteúdo do protocolo é fixado no seu daemon também, pondo uma cópia em algum lugar que a própria janela de retenção do seu nó não governa. Já não é como um nó serve conteúdo.

Desligá-lo, e o que isso custa

openfiat-node --no-content-serving

Esse nó não armazena nada e não pode responder a um desafio de recuperabilidade, então ganha a parcela reduzida. Esse é o resultado honesto — ele está fazendo menos pela rede — e é o flag certo se o disco genuinamente não está lá. O nó ainda desafia seus peers de qualquer modo: medir quem serve conteúdo é um serviço que um nó realiza quer armazene algo ele mesmo ou não.

Como o desafio funciona

Um nó escolhe um CID que a rede conhece, pede a outro nó os bytes, e faz o hash do que volta. Um endereço de conteúdo é o hash de seu conteúdo, então devolver os bytes certos não é algo que um nó possa fazer sem tê-los. Este é o único sinal de qualidade de nó que é conferido em vez de acreditado.

Só alguns CIDs podem decidir a questão. O digest de um CID de codec raw é tomado sobre o próprio arquivo; um CID dag-pb endereça a raiz de um DAG fatiado, então um peer poderia devolver o arquivo correto e ainda assim falhar uma conferência de hash ingênua. Os provedores alternam entre os dois em 262.144 bytes, então os desafios amostram arquivos em ou abaixo de 256 KiB — avatares quase sempre, anexos às vezes. Isso é suficiente para separar um nó que fixa tudo de um que não fixa nada, que é o que o multiplicador precisa; não é uma prova de que um nó guarda um anexo grande específico, e nada afirma que seja.

O que é o multiplicador

Um nó que responde mantém sua parcela completa; um nó que não pode é escalado a 0.7, então um nó que serve ganha cerca de 1.43× o que ganha um nó de resto idêntico que não serve. Ambas as cifras são [PROPOSED — NEEDS SIGN-OFF] — veja OFS-4100 §9.2 e crates/rewards/src/params.rs.

O prêmio é expresso como uma penalidade por uma razão que não é de apresentação. A emissão por época é fixa, e esses multiplicadores decidem como ela é dividida. Um bônus acima de 1.0 não pagaria a um nó que fixa a partir do nada, ele cunharia emissão que o balde de Infraestrutura não contém — o que os parâmetros de recompensa rejeitam de imediato. Então o nó que fixa mantém sua parcela completa e o nó que não fixa cede parte da sua.

0.7 em vez do 0.4 do só-gossip porque armazenamento é um favor menor à rede do que uma conexão à cadeia: um nó que não fixa ainda retransmite, valida e serve tudo o mais.

Por quanto tempo o conteúdo é mantido

Nem todo nó deve carregar a história inteira.

--retention 30 # o padrão: uma janela móvel de 30 dias
--retention 365 # uma janela mais longa, ainda móvel
--retention archival # guardar tudo, para sempre — uma escolha explícita

30 dias é também o piso que cada nó deve à rede, então valores menores são recusados em vez de elevados em silêncio — um nó configurado para sete dias que rodasse em silêncio por trinta estaria fazendo algo diferente do que seu operador pediu.

Esse piso é o que permite à expulsão e às recompensas coexistir. Os desafios só são sempre extraídos de conteúdo dentro dele, então um nó móvel que expulsou corretamente a evidência do ano passado nunca é interrogado sobre ela e nunca perde sua parcela por ter feito a coisa certa. Igualmente, nenhum nó pode reduzir o que pode lhe ser perguntado declarando uma janela menor.