什么是IPFS的内容标识符?

  • 原创:PASCAL PRECHT

    如果您已经使用过IPFS,或者说观看过有关于IPFS的讲座和教程。那么您就会明白,IPFS会生成被添加到网络中数据的哈希值。虽然原因显而易见(IPFS使用这些散列来标识网络中的内容),但是这些哈希是如何组合在一起就没那么明显了。

    当然,可能有一些哈希算法应用于数据,然而事实证明IPFS远远超出了这个范围,因为它使用Multiformat协议的组合来创建它的内容标识符,并且保持它们不被破坏,我认为这是非常聪明的,我们将很快了解到。

    Multiformat协议之一是多哈希。如果您之前没有听说过,建议您可以看一下“面向未来的加密哈希”这篇文章,其中讨论了协议是什么以及它存在的原因。这篇文章建立在它之上。

    CID的解析

    让我们首先从IPFS获取内容为“Hello World”的哈希开始,将其通过ipfs管道进行添加(您也可以首先创建具有内容的文件,并调用其上的ipfs添加,但我更喜欢保存此步骤):

    $ echo "Hello World" | ipfs add -n
    $ added QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u

    在没有实际将数据写入磁盘的的情况下,-n选项是从IPFS获得散列的一个很酷的技巧。☝🏼还要注意到IPFS输出两次哈希值,这是因为它输出内容的哈希和它所驻留的文件的路径。如果没有路径,就像我们列举的例子一样,它也使用哈希作为路径。

    好了,QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u就是它。只要内容保持不变,“Hello World”的内容标识符或简称CID将始终相同。虽然这不是特别的,但让我们看看如果我们用不同的内容做同样的事情会发生什么。例如,“你好其他世界”将输出QmcaHpwn3bs9DaeLsrk9ZvVxVcKTPXVWiU1XdrGNW9hpi3。去吧,自己试试看!🙂

    注意到什么吗?是的,两个哈希都是从Qm开始的。这是一个需要注意的重要特性 - IPFS生成的所有哈希都是以Qm开始的。特别说明:一旦IPFS移动到CIDv1b32,情况就会改变,这在撰写本文时情况并非如此,但是稍后将详细介绍。

    那么Qm前缀到底是什么?首先我们需要知道的是,有多种版本的CID。例如CIDv0和CIDv1。稍后我们将讨论一下确切的差异,但是每当我们看到,由IPFS生成的以Qm开始的哈希时,就知道我们正在处理CIDv0哈希。这是因为CIDv0是Base58中编码的多哈希。

    嗯...那么为什么我们知道这是一个CIDv0?现在知道多哈希是什么,并且是有用的!

    由于我们知道它是Multihash(多哈希),我们也知道CID的前两个字节分别表示用于哈希原始数据的哈希算法类型,以及数据哈希的长度,而CID的其余部分表示数据的实际哈希值。

    <hash-type> - <hash-length> - <hash-digest>

    我们可以通过将“Hello World”哈希从Base58转换为Base16(或十六进制),并将第一个字节与Multihash(多哈希)表进行比较,来验证这一点:

    122074410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca

    或者,让他更清晰

    12 - 20 - 74410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca
    <hash-type> - <hash-length> - <hash-digest>

    第一个字节0x12表示哈希表中的sha2-256,这意味着哈希摘要是一个SHA-256哈希!但事实证明并非如此。如果我们尝试验证这一点,并使用SHA2-256函数来获取“Hello World”的哈希值,我们会注意到它实际上没有真正加起来......

    $ echo Hello World | shasum -a 256
    $ d2a84f4b8b650937ec8f73cd8be2c74add5a911ba64df27458ed8229da804a26

    我们得到

    d2a84f4b8b650937ec8f73cd8be2c74add5a911ba64df27458ed8229da804a26

    而不是

    74410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca

    ......所以那里发生了什么?

    经过一些研究后,我了解到IPFS所做的工作比仅仅是对数据进行哈希处理,并创建一个多哈要多一些。IPFS项目的团队负责人兼研究员David Dias在StackOverflow(堆栈)问题中非常清楚地说明了这一点:

    • IPFS将给定文件分为256个KiB块 - 由于我们处理的数据非常少,因此我们现在的情况并非如此。

    • 每个块在所谓的“Unixfs protobuf”中进入的所谓“DAG”(有向无环图)节点。更多关于这一点。

    • 创建了另一个dag,链接到所有的块。

    ......它做了什么?

    是的,这也是我的反应。还有很多需要被揭开神秘面纱的地方。我将在以后的文章中详细介绍dags和协议缓冲区的更多细节,但为了使它现在保持非常简单,IPFS基本上序列化了一些元数据(它是一个文件吗?它是一个目录吗?字节的大小是多少?)以及我们的原始数据。然后用更多元数据来序列化它(我们的数据链接到哪些其他数据?),最终使用sha2-256(刚好是在写这篇文章的时候默认的哈希算法)的多哈希,并将其放入我们在屏幕上看到的结果CID中。这里提到的API可以用来玩这些东西。

    因此,为了获得驻留在CID中的哈希摘要,我们必须通过sha2-256来获得序列化的数据和管道。IPFS的blockAPI让我们可以做到这一点。首先让我们检查一下序列化数据:

    $ ipfs block get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u | sed -n l
    $ $
    $ \022\b\002\022\fHello World$
    $ \030\f$

    这已经告诉我们,不仅仅是“Hello World \ n”数据。现在,让我们通过管道sha2-256来看看会发生什么:

    $ ipfs block get QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u | shasum -a 256
    $ 74410577111096cd817a3faed78630f2245636beded412d3b212a2e09ba593ca

    它就是!在这一点上,我想对艾伦和史提芬大声喊出来,他们帮我算出了最后一点。

    另外,如果这有点难以理解,没有问题。不需要知道幕后使用该工具的情况。只要关注未来将发布的文章,将仔细研究这些内容🙃。

    好了,现在我们已经对这些Qm*哈希的来源有了更好的了解,让我们快速谈谈CIDv0与CIDv1的区别。

    v1的差异

    内容标识符版本1以非常紧凑的格式编码比其前一代更多的信息。当CIDv0对哈希类型、哈希长度和哈希摘要进行编码时,CIDv1可以表示为:

    <mb><version><mc><mh>

    哪里

    • mb是一个Multibase代码 - 非常类似于multihashes(多哈希),有多个基本代码将基本编码类型(base16,base32,base58等)和基本编码数据本身编码为单个字符串。

    • version 是正在使用的CID版本 - 这使得CID可以升级。

    • mc是Multicodec类型-类似multihashes和multibases,只适用于编解码器类型

    • mh是一个多哈希 - 基本上是我们在CIDv0中得到的。

    事实证明,这些都是非常强大的属性。例如,由于基本编码类型是CID的一部分,因此可以轻松地将CID转换为创建更短哈希的基本编码。

    如果想知道您正在处理的基本编码,可以查看规范提供的多基表(链接文本)。你能猜出以下哈希使用的编码吗?🙂

    MTXVsdGliYXNlIGlzIGF3ZXNvbWUhIFxvLw==

    转移到Base32

    在撰写本文时,正在努力将CID迁移到CIDv1,并使用默认的base32编码(CIDv1b32),同时仍然向后兼容CIDv0。根据链接的问题,这是由于子域的安全考虑,实验协议处理程序API和支持旧URI。

    这可能会引发更多问题,但是现在我们停在这里,让一切都沉入我们刚刚学到的东西中。以下是一些最重要的链接:

    【FileCoinAsia公众号文章】

    • Cloudflare的IPFS网关,轻松构建基于IPFS应用 链接文本

    • IPFS-Filecion 最新进度,主网上线时间 链接文本

    (识别二维码进入IPFS-Filecoin社群)
    0_1537523195702_90d188d2-4ffd-4c69-be19-1d0a792c8378-image.png

登录后回复
 

加微信进群交流

与 Filecoin中国社区 的连接断开,我们正在尝试重连,请耐心等待