Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
基础设施与运维阅读约 11 分钟

去中心化数据存储:架构、工作流程与验证

一份实用指南,介绍去中心化数据存储的工作原理、如何与区块链应用集成,以及如何在生产环境前验证检索、完整性和成本。

TL;DR

去中心化数据存储将加密的、内容寻址的数据分布到独立节点上,而不是依赖单一的云服务提供商。本文解释了其机制,演示了使用内容标识符和 RPC 端点的可运行集成工作流程,并展示了如何验证检索和完整性。文章还涵盖了生产环境中重要的权衡:延迟、持久性保证、固定(pinning)经济模型,以及存储与数据可用性之间的区别。在将应用数据提交到任何网络之前,可使用本文来设计和测试存储路径。

去中心化数据存储究竟改变了什么

去中心化数据存储是一种存储模型,其中文件被分割、加密并分布到许多独立运营者手中,而不是保存在单一提供商的数据中心里。其决定性特征并非数据存储在区块链上,而是没有单个节点持有完整数据集,也没有单一公司控制访问权限。大多数网络结合了内容寻址(为每个文件生成基于哈希的标识符)、点对点传输层,以及激励或合约层,后者向运营者支付费用以保持数据可用。

这对区块链应用很重要,因为链上状态昂贵且公开。大型负载(如 NFT 媒体、应用捆绑包、快照和审计日志)通常写入存储网络,并在链上通过内容标识符引用。链上存储指针;存储网络存储字节。这种分离是后续所有内容的核心心智模型。

  • 内容寻址使数据具有防篡改能力:字节改变时标识符也会改变。
  • 跨独立节点的复制消除了单点故障。
  • 持久性是一种服务级别,而非默认属性;它取决于固定(pinning)、交易或合约。
  • 检索延迟取决于副本所在位置以及网关如何解析它们。

工作流程的假设与前提条件

以下步骤假设你有一个要存储的文件、一个能返回内容标识符(CID)的存储客户端或 HTTP API,以及一个用于在链上写入引用的 EVM 兼容 RPC 端点。你不需要特定的存储提供商来遵循该方法;替换为你网络的的上传和检索端点即可。关于端点选择,RPC 助手可以根据你的链和延迟需求匹配提供商,RPC 定价解释了请求量如何影响成本。

将机密信息排除在源代码管理之外。使用环境变量存储 RPC_URL 和 PRIVATE_KEY,切勿提交有资金的密钥。示例中故意使用了占位符。

存储管道:分块、哈希、复制、引用

典型的写入路径有四个阶段。首先,客户端对文件进行分块,并在生成的 Merkle 结构上计算内容标识符。其次,如果网络默认不加密,客户端对负载进行加密;加密是即使副本由陌生人托管也能保持数据私密的关键。第三,客户端将数据提交给存储运营者,运营者根据交易、合约或固定协议接受数据。第四,应用程序将 CID 和任何访问元数据写入链或数据库。

读取路径则相反。解析器获取 CID,定位宣传拥有该内容的提供商,并行获取分块,并根据哈希树验证每个分块。如果提供商返回损坏的字节,验证失败,解析器可以重试另一个副本。这就是为什么在内容寻址系统中完整性检查既廉价又自动,以及为什么你不应把 CID 仅仅当作文件名。

JavaScript 中可运行的上传与 CID 计算

下面的代码片段在任何网络调用之前本地计算 CID,这让你可以验证之后存储在链上的标识符与你预期的字节匹配。它使用标准的 IPFS UnixFS 导入器;使用 npm install ipfs-unixfs-importer blockstore-core 安装依赖。

对同一文件运行两次并确认 CID 相同。然后修改一个字节并确认 CID 改变。这一项检查就能在大多数集成错误进入生产环境之前捕获它们。

import { importer } from 'ipfs-unixfs-importer';
import { MemoryBlockstore } from 'blockstore-core';
import { readFile } from 'node:fs/promises';

const blockstore = new MemoryBlockstore();
const file = await readFile(process.argv[2]);

const entries = [];
for await (const entry of importer([{ content: file }], blockstore, {
  cidVersion: 1,
  rawLeaves: true
})) {
  entries.push(entry);
}

const root = entries[entries.length - 1];
console.log('CID:', root.cid.toString());
console.log('Size:', root.size);

