BSN IPFS(星际文件系统)专网简介功能架构及特性接入说明

Posted BSN研习社

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BSN IPFS(星际文件系统)专网简介功能架构及特性接入说明相关的知识,希望对你有一定的参考价值。

当今,随着信息技术、互联网的日益发达,人类的交流与协作方式已发生了颠覆性的变革。无论是数字,还是文字、图片、音乐、视频,都能从网上获得,点点手指就能掌握这一切。信息技术、互联网极大便捷了我们的生产、生活。

一方面,我们在享受互联网红利。另一方面,经历数十年的发展,曾经我们引以为傲的互联网技术也暴露出诸多弊端。当我们打开网页时,经常遇到卡顿、数据被篡改,甚至文件被删除情况,更不用说数据泄露的问题。此外还有成本高昂,服务不稳定等。在越发重视数据价值的今天,这个问题显得格外严重。

是否有一种技术,既能低成本、高效率的存储我们的数据,又安全稳定、永不丢失,当然隐私保护更是必不可少。

答案是肯定的,这就是IPFS(星际文件系统)技术。与传统中心化存储技术相比,基于去中心化的IPFS技术具有低成本、高效率、安全性、隐私性、永久性等多个优势。

当下,区块链作为一种颠覆性的融合创新技术,在各行各业都具有巨大的应用潜力。但是迫于高昂的存储成本、TPS限制,全数据上链显然不具现实性和价格优势。大的文件哈希上链,原文件用IPFS存储,IPFS技术可以说是区块链的完美互补。

2021年1月,BSN IPFS服务专网商用发布,其是BSN基于 IPFS分布式文件服务搭建的专网,面向应用开发提供IPFS常用的原生服务接口的服务网关。其具有高效、合规、价格优势明显等诸多优势。

那么,IPFS具体是什么?IPFS的功能如何?它的架构及特性怎样?Filecoin是怎么一回事?如何接入BSN中IPFS专网服务?

1.什么是IPFS

了解IPFS,要先了解HTTP。HTTP(超文本传输协议HyperText Transfer Protocol,Http)用于在Internet上发送和接收消息。它是以超文本传输为目的而设计、基于TCP/IP实现的应用层协议。

此协议传送的数据形式可以是普通正文、超文本、音频、视频等等。用户使用http://或https://链接指向网页、图像、电子表格、数据集或者推文时,用户按其位置识别内容,这是位置寻址。该链接是指向web上特定位置的标识符,其对应于web上某处的特定服务器或服务器组,控制该位置的人控制内容。

对应于位置寻址,IPFS(InterPlanetary File System,星际文件系统)是一个基于内容寻址、分布式、新型超媒体传输协议。其原理用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,它旨在使网络更快、更安全、更开放。

2.IPFS的功能

为什么需要IPFS?

众所周知, 互联网是建立在HTTP协议上的。但随着互联网的进步,HTTP逐渐显示出其不足。

HTTP非常中心化,用户依赖少数服务供应商,效率低成本高;W e b文件经常被删除;中心化服务商极易受到攻击,为了服务器的正常运转,需要采用各类昂贵的安防方案,防范成本越来越高。这三点已成为HTTP无法克服的问题。

对比HTTP,IPFS天然就是分布式、点对点架构,不再依赖主干网和中心化服务器。IPFS将文件分割成很多小块,存储于诸多节点。当下载时,很多节点可以同时提供下载服务,速度更快。

第二,IPFS优化了存储空间,数据可持续保存。IPFS采用为数据内容建立哈希去重的方式存储数据。在IPFS里,相同的数据会在IPFS网络中过滤,这降低了储存空间的成本。IPFS提供了互联网数据可持续存储的方式,并且提供了数据历史版本追溯的功能。

第三,基于去中心化的IPFS更安全,天生抵御DDOS(分布式拒绝服务攻击)。

区块链和IPFS的关系?

区块链的本身功能之一是在没有中心化的前提下参与方达共识,参与方共同维护一套账本。它的本身效率并不高。如果IPFS和区块链协同工作,可以弥补区块链的两大缺陷。

