Back to blog

去中心化网站:GTA6 泄露站的技术分析

以 cyberleek.ar.anyone.tech 为例,拆解 Arweave 永久存储、ArNS 域名与 ar.io 网关三层如何共同把一个静态站点托管在去中心化网络上。

背景

#

传统网站的生命周期高度依赖一个中心化主体:域名由注册局和 DNS 服务商解析,文件放在云厂商或自有服务器上,证书由 CA 签发。任何一个环节被关停、过期、欠费或被审查,网站就会"下线"——哪怕内容本身没有变化。这就是我们熟悉的 Web 2 模型:你租用别人的基础设施,内容的存在权不真正属于你。

去中心化网站想改变的是这个前提:把"存储"和"解析"从单一主体手中拿出来,交给一个无需信任、内容寻址、公开可验证的网络。这类网站常被称作 permaweb(永久网),其最成熟、最常用的实现栈是 Arweave + ArNS + ar.io 网关 三层组合。

以最近的 GTA6 泄露站 cyberleek.ar.anyone.tech 为样本,从它的 HTTP 响应头反向拆解这套机制:内容存在哪、域名怎么解析、浏览器如何拿到页面,以及这套"永久托管"到底意味着什么、边界又在哪里。

从一个响应头开始

#

在浏览器打开 https://cyberleek.ar.anyone.tech/,页面本身是一个普通的单页应用(Vite 打包的静态站点)。但如果用 curl -I 看它的响应头,会发现大量 X-Ar-* 字段,这在普通云服务器上绝不会出现:

curl -sI https://cyberleek.ar.anyone.tech/
X-Ar-Io-Data-Id: 4r5DQQD_HDYan0M2KtFyUd0DUToo78NM9riY3DQRXgE
X-Arns-Name: cyberleek
X-Arns-Resolved-Id: T2_D0Jh99jdntz-lesU6mTGZ_2heKItxhlaqQwWBTL0
X-Arns-Ant-Id: RXLGu3wzHkjNkMZDePUrWHCTqpoAaBU9GTGNafhD6cM
X-Arns-Ttl-Seconds: 900
X-Arweave-Owner-Address: 7gFAEaOIEHNhx2BqiVtpCgF_7HUePnN8E2aejRR6vTE
X-Arweave-Tag-Content-Type: text/html
X-Ar-Io-Trusted: true
X-Ar-Io-Verified: false
X-Ar-Io-Stable: false
X-Ar-Io-Hops: 1
Content-Digest: sha-256=:wfWkyHM8I9Stp3YfzXfcL9qAzjpGnjVhMkvcvJ1Vm+M=:
Anyone-Location: https://pv73nyjzcxzwxkt7nj24vfa4ecowripemgpti7d3kzilfqantoebwlid.onion
Server: envoy

这些头把整个技术栈暴露得一清二楚:

  • X-Arns-*:域名 cyberleek.ar 通过 ArNS(Arweave Name System)解析。
  • X-Arweave-*:内容存储在 Arweave 网络上,X-Ar-Io-Data-Id 就是内容对应的交易 ID。
  • X-Ar-Io-*:这台响应服务器是 ar.io 网络的网关(gateway)。
  • Content-DigestSignature:内容被内容寻址并经过签名。
  • Anyone-Location 指向一个 .onion 地址:同样的内容还能通过 Tor 洋葱网络访问。

技术分析:三层架构

#

一个去中心化网站可以被拆成三个相互独立、可以分别替换的层次。

解决的问题对应的技术本文中的证据
存储层内容放在哪、如何永久存在ArweaveX-Arweave-Owner-AddressX-Ar-Io-Data-Id
命名层人类可读的名字如何映射到内容ArNS(ANT)X-Arns-* 系列头
访问层浏览器如何把名字变成页面ar.io 网关X-Ar-Io-* 系列头

三层解耦是关键:存储不依赖某个域名,域名不绑定某台服务器,访问也不依赖单个服务商。任何一层都可以被其他实现替换,而另外两层不受影响。

存储层:Arweave

Arweave 是一个为永久存储设计的区块链。它和比特币、以太坊这类"记录账本状态"的链定位不同,Arweave 的核心目标是存储数据本身:图片、网页、JSON、任意字节。

它有两个关键设计:

一次性付费,长期存储。 上传数据时支付一次费用,这笔费用的一部分进入一个"存储基金"(storage endowment),用来长期支付矿工存储数据的成本。协议设计目标是一次付费覆盖约 200 年的存储成本(这个数字会随代币价格和网络经济模型调整),所以常被概括为"付一次,存永久"。

内容寻址。 每个上传的数据被打包成一个交易(transaction),拥有一个唯一的交易 ID——43 个字符的 base64url 字符串。上文中 X-Ar-Io-Data-Id: 4r5DQQD_... 就是这样一串 ID。寻址依据是内容本身,而不是文件所在位置:同一个 ID 永远指向同一份字节,任何人从任何节点取回的数据哈希都必须一致。

+-----------------------------------------------+
| Arweave (存储层)                              
|                                               
| 文件 -> 打包 -> 交易 tx_43chars -> 全网矿工 
|                  |                            
|                  +-> 交易 ID = 内容地址      
|                      (不可变, 永久可查)      
+-----------------------------------------------+

