Esta página foi traduzida automaticamente. Em caso de divergência, prevalece o original em inglês.

256t.org

Logotipo do 256t.org      QR code do 256t.org

Conceito de armazenamento endereçável por conteúdo do 256t.org

O quê?

O 256t.org é um domínio dedicado a ser uma especificação pública para um tipo específico de armazenamento endereçável por conteúdo. Nesse esquema, o último elemento de até 94 caracteres no caminho de uma URL define o conteúdo daquela URL. Em algum momento no futuro, ele poderá evoluir para ser também um serviço público para publicar conteúdo usando o esquema. No entanto, isso está atualmente fora do escopo deste site.

Por quê?

Por que o 256t.org? Um padrão simples para um armazenamento genérico endereçável por conteúdo me parece útil de modo geral.

Como?

Todo caminho de 94 caracteres pode ser usado para obter o conteúdo que corresponde ao tamanho e ao hash especificados. Se nenhum conteúdo estiver disponível, um 404 é retornado.

Um hash SHA-512 tem 512 bits, ou 64 bytes. 64 bytes podem ser armazenados em uma string base64 de 86 caracteres.

(64 * 8) / 6 = 85.333... ~= 86

Conteúdo de 64 bytes ou menos pode ser armazenado diretamente em espaço igual ou menor. Nesses casos, o próprio conteúdo deve ser codificado em base64 e usado com o mínimo de preenchimento, em vez de usar seu hash.

Uma string base64 de 8 caracteres pode armazenar 48 bits.

2^48 = 2^40 * 2^8
  = 2^10 * 2^10 * 2^10 * 2^10 * 2^8
  = 2^8  * 2^10 * 2^10 * 2^10 * 2^10
  = 256    K      M      G      T

O que segue pode ser tratado como verdadeiro o bastante, apesar de ser falso: - Um caminho de 94 caracteres determina o conteúdo de forma única. (No entanto, isso é totalmente verdadeiro para conteúdo com menos de 64 bytes.) - O conteúdo é imutável. (Ele poderia ser substituído por um conteúdo diferente que ainda corresponda à descrição.) - O conteúdo pode ser armazenado em cache com segurança indefinidamente.

Assim, todas as metainformações HTTP, como cabeçalhos e ETags, indicarão que o conteúdo pode ser armazenado em cache indefinidamente.

A etiqueta de conteúdo de 94 caracteres consiste em um prefixo de tamanho de 8 caracteres seguido de um hash de 86 caracteres.

tamanho do conteúdo hash do conteúdo o próprio conteúdo
quando sempre length(content) > 64 length(content) <= 64
início 1 9 9
fim 8 94 94
tamanho 8 86 0 a 86
formato Base64 Base64 Base64
info length(content) sha-512(content) content

Base64

Mais especificamente, Base64 segura para nomes de arquivo e URLs, também conhecida como base64url.

CID

Essa string base64 de 94 caracteres ou menos, que identifica um conteúdo, será chamada de identificador de conteúdo, ou CID (do inglês content identifier).

Quando

Onde

Qualquer servidor pode expor uma URL base com conteúdos que sigam esta especificação. Infelizmente, quais servidores hospedam quais conteúdos e como encontrá-los está fora do escopo deste texto. Este servidor hospeda um pequeno conjunto de CIDs aqui.

Fora do escopo deste texto

Essas coisas estão fora do escopo deste texto.

Ferramentas

Arquivos de exemplo

O diretório examples/ contém arquivos de exemplo para testar a geração e a verificação de CIDs. Entre eles há recursos com a marca 256t que demonstram a especificação com vários tipos de mídia:

Arquivo Descrição
256t.mp4 Vídeo explicando a especificação de armazenamento endereçável por conteúdo do 256t.org (ou no YouTube) (em inglês)
256t.png Representação visual do conceito do 256t.org
256t_Content_Addressable_Storage_Specification.pdf Documentação em PDF da especificação completa (em inglês)
256t_and_the_End_of_Broken_Links.m4a Discussão em áudio sobre como o 256t.org lida com links quebrados (em inglês)
256t_logo.jpg Logotipo do 256t.org (formato JPEG)
256t_logo.png Logotipo do 256t.org (formato PNG)
256t_qr_code.png QR code com link para o 256t.org

Esses arquivos podem ser usados com a ferramenta Exemplos de CID ou com a ferramenta Verificação de CID de arquivo para verificar seus identificadores de conteúdo.

Esquema de URI

Um rascunho de RFC que propõe o esquema de URI t256: — uma URL que contém apenas um CID, sem host nem caminho — está disponível em rfc/draft-cox-t256-uri-scheme-00.md. (A grafia 256t: não é um esquema de URI válido porque a RFC 3986 exige que os esquemas comecem com uma letra.)

Publicação

Para informações sobre como implantar e publicar armazenamento endereçável por conteúdo usando CIDs, consulte Publicação e armazenamento.

Perguntas frequentes

Tem dúvidas sobre o 256t.org? Confira a página de Perguntas frequentes para ver respostas a perguntas comuns sobre CIDs, implementação, segurança e mais.

E as colisões?

Há alguns tipos diferentes de colisão que é importante distinguir: - acidental — puramente por acaso - adversarial — alguém tentou provocá-la - existente — um CID foi produzido a partir de conteúdos diferentes - problemática — usar o CID para obter um conteúdo retornou o conteúdo errado

As chances de uma colisão problemática são bem baixas. Há duas maneiras de minimizá-las: - Sempre verifique o conteúdo do CID. Há muitas implementações para fazer isso. É mais fácil simplesmente mentir do que engendrar uma colisão. - Reduza os adversários. Se ninguém estiver colocando conteúdo problemático onde você possa aceitá-lo, sobram apenas os acidentes.

Para mim, tudo bem simplesmente ignorar colisões problemáticas acidentais.

Implementações

A especificação do 256t.org foi implementada em várias linguagens de programação. Cada implementação fornece utilitários para gerar e verificar identificadores de conteúdo (CIDs).

Linguagem Selo Código
Bash Bash bash
C C c
C++ C++ cpp
C# C# csharp
Clojure Clojure clojure
ClojureScript ClojureScript clojurescript
CMake CMake cmake
Crystal Crystal crystal
D D d
Dart Dart dart
Deno Deno deno
ECMAScript ECMAScript ecmascript
Elixir Elixir elixir
Elm Elm elm
Emacs Lisp Emacs Lisp emacs-lisp
Erlang Erlang erlang
F# F# fsharp
Fortran Fortran fortran
Go Go go
Groovy Groovy groovy
Haskell Haskell haskell
Java Java java
JavaScript JavaScript javascript
Julia Julia julia
Kotlin Kotlin kotlin
Lua Lua lua
Nim Nim nim
Node.js Node.js node
OCaml OCaml ocaml
Perl Perl perl
PHP PHP php
PowerShell PowerShell powershell
Prolog Prolog prolog
Python Python python
R R r
Racket Racket racket
Ruby Ruby ruby
Rust Rust rust
Scala Scala scala
Swift Swift swift
Tcl Tcl tcl
TypeScript TypeScript typescript
Unison Unison unison
Zig Zig zig