第一个缺陷是区块链存储效率低、成本高。和HTTP类似,IPFS是基于TCP/IP的应用层协议。遇到大文件上链,可使用I P F S存储文件数据本身,并将唯一永久可用的I P F S 地址放置到区块链中。

第二个缺陷是传统上区块链跨链需要各个链之间协同配合,难以协调。I P F S通过I P L D定义不同的分布式数据结构,可协助各个链之间传递信息和文件。

3.IPFS架构及特性

IPFS架构

IPFS包含七层架构,每层具有不同的功能。

IPFS特性—分布式哈希表(DHT)

哈希表是一种数据结构,它把KEY 和 VALUE用某种方式对应起来。使用hash()函数把一个KEY值映射到一个index上,即hash(KEY) = index。这样就可以把一个KEY值同某个index对应起来。然后把与这个KEY值对应的VALUE存储到index所标记的存储空间中。这样,每次想要查找KEY所对应的VALUE值时,只需要做一次 hash()运算就可以找到了。

举个例子:图书馆中的书会被某人借走,这样“书名”和“人名”之间就形成了KEY与VALUE的关系。

IPFS特性—块交换协议(BitTorrent)

仅仅实现数据的分布式存储还远远不够,数据还需要在节点之间有效的交换,从而使得整个系统能够高效运转。IPFS协议受BitTorrent的启发,通过对等节点间交换数据块来分发数据。

如何激励节点分享数据?IPFS在BitTorrent的基础上进行了创新,增加了包括信用、策略、帐单在内的体系,这一体系之上的新的数据交换协议被称做BitSwap。

在BitSwap协议下,发送数据给其他节点可以增加节点信用值,而从其他节点接受数据则会降低节点信用值。也就是说,如果一个节点持续分享数据,其他节点给它发送数据的概率就会越来越大;而如果一个节点只接收数据而不分享数据,其他节点给它发送数据的概率就会越来越低,直到低到被其他节点忽略。

IPFS特性—自验证文件系统SFS

自验证文件系统(Self-Certifying File System,SFS)是为了设计一整套互联网共用的文件系统,全球的SFS系统都在同一个命名空间下。在SFS中,分享文件会变得十分简单,只需要提供文件名就行了。要实现一个全球共享的文件系统,最大的一个障碍莫过于如何让服务端为客户端提供认证。一个最简单的思路,所有服务器都生成一对公钥和私钥,然后让每个客户端用公开的公钥来验证服务器的安全,但是如何让所有客户端都能获得服务器的公钥呢?SFS使用一种新的解决思路,将公钥信息嵌入到文件名中,这种命名为“自验证文件名”。这样就没必要在文件系统内部实现密钥管理了。秘钥管理的功能就加入到用户对文件命名的规则中。用户可以根据自己需要选择加密方式。

IPFS的方案如下:

NodeID = hash(node.PubKey)

给每个用户分配一个可变的命名空间,在此路径下: /ipns/

一个用户可以在此路径下发布一个用自己私钥签名的对象,比如:

/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/

其他用户获取对象时,他们可检测签名是否与公钥和NodeID匹配,验证用户发布对象的真实性,达到了可变状态的获取。

IPFS特性-MerkleDAG

Merkle DAG的特点:1、内容寻址 2、防篡改 3、去重。

4.Filecoin:基于IPFS技术的公有链(IPFS公网)项目

IPFS和Filecoin都是由协议实验室打造的项目,IPFS与Filecoin之间的关系有点类似于区块链与比特币的关系。Filecoin的诞生是为了通过经济激励的机制来促进IPFS的发展。Filecoin采用了公有链通证体系发行了Token,Token简称FIL,发行总量20亿。

虚拟货币只是基于区块链技术的一种应用,并不能代表区块链。正像采用区块链技术不需购买比特币,我们使用IPFS技术也不需购买FIL,更不用说合规问题。

5.BSN中IPFS专网概述及对接说明

2021年1月,BSN IPFS服务专网商用发布,其是BSN基于 IPFS分布式文件服务搭建的专网,面向应用开发提供IPFS常用的原生服务接口的服务网关。与IPFS公网相比,其具有高效、合规、价格优势明显等诸多优势。

两种开通方式

