IPFS家族(一)

IPFS这个项目其实很大,并不像大家想象的是一个东西,IPFS是由很多模块组成,每一个模块现在都已经独立成项目了,并且有自己的主页。让我们来简单看一下IPFS家族成员。
协议实验室的主页:https://protocol.ai/projects/
在协议实验室的主页上面,可以找到目前的五个个项目:
IPFS:ipfs.io
Filecoin: filecoin.io
libp2p: libp2p.io
IPLD:ipld.io
Multiformats:multiformats.io
(协议实验室的是有多喜欢io的域名
)
其中IPFS和FIlecoin我们已近很熟悉了,也是我们主角(男一号和女一号),今天主要介绍那些背后默默无闻的支持者。
先放一张IPFS的结构图

libp2p
IPFS团队在开发IPFS协议的时候,采用的是高度模块化的方式进行的。就像搭积木一样,将各个功能独立独立起来进行。当然这也是现在软件工程里面的基本要求,不过IPFS团队在此基础上更进一步,各个木块之间几乎完全解耦合。
libp2p是什么?
在过去的相当长时间里,开发者构建一个p2p网络并不是一件容易的事情。复杂的网络环境、各种各样的通信协议和网络设备的存在使得创建大规模的点对点网络变得复杂并且困难。IPFS团队将点对点(peer-to-peer)网络的网络层从IPFS工程里面分离出来,形成一个独立的项目,这就是libp2p。该项目不仅可以供IPFS使用,也可以提供其它项目使用,作为一个p2p工程的底层协议存在。
之前的文章里面曾经提到过IPFS的网络连通性做的非常棒,在各种复杂的网络环境下都能够轻松应对,这与IPFS团队在libp2p上面的精心设计是分不开的。
如果哪个团队或者开发者想构建一个基于p2p网络的项目,不妨参考一下或者直接使用libp2p作为底层协议,会减少很多很多的开发量(发现了什么?如今如火如荼的区块链项目,有了libp2p,可以为大家节省很多工作量,当然,因为fork的存在,现在的项目大多数并不是从0开始的
)。
下面我们来看看libp2p里面都有什么东东?

Transports:传输层,TCP,uTP,QUIC,SCTP......
Discovery:网络发现层,mDNS,bootstrap,DNS,Kad......
Peer Routing: 节点路由,mDNS, KadDHT......
NAT Traversal: NAT穿越层......
Content Routing: 内容寻址......
libp2p的主要功能是
发现节点
连接节点
发现数据
传输数据
它类似我们现实世界的快递公司。它连接着千千万万个节点,除了负责分发数据,还负责查找数据。它是一个大杂烩,综合了各种协议、框架,让它们一起和谐的工作。
当前实现版本:
js
go
IPLD
IPLD定义了基于内容寻址的统一数据结构类型。它是一个转换器,可以把现有的异构的数据结构(基于内容寻址)统一成一种格式,方便不同系统之间的数据交换和互操作。
为什么要构建IPLD?
通过哈希进行内容寻址的技术已经广泛应用于各种分布式系统。从加密货币的区块链到备份代码的每一次提交,再到各种web内容,他们背后的逻辑几乎是相同的, 然后由于数据结构的不兼容,造成了这些数据无法互相操作。IPLD作为中间层统一了这些异构的数据结构,使得不同的数据可以进行数据交换。
IPLD的组成:
CID(Self-describing content-addressed identifiers for distributed systems):基于内容寻址的自我描述标识
IPLD tree:基于 JSON、Protobuf和路径导航的跨协议的数据模型
IPLD Resolvers: IPLD转换器,可以添加新的协议到IPLD里面
当前已实现的IPLD数据结构
Git
Bitcoin
Ethereum
IPFS

未来会有更多的数据结构添加进来,第三方的开发也可以把自己的数据结构提交到IPLD里面。截止到目前,IPLD在github上的关注度并不像是IPFS那么引人注目。不过相信随着IPFS应用推进,IPLD项目也会也来越多的收到关注。至少它几乎可以统一目前区块链项目的绝大部分数据。作为一个中间层可以很方便的进行链之间的数据交换,IPFS团队已经帮大家造好了轮子。
Multiformats
该项目的是一系列协议的集合,它在现有协议基础上对值(值:通常是具有某一项表达意义的)进行自我描述改造,即从值上就可以知道该值是如何产生的。听起来是不是有点难以理解,别着急,下面咱们使用具体的例子来说明这是一个什么东西。
当前multiformats协议里面包含以下协议。
multihash - self-describing hashes
multiaddr - self-describing network addresses
multibase - self-describing base encodings
multicodec - self-describing serialization
multistream - self-describing stream network protocols
multigram (WIP) - self-describing packet network protocols
我们以第一个multihash为例子来说明什么是multiformats。通常情况下我们使用的哈希计算方法都是某一种实现方式,比如sha1,sha2-256等。哈希计算在我们的软件工程里面几乎随处可见,特别是区块链项目。multiformats将所有的哈希值计算统一成同样的格式,这会为系统开发者带来很多好处,比如加密函数升级等。
multihash:
升级后的哈希值的结构为:
<hash-func-type><digest-length><digest-value>
<哈希函数类型><摘要长度><摘要值>
我们有一个使用sha2-256函数生成的哈希值(如下),其长度为32(16进制0x20):
41dd7b6443542e75701aa98a0c235951a28a0d851b11564d20022ab11d2589a8
规定sha2-256的代表数字为12(16进制)
于是我们得出来新的哈希值:
122041dd7b6443542e75701aa98a0c235951a28a0d851b11564d20022ab11d2589a8
新的哈希值具有自我描述性质,它说明了自己是怎么来的。怎么样,是不是一下子变得开朗起来。
小编把python版本的multihash实现撸了一遍,目前multihash总共实现了以下6种哈希函数,建议以后的开发者使用这个升级版的哈希加密算法,好处多多:
sha1
sha2-256
sha2-512
sha3
blake2b
blake2s
其它几个multi协议就不在一一介绍,感兴趣的读者可以到以下页面学习
https://multiformats.io/
https://github.com/multiformats/multiformats
未完待续。。。。。。
作者飞向未来,致力于IPFS/Filecoin在中国的技术推广,他的微信公众号和社群,目前是中国最活跃最顶级的IPFS社群。作者飞向未来是圆方圆区块链的特邀嘉宾,所有转载都已经得到飞向未来本人授权。
更多飞向未来导师的公众号,可以在IPFS指南公众号中找到。
圆方圆链圈

