全部文章

阅读约 5 分钟

从 Merkle 批里证明某一个文件:包含证书

当许多文件哈希以单个 Merkle 根发布到 Cardano 之后,包含证书是一份可下载的小文件,用来证明某个特定文件确实属于那一批——你可以在自己的浏览器里核验,无需信任 CardanoWall,且永远有效。

当你把一批文件发布到 Cardano 时,真正上链的只有一枚小小的指纹:单个 Merkle 根,它代表了整份列表。这让发布始终保持低成本。但随之而来一个显而易见的问题——如果链上只有这个根,你之后怎样证明某一个具体文件确实在这一批里?

答案就是包含证书:一份你可以下载的小文件,用来证明某个特定文件的哈希确实属于那次已发布的批。任何人都能在自己的浏览器里、对照任意公开的 Cardano 浏览器来核验它,全程无需信任 CardanoWall。而且因为证明本身就嵌在文件里,它会永远有效。

这是 Merkle 批处理在日常里的好搭档。批处理让你一次性对成千上万个文件做出承诺;包含证书则让你把其中某一个重新挑出来,并在日后加以证明。

包含证书解决了什么问题?

设想你去年在一次批里发布了一千个文件——一个装满合同的文件夹、一组发布制品、一整天的审计日志。它们全都被折叠进同一个 Merkle 根,而这个根在 Cardano 上被打上了时间戳。便宜、紧凑、搞定。

如今有人偏偏对其中某一个文件提出质疑。也许交易对手会问:「你能证明这份合同在截止日期之前就已经存在吗?」可区块链只保存了根,既没有文件,也没有列表。指着那笔交易,只能证明某一批已知规模的东西曾经存在——却无法证明这一份文档就在其中。

包含证书弥补了这道缺口。它是一份小巧、自成一体的文件,实质上是在说:「这个文件的哈希是这笔 Cardano 交易背后那一批里的第 42 项,下面就是任何人都能跑一遍以确认的精确算法。」你把证书递过去,对方无需你本人、你的账户、乃至我们的网站还存在,就能完成核验。

一份证书里到底有什么?

可以把它想成一个封好的证据包,里面有三部分。

  • 你那个文件的指纹。 不是文件本身——只是它的哈希。证书从不携带你文档的内容,所以即便文件是私密的,分享它也很安全。
  • 证明路径。 一小串「兄弟」指纹,让任何人都能把你那个文件的哈希沿 Merkle 树重新折叠向上,恰好得到那个已发布的根。正是这一部分让证书自成一体:算法已经嵌在里面,因此谁都不必再向你索要这一批里的其余文件。
  • 区块链锚点。 根所发布到的那笔 Cardano 交易、区块链为它记录的时间,以及若干个公开浏览器链接,让任何人都能自行查证。

它还包含一行通俗易懂的 claim,说明这份证书证明了什么,并附上一段如何独立核验的简短说明。一份证书可以覆盖一个文件,也可以同时覆盖多个——每一个都有自己的证明路径,以及一个清晰的 verified 标记。

CardanoWall 可以用几种格式把这个包交给你:一份 JSON 文件(机器可读的原件,工具可以重新核验)和一份 PDF(给人阅读、可打印的版本,适合归入法律卷宗,JSON 作为附件藏在文档里面,因此这份文档仍然是机器可验证的)。

你怎样拿到一份证书?

你在交易页面上,用自己的浏览器,亲手生成它。

打开承载那一批的交易的公开页面。由于记录里包含一个 Merkle 根,该页面会提供包含检查。从这里开始只需两个小步骤:

  1. 告诉它是哪个文件。 要么粘贴文件的哈希,要么直接把文件拖到页面上——你的浏览器会在本地完成哈希计算,绝不会上传文件。
  2. 读取结果。 页面取回这一批的叶子列表,重新计算证明,然后给你一个清晰的绿色(你的文件在这一批里)或红色(它不在)结果。

当它是绿色时,你就下载证书——JSON、PDF,或两者皆有。这份下载件就是可携带的证明。把它发邮件、归档、附进合同、放进数据室。从此它与 CardanoWall 彻底无关了。

整个过程都在客户端发生。我们并不是在服务器上生成证书再要你信任它;是你自己的浏览器在干这份活,而这恰恰正是结果可信的原因。

为什么任何人都不必信任 CardanoWall?