有两种方式可以开通IPFS服务:在发布服务时开通;在【IPFS服务】界面单独开通。服务开通后,系统会自动生成上传key和下载key。

方式一:在BSN门户(bsnbase.com)发布服务时开通。

方式二:在【IPFS服务】界面单独开通。

打开BSN官网主页(bsnbase.com),登录并点击【IPFS服务】。

选择【创建IPFS服务】进入服务创建页面。

选择容量,点击【下一步】,选择按月付费或按年付费

· 勾选【我已阅读并同意《BSN服务发布协议》】,点击【确定】后,系统生成账单,并提示用户支付服务费用,用户确定以后,系统从用户的账户中进行扣款,扣款成功后服务实时开通。若服务扣款失败,服务对应的账单将保留72小时,过期失效。若仍想使用服务,需重新开通服务并支付;

· 如果用户账户内没有余额或余额不足,需要先进行充值。然后到【我的账单】进行支付;

· 服务的费用主要是容量费用,流量使用费根据服务的实际使用量按周扣款,服务开通时无须支付,按年支付时具有一定的折扣优惠;

· 服务开通后,系统会返回上传Key、下载Key及网关地址信息。上传key和下载key可根据用户需要进行更新。

注意:如果用户只需要下载文件,则可不开通IPFS服务,只点击【创建下载key】生成下载key即可。

关于BSN IPFS专网服务的任何问题,您可以点击主页的帮助手册。

从帮助手册第八章的“IPFS专网服务” 中得到详尽的指导。

----------

关于BSN IPFS 服务专网,BSN已举办过一场专门培训,您可以随时点击链接观看学习。

【线上】IPFS浅谈及基于BSN的IPFS专网操作演示

地址:

http://kb.bsnbase.com/webdoc/view/Pub2c908ad371c6396b0176979c260e2ae0.html

IPFS星际文件系统

IPFS星际文件系统(InterPlanetary File System)是去中心化文件系统,本文介绍IPFS节点软件系统安装,环境搭建等简介入门教程,及学习如何使用ipfs-api和Node.js访问IPFS网络。

一、ipfs节点安装与使用

1.1下载节点软件

到官网下载windows版的ipfs节点软件:32位64位
如果你不能访问官网,可以使用百度云盘镜像:32位64位

1.2解压节点软件

下载后解压到指定目录,例如d:\\go-ipfs,开一个控制台窗口,测试:

D:\\go-ipfs > ipfs version
Ipfs version 0.4.14

可以将该目录加入环境变量PATH,
path env

或者将d:\\go-ipfs\\ipfs.exe拷贝到windows系统目录,以便在任何目录中可以启动ipfs.exe。

1.3 初始化本地仓库

和git类似,ipfs节点也需要先初始化一个本地仓库。执行init子命令来初始化本地仓库:

D:\\go-ipfs> ipfs init
Initializing IPFS node at C:\\Users\\hubwiz\\.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmQaTgU1TLNHPBEvLGgWK1G9FgVByyUZNVhDs789uWPtku
to get started, enter:

     ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

默认情况下,ipfs将在当前用户主目录(例如:对于hubwiz用户,其主目录就是C:\\Users\\hubwiz)下建立.ipfs子目录,作为本地仓库的根目录。

如果你的C盘空间不够大,或者你就是希望使用其他目录作为本地仓库根目录,可以设置IPFS_PATH环境变量,使其指向目标路径,例如D:\\my_ipfs_root
ipfs-path

1.4重新初始化

如果你期望重新初始化节点,会提醒你不能这么做,否则会改写你的密钥:

D:\\go-ipfs> ipfs init
Initializing IPFS node at C:\\Users\\hubwiz\\.ipfs
Error: ipfs configuration file already exists!
Reinitializing would overwrite your keys.

这挡不住我们。如果你必须重新初始化的话,先删除原来的仓库根目录即可:

D:\\go-ipfs> del C:\\users\\hubwiz\\.ipfs

1.5将文件添加到本地仓库

使用add子命令将指定的文件添加到本地仓库,例如将当前目录的README.md文件添加到本地仓库:

D:\\go-ipfs> ipfs add README.md
465 B / ? [-------------------------------------------------------=--] 
added QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8 README.md

