OpenTimestamps 存证的核心价值只有一个:证明某个文件在某个时间点之前就已经存在。它不证明文件内容是真的,不证明文件是谁写的,也不证明文件没有被修改过——它只回答"这个文件的时间下限是什么"。
理解这一点,后面的操作和核验逻辑就顺了。
存证:只发哈希,不发文件
OpenTimestamps 的协议设计是只提交文件的 SHA-256 哈希值到日历服务器,原始文件从不离开你的设备。这是它比很多"上传文件到网站打时间戳"的服务更安全的地方。
操作上,官方客户端 opentimestamps-client 用一条命令就能完成:
ots stamp 你的文件.pdf
执行后会生成一个 你的文件.pdf.ots 文件。这个 .ots 就是时间戳证明(proof)。它需要和你原文件放在一起保存,验证时两个都要用。
从 ots stamp 的输出里,你会看到它同时提交到了多个日历服务器(通常是 alice、bob、finney 等几个公共日历)。这是冗余设计:只要有一个日历最终把哈希锚定到比特币区块,证明就能完成。
关于"pending":不是失败
刚执行完 ots stamp 后,.ots 文件里只有日历服务器的待定证明(pending attestation),还没有比特币区块链的确认。
比特币区块确认通常需要 10 到 60 分钟,网络拥堵时可能延长到几小时。在这个窗口内,ots verify 会告诉你"Pending confirmation in Bitcoin blockchain",这是正常的,不是存证失败。
如果需要拿到完整的、可以独立验证的证明,需要执行:
ots upgrade 你的文件.pdf.ots
upgrade 会向日历服务器查询是否已经确认,如果确认了,就把比特币区块的路径信息写入 .ots 文件本身。升级后的证明不再依赖日历服务器在线,可以离线用本地区块头验证。
核验:需要本地区块链节点
这是 OpenTimestamps 最容易卡住的地方:官方客户端验证需要运行一个本地 Bitcoin Core 节点(修剪过的节点也可以)。
如果你没有本地节点,ots verify 会尝试通过公共区块浏览器完成验证。这条路能走通,但验证的信任假设变了:你信任的是区块浏览器返回的数据,而不是比特币网络本身的共识。
所以核验的完整路径是:
在存证后尽快 upgrade:不要一直停留在 pending 状态。
保留
.ots文件:升级后的.ots是自包含的,里面包含了从文件哈希到比特币区块的完整密码学路径。用本地节点验证(推荐):运行 Bitcoin Core,然后执行
ots verify 你的文件.pdf.ots,客户端会直接查询本地区块头,不依赖任何第三方。确认验证输出:成功的输出会明确显示"Bitcoin block XXXXXX attests existence as of 日期"。
如果 .ots 还是 pending 状态,ots verify 会尝试自动升级;如果升级成功,它会继续验证。如果日历服务器已经关闭或不再响应,pending 的证明就无法升级,也就无法完成验证——这是 OpenTimestamps 依赖日历服务器的一个实际风险点。
一个容易被忽略的隐私细节
opentimestamps.org 的网页版工具要求你把文件拖进浏览器。虽然它的 JavaScript 确实在本地计算哈希、不上传文件,但网站本身可以悄悄改变行为——你从外部看不出它是否真的没有上传。
对于敏感文件,更可靠的做法是在本地计算 SHA-256,只把哈希值提交给日历服务器。一些工具(如 istampit-cli)支持 --hash 参数,直接接受一个预计算的 SHA-256 摘要,完全不接触原文件。协议本身从不要求提交原文件,网页版的"拖文件"只是操作上的便利,不是必要步骤。
判断你属于哪种情况
如果你只是证明一个普通文件的存在时间:用官方 CLI 或可信的本地工具存证,升级 .ots,保留原文件和 .ots 一起。验证时如果有本地节点就本地验证,没有就用公共浏览器验证,接受信任假设。
如果你处理的是敏感文件:不要用网页版拖文件。在本地算好 SHA-256,用支持 --hash 参数的工具提交哈希,确保原文件一个字节都没有离开你的设备。
如果你需要长期可验证的证明:确保 .ots 已经 upgrade 到包含比特币区块路径的状态。一个停留在 pending 的 .ots 在日历服务器下线后就无法完成了。升级后的 .ots 可以独立验证,不依赖日历服务器。
参考资料
- PyPI·istampit-cli — Blockchain Timestamp Verification (OpenTimestamps),页面发布或更新日期:2025-08-15;核查日期:2026-10-14。
- NPM·@otskit/mcp,页面发布或更新日期:2026-09-05;核查日期:2026-10-14。
- PyPI·git-ots,页面发布或更新日期:2026-09-15;核查日期:2026-10-14。
- NPM·zeitstempel,页面发布或更新日期:2026-08-20;核查日期:2026-10-14。
- GitHub·opentimestamps/opentimestamps-client,页面发布或更新日期:2026-02-06;核查日期:2026-10-14。
- Politecnico di Milano·Thesis on OpenTimestamps,页面未标明更新日期;核查日期:2026-10-14。
- NPM·@otskit/core,页面发布或更新日期:2026-06-09;核查日期:2026-10-14。



