1. 北竹林首页
  2. 资讯
  3. 技术指南

在分布式网络上 IPFS节点是如何相互验证的 ​

相信很多人的想知道,在分布式网络上,IPFS节点是如何相互验证的?那么,在谈这个问题之前,我们先来简单了解以下几个相关概念:

相信很多人的想知道,在分布式网络上,IPFS节点是如何相互验证的?那么,在谈这个问题之前,我们先来简单了解以下几个相关概念:

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

HTTP:  超文本传输协议(HTTP,HyperTextTransfer Protocol), 所有的WWW文件都必须遵守这个标准。

协议实验室:IPFS及Filecoin官方团队。

Filecoin:是IPFS激励层,一种分布式存储区块链项目,挖矿可获奖励。

FIL:是Filecoin的通证(token)符号,如矿工到多少20个FIL。

PoReps复制证明:证明矿工存储了客户数据。

PoST 时空证明:证明在某个时间点正存储着客户数据。

抵押机制:存储矿工预先将FIL抵押到网络,完成挖矿,删除客户数据抵押的FIL会被没收。

IPFS:星际文件系统,一种底层分布式超媒体协议,取代HTTP。

Sia/Storj/Filecoin/EthereumSwarm:  分布式存储项目巨头。

主网:Filecoin Mainnet,指主网:项目启动,可以开挖正式代币。

ICO:Initial Coin Offering,区块链项目首次发行代币。

BitTorrent: 内容分发协议, 采用高效的软件分发系统和点对点技术共享大体积文件, 使每个用户像网络重新分配结点那样提供上传服务。

Hash: (哈希)把任意长度的输入,通过散列算法变换成固定长度的输出,该输出就是散列值。

DAPP:分布式网络上,参与者的信息被安全保护(也可能是匿名的),通过网络节点进行去中心化操作的应用。

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

分布式Web的一个关键特性是能够通过其内容访问数据,而不是通过其位置-内容与位置寻址,允许用户从拥有所需数据的任何对等机高效地访问数据。但这个想法并没有随着内容而停止,对等机的位置也可以随时间变化(本地漫游),甚至可以在多个设备之间跳跃(运行时自由)。这种高效的传输方法对于传统的基于位置的地址(如IP地址)来说是不可能实现的。

这个位置无差别的网络究竟是如何工作的?当您的IPFS对等节点正在与IPFS网络上的其他对等节点通信时,有一些(很多,但现在我们将忽略其中的大部分)事情正在幕后发生。最重要的一点是,对等节点通过对等节点ID相互识别。这个ID为分布式Web上的每个对等方交互提供了一个唯一的标识,以便对等节点知道自己正与正确的对等节点通信。

那么,这个唯一的IPFS对等ID是从哪里来的呢?又是如何使用的?今天,我们要回答这些问题!我们将通过分离IPFS用来生成它们的加密函数来实现这一点。这是一篇相当技术性的文章。假设您精通Python,如果有任何问题,请不要犹豫,发表评论!

了解你的对等节点

当您初始化一个新的对等机时,IPFS使用一个公钥(或非对称)加密系统来生成一对密钥:一个可以共享的公钥和一个需要保密的私钥。使用这组密钥,IPFS对等节点可以执行身份验证,其中公钥验证具有成对私钥的对等节点是否实际发送了给定的消息,并进行加密,其中只有具有成对私钥的对等节点才能解密使用相应公钥加密的消息。实际上,IPFS使用得到广泛使用的RSA密码系统生成密钥对:

$ ipfs initinitializing IPFS node at ~/.ipfs/generating 2048-bit RSA keypair…donepeer identity: Qm…

有了公钥,现在就可以生成加密ID-您的对等身份。稍后我们将详细介绍这个过程。同时,要知道对等机的ID本质上是其公钥的加密散列。此ID使对等端能够找到彼此,并在连接后进行身份验证。这也意味着默认情况下,对等端之间的连接是加密和身份验证的。

创建加密标识

对于IPFS,加密对等ID只是对等公钥的SHA-256多重哈希。但在我们实际使用公钥之前,我们需要以某种有用的方式对其进行编码。这是通过将一个协议缓冲区(Google的数据交换格式)转换成base64编码的字符串来完成的,该缓冲区包含公钥的序列化表示(以RSA-DER格式)。

如果你和我一样,你宁愿“看到”这个过程,也不愿阅读它,那就让我们用代码来完成整个过程。在本例中,我们将讨论Python,因为大多数所需的库都是现成的,所以相对容易使用。在大多数情况下,您可以通过将命令复制和粘贴到一个简单的Python提示中,而我们要做的是在初始化一个新的IPFS对等时复制第一步。