ipfs会根据文件的内容生成一个哈希值,例如:

QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8

你需要记录下这个编码,因为需要使用它来访问本地仓库(或ipfs网络)中的文件。
注意:ipfs并不会无节制地将你本地仓库中的文件分布到其他ipfs节点中,如果没有其他的ipfs节点搜索你的文件(的哈希值),那么你本地仓库中的文件将始终只存在于本地。

1.6访问ipfs文件

Ipfs网络中只能通过内容的哈希值来访问文件,例如对于上面的README.md文件,我们使用cat子命令通过其哈希值来查看其内容:

D:\\go-ipfs> ipfs cat QmXBpD37vBm5537pqHwyJRGSaX7hMrkHyp866wqEVU2BE8

控制台将输出内容:

\\# ipfs commandline tool

This is the [ipfs](http://ipfs.io) commandline tool. It contains a full ipfs node.
......

1.7 将节点接入网络

执行daemon子命令将节点接入ipfs网络:

D:\\go-ipfs> ipfs daemon
Initializing daemon...
......
Daemon is ready

只有当启动监听后,节点才能够接受ipfs网络中的内容检索请求,参与内容的交换与分布。

可以按Ctrl+C退出监听状态。
?

二、ipfs-api安装与使用

Ipfs节点提供和REST API接口,可供我们在程序代码中操作节点进行文件的上传等操作。不过大多数情况下,我们并不需要直接操作这个REST开发接口,而是使用经过封装的更友好的ipfs-api,一个nodejs包。

2.1安装nodejs

到官网下载nodejs安装包:32位64位。下载后双击进行安装即可。

开一个控制台窗口,测试:

C:\\Users\\hubwiz> node -v
V8.11.1

2.2安装ipfs-api

Ipfs-api的安装需要git命令行,因此我们先安装git。从官网下载git安装包:32位64位。下载后双击安装即可。

执行git命令测试:

D:\\test-ipfs-api> git version
git version 2.16.2.windows.1

ipfs-api需要编译原生node模块,因此需要安装VisualStudio 2015和python27。

官网下载VisualStudio 2015社区版,双击安装即可。
官网下载Python27安装包,双击安装并设置PATH环境变量使python可用。

重新开一个控制台,使环境变量生效。现在安装ipfs-api:

D:\\test-ipfs-api> npm install ipfs-api
+ ipfs-api@20.0.1
added 1 package, updated 1 package and moved 1 package in 22.138s

2.3测试代码 – nodejs

在D:\\test-ipfs-api目录下创建一个测试脚本test.js:

const ipfsAPI = require(\'ipfs-api\')
const ipfs = ipfsAPI(\'localhost\', \'5001\', {protocol: \'http\'})
const buffer = Buffer.from(\'this is a demo\')
ipfs.add(buffer)
    .then( rsp => console.log(rsp[0].hash))
.catch(err => console.error(err))

执行这个脚本:

D:\\test-ipfs-api> node test.js
QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i

也就是说,我们将内容this is a demo添加到本地仓库后,得到哈希值
QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i。现在可以使用cat子命令来查看这个哈希值对应的内容:

D:\\test-ipfs-api> ipfs cat QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i                                                      

控制台会输出我们之前上传的内容:

this is a demo

ipfs进入监听状态后,提供了一个http网关,让我们可以使用浏览器来访问ipfs上的内容。网关默认在本机(127.0.0.1)的8080端口监听,因此使用你的浏览器访问这个URL:

http://127.0.0.1:8080/ipfs/QmfQS4vm9YZTAyGZEkDqm81xripwsK3NgqfNkbCdoeEw5i

同样可以看到我们之前上传的内容。
注意:需要首先启动监听器(ipfs daemon)并且你的浏览器和ipfs节点在同一台计算机。
?

三、在浏览器中访问ipfs

ipfs-api也支持在browser使用。最简单的方法是使用专门针对浏览器的封装库,在html中引用即可:

<script src="https://unpkg.com/ipfs-api/dist/index.js"></script>

这个特别封装的库会创建一个全局对象ipfsAPI,我们在浏览器脚本中可以直接使用,例如:

var ipfs = window.IpfsApi(\'localhost\', \'5001\')

这种方法比较简单,因此下文不再描述。接下来我们将使用更加工程化的方法,
采用webpack来直接在前端脚本中使用ipfs-api的nodejs包。

3.1 HTML页面

在D:\\test-ipfs-api目录下创建index.html:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <textarea id="content">THIS IS ANOTHER DEMO</textarea>
  <button id="upload">Upload</button>
  <script src="./bundle.js"></script>
</body>
</html>

我们的目标是,当点击按钮时,我们将文本框的内容上传到ipfs

3.2前端脚本

在D:\\test-ipfs-api目录下编写脚本app.js:

import ipfsAPI from \'ipfs-api\'
const ipfs = ipfsAPI(\'localhost\', \'5001\', {protocol: \'http\'})

window.addEventListener(\'load\', function() {
  let btn = document.querySelector(\'#upload\')
let txt = document.querySelector(\'#content\')
btn.addEventListener(\'click\',()=>{
    let buffer = Buffer.from(txt.value, \'utf-8\');
    ipfs.add(buffer)
      .then( rsp => console.log(rsp[0].hash))
.catch(err => console.error(err))
})  
})

3.3 webpack配置

在D:\\test-ipfs-api目录下编写配置文件webpack.config.js:

const webpack = require(\'webpack\');
const path = require(\'path\');
const CopyWebpackPlugin = require(\'copy-webpack-plugin\');

module.exports = {
  entry: \'./app.js\',
  output: {
    path: path.resolve(__dirname),
    filename: \'bundle.js\'
  },
  module: {
    loaders: [
      {
        test: /\\.js$/,
        exclude: /(node_modules|bower_components)/,
        loader: \'babel-loader\',
        query: {
          presets: [\'es2015\'],
          plugins: [\'transform-runtime\']
        }
      }
    ]
  }
}

3.4前端脚本打包

执行webpack打包:

D:\\test-ipfs-api> webpack

3.5 配置ipfs的CORS策略

由于需要从网页中访问ipfs节点,这就引入了跨域安全问题,因此我们需要配置ipfs节点使其允许跨域请求:

D:\\>ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin \'["*"]\'

3.6 配置ipfs的API监听地址

由于ipfs节点默认在本机(127.0.0.1)的5001端口监听API请求,因此如果你的浏览器和ipfs节点不在同一台机器上,需要让ipfs节点监听公开地址:

D:\\> ipfs config --json Addresses.API \'"/ip4/0.0.0.0/tcp/5001"\'

当然,如果你的浏览器和ipfs节点在同一台机器上,就不需要进行这个配置了。

3.7配置ipfs的网关的监听地址

由于ipfs节点旳http网关默认在本机(127.0.0.1)的8080端口监听http请求,因此如果你的浏览器和ipfs节点不在同一台机器上,就需要让ipfs网关监听公开地址:

D:\\> ipfs config --json Addresses.Gateway \'"/ip4/0.0.0.0/tcp/8080"\'

3.8测试网页

首先启动ipfs监听:

D:\\>ipfs daemon

然后在测试目录下启动web服务器,这里使用python内置的简单服务器,当然你可以使用任何熟悉的web服务器:

D:\\test-ipfs-api> python –m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

现在打开你的浏览器,访问http://127.0.0.1:8000/,一切顺利的话,你可以看到一个文本框和一个按钮,点击按钮,即可将文本框的内容上传到ipfs节点。

安利两个以太坊相关的实战教程:

区块链初学者   : 以太坊 DApp 实战开发入门
区块链开发进阶:去中心化以太坊 DApp 电商平台实战开发

以上是关于BSN IPFS(星际文件系统)专网简介功能架构及特性接入说明的主要内容,如果未能解决你的问题,请参考以下文章

使用 Docker 安装 IPFS 星际文件系统

以太坊开发DApp实战教程——用区块链星际文件系统(IPFS)Node.js和MongoDB来构建电商平台

星际文件系统优点和原理

星际文件系统优点和原理

冲向星际的下一代互联网协议IPFS

星际方舟~分布式存储领头羊