IPFS和梅克尔森林

什么是IPFS?

IPFS是InterPlanetary File System的缩写。它是一种点对点的可以使Web更快,更安全,更开放的分布式文件系统。我们需要用IPFS把当前版本的Web切换成分布式版本Web。实际上,IPFS的目标是取代HTTP。

为什么要取代HTTP呢?

1、疯狂的带宽成本:

当前使用 HTTP的Web基于一个单一的客户端——服务器模型,它下载任何类型的文件都必须通过中央服务器。想象一下,如果你能从你附近的节点获得相同文件,那么你就可以使用更少的带宽更快地下载文件。在视频传输方面,P2P方法可以节省60%的带宽成本。

IPFS使得高效地分发大量数据变得可能,零重复意味着节省存储空间。

2、404出现得过于频繁:

网页的平均寿命为100天。在那(100天)之后,人们查看网页就可以期待看到404出现了。现在的网络是如此脆弱,链接总是过期和无效,这就好比把书本给焚烧掉一般(不能保存信息)。

IPFS提供历史版本保留(如git),可以轻松地为数据镜像设置可恢复网络。

3、中心化的基础设施:

我们的所有数据都存储在主服务器上。如果服务器崩溃了,我们就完了。如果Twitter崩溃了,我们就不能发推文了。如果Facebook崩溃了,好吧,它足够崩溃了哈哈。

IPFS仍然忠实于网络的最初愿景:开放式和扁平化,并提供了使该愿景成为现实的技术。

4、离线是新的在线:

在发展中国家,在自然灾害期间,面对临时性的不良网络,我们该怎么办?只是干坐着等吗?我们使用的网络是20世纪的,我们可以做得更好。

IPFS支持创建具有多种适应性网络,无论是否具有Internet骨干网连接,都可实现网络的持久可用性。

IPFS如何运作?

因此,如果您想要检索数据结构或使用IPFS将文件保存在Web上,你將不需要访问中央服务器。您请求网络中的节点为您提供该文件的路径。您的节点会给您一些称为该文件的“加密哈希”的内容。它是该文件的唯一指纹。

假设你想得到/foo/bar/baz.png这个文件,它的加密哈希是WmXGTaGWTx1uUtfSb2sBAvArMEVLK4rQEc4g5bv7wwdz1U。(这可以使用SHA1,SHA2或任何其他算法生成)。你点击这个链接连入网络。
在这里插入图片描述
  维基百科已经开始使用IPFS:
在这里插入图片描述

URL的格式为:

https//ipfs.io/ipfs/QmT5NvUtoM5nWFfrQdVrFtvGfKFmG7AHE8P34isapyhCxX/wiki/Anasayfa.html

关于Merkle Trees的一小节

关于Merkle链接的研究论文可以在这里找到。Ralph Merkle是Merkle数据结构背后的大脑。

这里能够找到关于什么是Merkle树的说明。

Merkle Tree在C ++中的基本实现。

#include

#include

#include

#include

using namespace std;

// Hashing functions.

int multiplyThem(int a, int b) {

return a*b;

}

int addThem(int a, int b) {

return a+b;

}

class Merkle {

private:

vector values;

int (*hasher)(int, int);

public:

Merkle(int (*f)(int,int)) {

this->hasher = f;

}

int size() {

return values.size();

}

void add(int value) {

values.push_back(value);

}

int root() {

vector current;

current = getHashedParents(this->values);

while (current.size() != 1) {

current = getHashedParents(current);

}

return current[0];

}

private:

vector getHashedParents(const vector &children) {

vector result;

for (int i=0; i < children.size(); ) {

int a = children[i], b = children[i];

if (++i < children.size()) {

b = children[i++];

}

int hash = this->hasher(a,b);

printf("hash(%d, %d)=>%d ", a, b, hash);

result.push_back(hash);

}

printf("\n");

return result;

}

};

int main(int argc, char** argv) {

Merkle merkle(multiplyThem);

merkle.add(1);

merkle.add(2);

merkle.add(3);

merkle.add(4);

merkle.add(5);

printf(“Merkle Root = %d\n\n”, merkle.root());、

merkle = Merkle(addThem);

merkle.add(1);

merkle.add(2);

merkle.add(3);

merkle.add(4);

merkle.add(5);

printf(“Merkle Root = %d\n\n”, merkle.root());

return 0;

}

IPFS的核心是IPLD

IPLD是Inter Planetary Linked Data的缩写。文件/数据结构使用Merkle链接相互链接。
在这里插入图片描述
  (Merkle DAG是什么?它是一个Merkle有向无环图。它类似于Merkle树。但是,Merkle DAG不需要平衡,它的非叶节点可以包含数据。)

在IPFS中,两个节点之间的链接采用加密哈希的形式。这是由于Merkle DAG数据结构。Merkle DAG为IPFS提供了许多有用的属性,包括:

1. 内容寻址:所有内容都使用加密哈希作为唯一标识,包括链接也是一样。

2. 防篡改:所有内容均通过校验结果进行验证。如果数据被篡改或损坏,IPFS会检测到它,因为哈希值会发生变化。

3. 无重复:所有保存完全相同内容的对象都相等(即它们的哈希值相等),并且只存储一次。

只要将Merkle root发送给某人,您就可以将大量数据移交给该人。因为,Merkle root基本上保留了它之下的所有块的签名。

系统的互用性也可以存在于梅克尔森林中,其中每棵树代表一棵单独的Merkle树。在森林中,一棵树可以是比特币,可以是以太币,可以是常规的SQL数据库。因此,这些基于加密哈希函数的内容在这些树之间交换信息时是高效的。其只发送哈希,而不是发送整个文件。想象一下,使用以太坊进行某些交易,并在交易中添加一个Git页面。

目前这种系统用于:

Bitcoin

Ethereum

Git

Bit Torrent

还有更多,但最重要的是:

立即开始使用IPFS!

入门| IPFS文档

如果你还没有安装,请安装IPFS。在本教程期间安装IPFS,如果您有任何疑问,请随时访问…ipfs.io

再重申一次,它将成为一项突破性技术,将Web从Web2.0推向Web3.0。
  在这里插入图片描述