一个静态站点在 Arweave 上不是"一个文件夹",而是一组交易:HTML、JS、CSS、图片各自对应一个交易,再由一个 path manifest(路径清单)把 /index.html/assets/... 这些路径映射到各自的交易 ID。清单本身也是一个交易,它的 ID 就是整个站点的入口 ID。

命名层:ArNS 与 ANT

交易 ID 虽然稳定,但对人不可读。没有人愿意记 4r5DQQD_HDYan...。于是有了 ArNS(Arweave Name System):一个把 cyberleek 这样的短名字映射到 Arweave 交易 ID 的命名系统,域名后缀是 .ar

ArNS 的名字不是简单的一行配置,而是由 ANT(Arweave Name Token,Arweave 名称代币) 持有。ANT 本质是一个运行在 Arweave 上的智能合约(基于 SmartWeave / AO 范式),它本身也是一枚 NFT:

  • 谁持有 ANT,谁就能控制这个名字。
  • ANT 合约里记录了这个名字指向哪些交易 ID(可以是一条记录,也可以是带子域的多条记录)。
  • 转移 ANT 的所有权 = 转移域名的控制权,这是一笔链上交易。

响应头里 X-Arns-Ant-Id: RXLGu3wz... 就是持有 cyberleek 这个名字的 ANT 合约 ID,X-Arns-Resolved-Id: T2_D0Jh99j... 是它当前解析出来的目标交易 ID,X-Arns-Ttl-Seconds: 900 表示解析结果可缓存 900 秒。

cyberleek.ar -> (ANT 合约解析) -> 交易 ID T2_D0Jh99j... -> 站点内容
               |-> 持有 ANT = 拥有这个名字       |-> 可在合约里更新指向

这带来一个与传统域名系统的根本区别:域名不再是某个注册局数据库里的一行记录,而是一枚可持有、可转移的链上资产。 没有"续费"的概念——只要你持有 ANT,名字就归你;也没有中心化机构能单方面冻结或收回它(前提是网络本身健康)。

访问层:ar.io 网关

浏览器无法直接"连上 Arweave"——它只会发 HTTPS 请求。把"交易 ID"和"ArNS 名字"翻译成浏览器能访问的 HTTP 资源,靠的是 网关(gateway)

anyone.tech 这台服务器就是一个运行在 ar.io 网络 上的网关。ar.io 是一个去中心化的网关网络:世界各地的网关运营者运行网关节点、质押代币,加入一个共享的网关注册表。任何一台网关都能解析 ArNS 名字、从 Arweave 取回内容并返回给浏览器。因为内容是内容寻址的,你不需要信任某一台特定的网关——换一台网关拿到的是同一份字节,可以用 Content-Digest 校验。

响应头里的几个字段大致对应网关的状态:

  • X-Ar-Io-Hops: 1:这次请求在网关之间转发了 1 跳。
  • X-Ar-Io-Trusted: true:这台网关在 ar.io 网络中是受信任(已质押注册)的网关。
  • X-Ar-Io-Stable:底层 Arweave 数据是否已处于稳定(finality 意义上的)状态。
  • X-Ar-Io-Verified:本次返回的数据是否经过了 ar.io 的验证流程。

Server: envoy + X-Powered-By: Express 说明网关软件栈内部用 Envoy 做边缘代理、Express 做应用层,这也是 ar.io 网关的典型形态。

实现原理:一次请求的完整生命周期

#

把三层串起来,浏览器访问 https://cyberleek.ar.anyone.tech/ 时发生的事:

 浏览器                    网关 (anyone.tech)             Arweave 网络
   | 1. GET /                     |                              |
   |------------------------------>                              |
   |                              | 2. 解析 ArNS 名字           |
   |                              | cyberleek.ar                 |
   |                              | --(查 ANT 合约)--> 交易 ID  |
   |                              |                              |
   |                              | 3. 按交易 ID 取数据         |
   |                              |------------------------------>
   |                              |<----- 内容字节 + 签名 ------|
   |                              |                              |
   | 4. 返回页面 + X-Ar-* 头     |                              |
   |<-----------------------------|                              |
   |                              |                              |
   | 5. 浏览器渲染;JS 再请求   |                              |
   | 其余资源同样走内容寻址     |                              |

其中第 2 步是这套架构区别于传统 DNS 的核心:网关不是去查"域名对应哪个 IP",而是用 ArNS 名字去解析出一个内容地址。地址和名字是两个独立的层,中间由 ANT 合约连接。

第 4 步返回的响应还带有一层完整性保障——HTTP 消息签名。响应头里的 Signature-Input 声明了对哪些字段做了签名(@statusx-arns-namex-arns-resolved-idcontent-digest 等),Signature 则是对应的签名值,算法是 ed25519:

sig1=("@status" "x-arns-name" "x-arns-resolved-id" "content-digest"
  "x-ar-io-trusted" "@method";req "@path";req);created=...;
  keyid="ed25519:hxSbhmbhRAO2HYBVM0Ofg7AX6cTlbmaCwD4RhJjCuao";alg="ed25519"