我们只使用一些Python包来完成这项工作,所以要先把它们全部拿出来,可以与pip一起安装:

$ pip install base64 base58 cryptography pyrobuf

接下来,我们将设置主要的导入,这实际上只是样板代码,以确保我们在前进过程中拥有所有需要的函数和类,您现在可以复制和粘贴,一旦开始使用,可以逐个复制和粘贴每个函数。

import base58, base64from pyrobuf_util import to_varintfrom cryptography.hazmat.primitives.asymmetric.rsa import (   generate_private_key,   RSAPublicKeyWithSerialization,   RSAPrivateKeyWithSerialization)from cryptography.hazmat.primitives.hashes import SHA256, Hashfrom cryptography.hazmat.backends import default_backendfrom cryptography.hazmat.primitives.serialization import (   Encoding,   PublicFormat,   load_der_private_key,   load_der_public_key)

好了,既然所有的障碍都清除了,现在可以开始了。但是首先,我们需要从IPFS项目下载crypto.proto验证文件,然后将其编译成一个允许我们编码和解析协议缓冲区数据的Python类。幸运的是,有名为pyrobuf的python包可以实现整个过程的自动化。

$wgethttps://raw.githubusercontent.com/libp2p/go-libp2p-crypto/master/pb/crypto.proto$ pyrobuf –install crypto.proto

从命令行/终端运行以下命令:Phew,这是相对容易的,我们现在有了一个很好的Python库,可以用我们的Protobuf定义作为Python类导入。现在,我们可以跳回到脚本(或python REPL)并添加其他导入:

from crypto_proto import PrivateKey, PublicKey, RSA

现在来谈谈加密!我们需要生成一个2048字节的新RSA密钥对和一个默认的公共指数:

private_key = generate_private_key(   public_exponent=65537,   key_size=2048,   backend=default_backend())

我们刚刚是在生成一个新的RSA私钥。key_size 描述密钥的长度。较大的密钥提供更高的安全性;当前1024和以下的密钥被认为是可断开的,而2048或4096是新密钥的合理默认密钥大小。现在,IPFS默认为2048。public_exponent默认值应设置为65537。

让我们继续获取公钥,我们将使用它来形成对等节点的ID:

public_key = private_key.public_key()

现在,在我们将密钥编码为protobuf之前,我们需要将其导出到一个DER编码的ASN.1 subjectPublicKeyInfo结构:

b = public_key.public_bytes(encoding=Encoding.DER,format=PublicFormat.SubjectPublicKeyInfo)

很好,现在我们将使用pyrobuf库为我们创建的类将公钥字节编码为protobuf:

proto = PublicKey()proto.Type = RSAproto.Data = bpublic_buf = proto.SerializeToString()

或者,您可以跳过上述大部分步骤,直接从现有的IPFS对等端复制protobuf编码的公钥。假设已安装IPFS并且保护进程正在运行,则可以在终端中输入以下内容并复制Public Key:

ipfs id –format=”Peer Id: <id>nPublic Key: <pubkey>”

回到您的脚本中,而不是前面的步骤(即生成新的密钥对等),您将执行如下操作:

public_buf = base64.b64decode(b”…”)

不管怎样,我们现在都要计算protobuf编码的公钥的SHA256哈希来计算

digest:

h = Hash(SHA256(), backend=default_backend())h.update(public_buf)digest = h.finalize()

然后,我们将计算digest的多重哈希。SHA2–256是当前的IPFS默认值,其代码在此表中定义。如果你对多重散列和这些神奇的散列函数代码的来源很好奇的话,我强烈建议你读一下多重格式和多重散列。

hash_function = 0x12length = len(digest)multihash = to_varint(hash_function) + to_varint(length) + digest

最后,我们的多重哈希 base58编码和输出。

print(base58.b58encode(bytes(multihash)).decode())

为您提供以Qm开始并包含对等方的公钥标识的内容。如果您导入了现有对等的公共对象,您可能需要检查它们是否匹配(它们应该匹配)。

好啦,这就是整个过程了。现在您已经非常清楚了IPFS是如何创建独特的加密身份来通过分布式Web进行通信。希望以上内容可以在您使用IPFS时有所帮助。(文章部分内容来源于网络,如有侵权请联系我们删除。)

注:本文不作为投资理财建议,投资有风险,入市需谨慎。

来源:全球币码翁区块链研究院

本期编辑:Alice

声明:登载此文出于传递更多信息之目的,观点仅代表作者本人,绝不代表北竹林赞同其观点或证实其描述。

提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。

联系我们

QQ:

1739447883

邮箱:

1739447883@qq.com