使用 curl 在链上写入引用

一旦 CID 已知,应用程序就可以锚定它。示例通过 RPC 端点调用 eth_sendRawTransaction;在实践中,你会使用 ethers 或 viem 等库来构建和签名交易。重点在于展示请求结构以及随后的验证步骤。

提交后,获取交易收据并确认状态为成功,且发出的事件日志包含预期的 CID。交易处于待处理或已回滚状态意味着引用未写入,即使上传成功。

curl -s "$RPC_URL" \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_sendRawTransaction",
    "params": ["0xSIGNED_TRANSACTION_HEX"]
  }'

curl -s "$RPC_URL" \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "eth_getTransactionReceipt",
    "params": ["0xTRANSACTION_HASH"]
  }'

验证程序与结果表

验证应该是一个可重复的脚本,而不是手动抽查。对于每个存储的工件,记录 CID、上传时间戳、检索来源、字节长度和哈希检查结果。从至少两个独立的网关或提供商运行检索并进行比较。下表是一个模板;用你自己的测量数据填充它,而不是假设任何网络的性能。

工件CID检索来源返回字节数哈希匹配延迟(毫秒)
sample-1bafy...提供商 A是/否
sample-1bafy...提供商 B是/否
sample-2bafy...网关是/否

通过的运行会在每个来源上返回确切的字节长度和哈希匹配。失败的运行会返回不匹配、超时或类似 404 的解析错误。将任何不匹配视为数据完整性事件,并从原始来源重新上传。

诊断检索和持久性故障

大多数生产问题分为四类。解析失败意味着没有提供商宣传该 CID,通常是因为上传从未完成或固定协议已过期。超时失败意味着副本存在但无法访问或过载。完整性失败意味着字节在传输或存储过程中损坏。引用失败意味着链上指针已写入但存储层从未确认交易。

从 CID 向外排查。首先确认 CID 在公共网关上可解析。然后查询存储提供商的状态端点以获取交易或固定状态。接着检查链上引用及其区块确认数。如果 CID 可解析但你的应用程序无法读取,问题在于你的网关配置或访问控制,而不是存储网络。

  • CID 无法解析:重新检查上传完成情况和固定状态。
  • 检索缓慢:测试不同的网关并比较副本位置。
  • 哈希不匹配:丢弃响应并重试另一个提供商。
  • 链上引用缺失:检查收据和事件日志。

存储与数据可用性

去中心化存储和数据可用性相关但并不相同。存储保证字节在经济协议下随时间持久存在。数据可用性保证区块生产者发布了足够的数据供验证者重建状态。Rollup 可能将数据发布到存储网络进行长期归档,同时依赖单独的可用性层来保证共识安全。将两者混为一谈会导致架构持久但无法在结算时验证。

设计系统时,问两个独立的问题:谁获得报酬来保存这些数据,以及谁能证明它已被发布?答案通常指向不同的网络和不同的验证步骤。

权衡:延迟、成本和运营复杂性

去中心化存储以一定的延迟和运营简单性换取抗审查性和可验证性。检索可能需要联系多个提供商,冷数据获取时间可能比热云存储桶更长。成本不一定更低;它们取决于复制因子、交易期限和检索费用。加密和密钥管理增加了集中式提供商为你处理的工作。

对于运行自己基础设施的团队,存储层只是技术栈的一部分。节点运营、RPC 访问和监控是独立的问题,在节点托管指南和专用节点选项中有所涵盖。按数据类别选择存储:热应用数据、归档记录和公共媒体有不同的持久性和延迟要求。

生产集成的后续步骤

从一个非关键数据集开始,运行验证表两周,然后才迁移面向用户的内容。在 CI 中自动化 CID 检查,以便每次部署都验证引用的工件仍然可解析。记录固定或交易续期计划;持久性是一份会到期的合同。最后,审查你依赖的网络,并确认你的 RPC 提供商支持写入引用的链。对于端点选择,使用 RPC 助手而不是硬编码公共 URL。

  • 在部署管道中自动化 CID 解析检查。
  • 将交易和固定到期日期作为运营警报进行跟踪。
  • 将热、温和归档数据分离到不同的存储策略中。
  • 将加密密钥保持在存储网络之外。

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始