这遵循 RFC 9421(HTTP Message Signatures)。网关用自己的 ed25519 密钥对"解析结果 + 内容摘要"签名,客户端可以独立验证:网关确实把 cyberleek 解析成了那个交易 ID,且返回的字节确实对应那个摘要,而不是网关在中间偷换了内容。配合 Content-Digest: sha-256=:...:,内容寻址的"可验证"才真正闭环——你拿到的不仅是一个页面,还附带了"它确实是这个名字指向的那份内容"的密码学证据。

实例分析:cyberleek 到底"去中心化"在哪里

#

回到样本网站。把它的页面和 JS 包拆开看,会发现它是一体两面:

静态外壳——真正去中心化的部分。 页面是 Vite 打包的纯静态 SPA(HTML + 带哈希的资源文件),整体作为一个 path manifest 上传到 Arweave:

  • 这份前端不可篡改、不可被单点删除:内容一经写入,任何一方(包括网关)都无法静默替换,除非重新上传并更新 ANT 指向。
  • 不依赖任何中心化服务器存活:只要 Arweave 网络还有矿工在复制数据,站点就能被任何 ar.io 网关访问。
  • 它的名字 cyberleek.ar 是一枚链上资产,理论上不存在"被注册局收回"或"忘记续费而失效"。

动态数据——仍然中心化的部分。 页面上"token 信息、交易链接、投票、公告"都是运行时从远程拉取的。解开它的 JS 包可以看到,它连接的是多个 Solana RPC 节点:

https://api.mainnet-beta.solana.com
https://solana.api.onfinality.io/public
https://solana-rpc.publicnode.com
https://solana.api.pocket.network

所以这个站点的"去中心化"只覆盖了托管层。它的实时数据、代币合约、流动性池,仍然跑在 Solana 及其 RPC 服务上——而 RPC 端点、钱包、行情接口,往往是集中运营的第三方服务。

这正是理解去中心化网站最重要的一点:

注意事项:这套架构的真实边界

#

去中心化托管解决了一些问题,也引入了新的代价和盲区,实际使用时值得清醒对待。

不可篡改是把双刃剑。 内容一旦写入就永久存在,连你自己也无法"删除"。想更新一个错别字,得重新上传一份新内容、拿到新交易 ID,再去更新 ANT 的指向,旧版本不会消失,只是不再被名字指向。上传前必须假设"它会被永久公开"——任何敏感信息、密钥、未授权内容,一旦上链就无法撤回。

"永久"依赖网络的健康。 Arweave 的"存 200 年"是经济模型上的设计目标,不是物理定律。它依赖矿工持续获得存储激励、代币经济长期成立、协议不被攻破。作为一个仍在演进的系统,这些假设并非绝对。

网关仍是信任的入口。 虽然内容寻址让你可以换网关、验签名,但绝大多数用户并不会去手动校验 Content-Digest。你访问的仍是一个 HTTPS 域名,理论上一个恶意或受控的网关可以返回错误内容。签名和摘要提供了验证能力,但"能力"需要客户端真正去用才构成安全。

成本与门槛。 上传到 Arweave 需要支付以 AR 计价的手续费(金额随网络拥堵和代币价格波动),管理 ArNS 名字需要理解 ANT 合约与钱包。相比"买个 VPS 传个静态站",入门成本更高,工具链也更小众。

去中心化前端 ≠ 去中心化应用。 如实例分析所示,如果动态数据仍依赖中心化 RPC、钱包、预言机,那么前端再"永久",应用整体仍有关停或失效的点。对用户来说,一个"永不下线的空壳"可能比"会下线的完整功能"更糟——设计去中心化应用时要先想清楚数据流里哪些环节仍是中心化的。

总结

#

一个 Arweave 生态的去中心化网站,本质是三层协作:

  1. 存储层(Arweave):内容被永久、内容寻址地存储,以交易 ID 为地址,一次性付费换取长期存在。
  2. 命名层(ArNS + ANT):把人类可读的 .ar 名字映射到交易 ID,名字本身是可持有、可转移的链上资产。
  3. 访问层(ar.io 网关):把名字和交易 ID 翻译成浏览器能访问的 HTTPS 资源,并附上可验证的签名与摘要。

cyberleek.ar.anyone.tech 是这套栈的一个真实样本:它的前端永久托管在 Arweave,名字通过 ArNS 解析,由 ar.io 网关以可验证的方式提供;而它的动态数据仍依赖 Solana 的中心化 RPC。这个对比恰好勾勒出去中心化网站的真实面貌——去中心化是分层的、有边界的,它解决的是"内容的存在权和抗审查性",而不是一键解决所有信任问题。

对想上手的人,最直接的路径是:搭一个纯静态站点(任何 SPA 或静态生成器皆可),用 Arweave 生态的工具把它上传为一个 path manifest,再注册一个 .ar 名字把 ANT 指过去,最后通过任意 ar.io 网关访问。动手之前,先想清楚两件事:你要上传的内容是否经得起"永久公开";以及你的应用里,哪些数据仍然依赖中心化后端。

$ echo "collect what matters, write it down"