本页面由机器翻译,仅供参考。如有出入,请以英文原文为准。
256t.org 是一个专门用于发布某种特定类型内容寻址存储公开规范的域名。 在这一方案中,URL 路径中最后一个最多 94 个字符的元素决定了该 URL 处的内容。 将来,它也许还会发展成为一个使用该方案发布内容的公共设施。 不过,这目前超出了本站的范围。
为什么要有 256t.org? 在我看来,一个用于通用内容寻址存储的简单标准总体上是有用的。
每一个 94 字符的路径都可以用来获取与其指定的长度和哈希相匹配的内容。 如果没有可用的内容,则返回 404。
SHA-512 哈希的长度为 512 位,即 64 字节。 64 字节可以存放在一个 86 字符的 base64 字符串中。
(64 * 8) / 6 = 85.333... ~= 86
64 字节或更短的内容可以直接存放在相同或更小的空间里。 在这种情况下,应当对内容本身进行 base64 编码并尽量少用填充,而不是使用它的哈希。
一个 8 字符的 base64 字符串可以存储 48 位。
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
以下说法虽然并不严格成立,但可以视为足够正确: - 一个 94 字符的路径唯一确定内容。(不过,对于小于 64 字节的内容,这完全成立。) - 内容是不可变的。(它可能被仍然符合描述的另一份内容所替换。) - 内容可以安全地无限期缓存。
因此,所有 HTTP 元信息(例如响应头和 ETag)都会表明该内容可以无限期缓存。
94 字符的内容标签由 8 字符的长度前缀和其后 86 字符的哈希组成。
| 内容的长度 | 内容的哈希 | 内容本身 | |
|---|---|---|---|
| 何时 | 始终 | length(content) > 64 | length(content) <= 64 |
| 起始 | 1 | 9 | 9 |
| 结束 | 8 | 94 | 94 |
| 长度 | 8 | 86 | 0 到 86 |
| 格式 | Base64 | Base64 | Base64 |
| 信息 | length(content) | sha-512(content) | content |
更具体地说,是文件名和 URL 安全的 Base64,又称 base64url。
这种用于标识内容、不超过 94 个字符的 base64 字符串,被称为内容标识符(content identifier),简称 CID。
任何服务器都可以公开一个基础 URL,其内容遵循本规范。 可惜的是,哪些服务器托管哪些内容、以及如何找到它们,超出了本文的范围。 本服务器在这里托管了一小部分 CID。
这些事情都超出了本文的范围。
examples/ 目录包含用于测试 CID 生成和验证的示例文件。其中包括一些 256t 品牌资源,以多种媒体类型演示本规范:
| 文件 | 说明 |
|---|---|
| 256t.mp4 | 讲解 256t.org 内容寻址存储规范的视频(也可在 YouTube 上观看)(英文) |
| 256t.png | 256t.org 概念示意图 |
| 256t_Content_Addressable_Storage_Specification.pdf | 完整规范的 PDF 文档(英文) |
| 256t_and_the_End_of_Broken_Links.m4a | 关于 256t.org 如何解决链接失效问题的音频讨论(英文) |
| 256t_logo.jpg | 256t.org 标志(JPEG 格式) |
| 256t_logo.png | 256t.org 标志(PNG 格式) |
| 256t_qr_code.png | 指向 256t.org 的二维码 |
这些文件可以配合 CID 示例工具或文件 CID 检查工具使用,以验证它们的内容标识符。
一份提议 t256: URI 协议的 RFC 草案可在 rfc/draft-cox-t256-uri-scheme-00.md 查看。t256: URL 只包含一个 CID,没有主机或路径。(256t: 这种写法不是有效的 URI 协议名,因为 RFC 3986 要求协议名以字母开头。)
关于部署和发布使用 CID 的内容寻址存储的信息,请参阅发布与存储。
对 256t.org 有疑问?请查看常见问题页面,那里解答了关于 CID、实现、安全性等方面的常见问题。
有几种不同类型的碰撞需要加以区分: - 意外碰撞 —— 纯属偶然 - 对抗性碰撞 —— 有人蓄意制造 - 既有碰撞 —— 已经有不同的内容产生了同一个 CID - 问题碰撞 —— 使用 CID 获取内容时返回了错误的内容
发生问题碰撞的几率相当低。有两种方法可以将其降到最低: - 始终验证 CID 内容。已有许多实现可以做到这一点。直接撒谎要比设计出一次碰撞容易得多。 - 减少对手。如果没有人把有问题的内容放到你可能接受的地方,剩下的就只有意外了。
对于意外造成的问题碰撞,我可以坦然忽略。
256t.org 规范已经用多种编程语言实现。每个实现都提供生成和验证内容标识符(CID)的工具。
| 语言 | 徽章 | 代码 |
|---|---|---|
| Bash | bash | |
| C | c | |
| C++ | cpp | |
| C# | csharp | |
| Clojure | clojure | |
| ClojureScript | clojurescript | |
| CMake | cmake | |
| Crystal | crystal | |
| D | d | |
| Dart | dart | |
| Deno | deno | |
| ECMAScript | ecmascript | |
| Elixir | elixir | |
| Elm | elm | |
| Emacs Lisp | emacs-lisp | |
| Erlang | erlang | |
| F# | fsharp | |
| Fortran | fortran | |
| Go | go | |
| Groovy | groovy | |
| Haskell | haskell | |
| Java | java | |
| JavaScript | javascript | |
| Julia | julia | |
| Kotlin | kotlin | |
| Lua | lua | |
| Nim | nim | |
| Node.js | node | |
| OCaml | ocaml | |
| Perl | perl | |
| PHP | php | |
| PowerShell | powershell | |
| Prolog | prolog | |
| Python | python | |
| R | r | |
| Racket | racket | |
| Ruby | ruby | |
| Rust | rust | |
| Scala | scala | |
| Swift | swift | |
| Tcl | tcl | |
| TypeScript | typescript | |
| Unison | unison | |
| Zig | zig |