因为证书里没有任何一处依赖于我们诚实、在线,甚至还在营业。

包含证书内部坐落着两项主张,而两项都是任何人都能自己核验的:

  • 你的文件曾在这一批里。 验证方把你那个文件的哈希沿证明路径折叠向上,确认它能重现那个已发布的根。这纯粹是算术——只需要证书文件,别的什么都不要。哪怕你的文件改动了一个比特,折叠就会落在另一个根上,核验也就失败了。
  • 那个根确实在 Cardano 上。 验证方在任意公开的 Cardano 浏览器上查证那笔交易——Cardanoscan、AdaStat,或他们自选的某个——确认链上记录里坐着的就是同一个根。这次查证完全不牵涉任何 CardanoWall 服务器。

把这两项检查合在一起,就证明了该文件在区块链为那笔交易盖上的时间之前(或当时)已经存在。而那个时间来自 Cardano,不是来自我们。我们无法把某个区块快进、把某笔交易倒填日期,也无法悄悄篡改历史;什么时候发生,由区块链说了算。这正是锚定到一条公开链、而非要你信任某家公司的时钟的全部意义所在。

如果 CardanoWall 明天就消失,我们发过的每一份证书也照样能继续验证。开源的 cardanowall 命令行工具,以及任何理解这套格式的独立工具,都能重新跑一遍同样的检查。

flowchart LR
  A["你的文件"] -->|"本地哈希"| B["文件哈希"]
  B --> C["沿证明路径折叠向上"]
  C --> D["重算出的根"]
  E["Cardano 交易<br/>(公开浏览器)"] --> F["已发布的根 + 区块时间"]
  D -->|"必须相等"| F
  F --> G["在区块时间之前<br/>(或当时)已存在"]

一份证书不能证明什么?

证书对一件事说得精确,对其余一切则保持沉默——而恰恰是对此保持诚实,才让它值得信赖。

它证明的是:某个特定文件的哈希在区块链的区块时间**之前(或当时)**已经存在,并且它曾属于那个被承诺的批。仅此而已。具体来说:

  • 它不能证明谁创建了这个文件。 证书对作者身份只字未提。任何人都可能发布了这一批。(在 Label 309 中,作者身份是一项独立的、可选的签名,从不被默认假定——参见证明不能证明什么。)
  • 它不能证明文件为真、准确或合法。 它证明的是那串字节在某个时间之前已经存在,而不是它所说的内容正确无误。
  • 它不能证明文件是唯一版本或原始版本。 它证明的是这个确切文件曾在这一批里——而不是不存在任何其他版本。
  • 它不是一份「合格」时间戳。 这是一种区块链锚定的时间戳,与其他区块链时间戳同属一类。它是关于时间的有力佐证,但并不是由受监管机构出具的 eIDAS 合格电子时间戳。如果某项流程明确要求合格时间戳,单凭它本身并不满足那道门槛(参见存在性证明与时间戳机构的对比)。

证书的价值,恰恰在于它什么都不夸大。它把时间与完整性钉死,而把含义留给围绕它的那些文档与人。

这与 OpenTimestamps 有什么关系?

如果你已经了解 OpenTimestamps,这个思路会让你感到熟悉。

OpenTimestamps 给你一份小巧的 .ots 证明文件:一份可携带、自成一体的时间戳,任何人之后都能验证,而无需信任制作它的那个服务。包含证书是同一种形状的东西——一份你可以递给任何人的可携带证明文件——只是有两处值得了解的差异。

时间戳机构是 Cardano 区块链,时间取自承载你那个根的区块,而不是取自某台日历服务器。而证明所用的算法,与该标准在别处所用的是同一套 Merkle 树构造,因此单单一份证书就能从一个庞大的、被承诺的批里挑出某一个文件。精神相同,锚点不同。

想看更完整的逐项对照,参见 存在性证明与 OpenTimestamps 的对比

一句话总结

把许多文件以单个 Merkle 根发布,你就能把区块链成本压到极低。包含证书则让你之后能证明:这些文件中的任意一个,确实在那一批里——一份小小的下载件,你可以在自己的浏览器里、对照任意公开的 Cardano 浏览器核验它,时间由链提供,无需信任 CardanoWall。证明路径已经嵌进文件里,因此在任何具体工具、账户或公司消失很久之后,这份证书仍然有效。

延伸阅读

merkleproof-of-existencelabel-309