IPFS家族(一)的更多相关文章
- IPFS家族(二)
go-ipfs IPFS协议的go语言实现,ipfs的核心协议,最新版是v0.4.13 下载地址:https://dist.ipfs.io/#go-ipfs 源代码地址:https://github. ...
- Libp2p 简介
这是一个翻译的系列文章,原文参考:Introduction :: libp2p Documentation 欢迎来阅读libp2p相关文档,不论你是刚开始学习如何用libp2p来搭建P2P系统, 还是 ...
- 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训
原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...
- 【6年开源路】FineUI家族今日全部更新(FineUI + FineUI3to4 + FineUI.Design + AppBox)!
刚才询问博客园团队: [6年开源路]三石今日送福利,AppBox4.0源码免费拿!FineUI家族今日全部更新(FineUI + FineUI3to4 + FineUI.Design + AppBox ...
- [Machine Learning & Algorithm]CAML机器学习系列1:深入浅出ML之Regression家族
声明:本博客整理自博友@zhouyong计算广告与机器学习-技术共享平台,尊重原创,欢迎感兴趣的博友查看原文. 符号定义 这里定义<深入浅出ML>系列中涉及到的公式符号,如无特殊说明,符号 ...
- 家族/亲戚(relation)
题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是 ...
- Hadoop家族的各个成员
官方定义:hadoop是一个开发和运行处理大规模数据的软件平台.核心词语是平台,也就是说我们有大量的数据,又有好几个电脑,我们知道应该把处理数据的任务分解到各个电脑上,但是不知道怎样分配任务,怎样回收 ...
- "流"派家族,一脉相承
(更多内容请关注本人微信订阅号:it_pupil) 你没进错,我们讲的是Java的输入输出流. 概述 ➤ 可以从其中读入一个字节序列的对象称作输入流.(输入流是一个对象,可以从这个对象中读取一个字 ...
- Hadoop学习笔记【Hadoop家族成员概述】
Hadoop家族成员概述 一.Hadoop简介 1.1 什么是Hadoop? Hadoop是一个分布式系统基础架构,由Apache基金会所开发,目前Yahoo!是其最重要的贡献者. Hadoop实现了 ...
随机推荐
- 洛谷P3375 - 【模板】KMP字符串匹配
原题链接 Description 模板题啦~ Code //[模板]KMP字符串匹配 #include <cstdio> #include <cstring> int cons ...
- Docker系列三:Docker容器管理
Docker容器管理 1. 单一容器管理 1) 容器的启动 $ docker run --name gitlab-redis -d --volume /srv/docker/gitlab/redis: ...
- linux分析apache日志获取最多访问的前10个IP
apache日志分析可以获得很多有用的信息,现在来试试最基本的,获取最多访问的前10个IP地址及访问次数. 既然是统计,那么awk是必不可少的,好用而高效. 命令如下: awk '{a[$1] += ...
- C#访问修饰符(public,private,protected,internal,sealed,abstract)
为了控件C#中的对象的访问权限,定义对象时可以在前面添加修饰符. 修饰符有五种:private(私有的),protected(受保护的),internal(程序集内部的),public(公开的),以及 ...
- Microsoft+R:Microsoft R Open (MRO)安装和多核运作
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本文转载于公众号大猫的R语言课堂,公众号作者使 ...
- Android常见Crash原因总结(二)
Android平台程序崩溃大家都应该遇到过,force close和ANR应该是大家遇到较多的. 这里把Android平台程序崩溃的各种类型做一个简述和原因列举. 1.ANR(可见ANR): 发生场景 ...
- php出现Can't use function return value in write context
<?php if(session('uid')){ }else{ } ?> 在用empty判断值为空的时候,报了这个Can't use function return value in w ...
- xWorks下的硬盘启动方法
在VxWorks下进行开发调试,在目标机上加载VxWorks映像很重要,在目标机上加载VxWorks映像,最重要的是三个步骤: 第一步,修改config.h文件,在config.h文件里包括硬盘驱动. ...
- org.hibernate.exception.GenericJDBCException: Could not open connection
1.错误描述 org.hibernate.exception.GenericJDBCException: Could not open connection at org.hibernate.exce ...
- HTML5结合CSS的三种方法+结合JS的三种方法
HTML5+CSS: HTML中应用CSS的三种方法 一.内联 内联样式通过style属性直接套进HTML中去. 示例代码 <pstylepstyle="color:red" ...