使用 Solid 私有化存储 IPFS 文件哈希值

背景

星际文件系统 IPFS(InterPlanetary File System)是一个面向全球的、点对点的分布式文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。原理用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。

社交互联数据 Solid (Social Linked Data) 由万维网发明者 Tim Berners-Lee 发起,该项目旨在从根本上改变 Web 应用程序的中心化趋势, 它将真正地让数据所有权属于用户,并改善隐私问题。它是一组约定和工具,主要用于构建基于关联数据的分布式社交应用。

简单来说,IPFS 是一个任何人都可以访问的点对点存储平台(可以存储大量非结构化数据),Solid 是一个必须授权才可以使用的结构化数据计算和存储平台。

我们想要解决的问题是,如何私有化存储 IPFS 文件的哈希值。存储在 IPFS 上的文件哈希如果被泄漏,任何人都可以访问该文件,这是极不安全的,不是每个人都想把自己的文件上传到公有网络里。解决哈希值的泄漏有两种方案:

  1. 自建 IPFS 私有节点。该方案成本比较大,需要根据 IPFS 开放的协议重头来写;
  2. 自己写一套或使用成熟的互联网访问控制(WAC,Web Access Control)方案;

综合考虑成本、时间等因素,我们使用第二种方案。而第二种方案有非常多的实现,同时 Solid 是所有实现中最具开放性、代表性和权威性的。WAC 本身就是由 Tim Berners-Lee 在 2009 年提出的方案,如今用于 Solid 项目中是天作之合。

Solid 一个巨大的优势在于,它想将数据的所有权还归用户。如果想让用户愿意上传隐私数据到 IPFS 网络中,一个重要的因素在于如何保证用户上传的文件哈希不被其他人非法获取到,而 Solid 不仅可以安全的存储文件哈希值,还可以保证文件哈希值仅为用户所有。

于是我们写了个 solid-ipfs 框架用来解决这个问题。

解决方案

代码在 Github 上已开源:Eximua/solid-ipfs。

以下是以一个 WebId (用户在 Solid 网络中的唯一标识)为 https://alicea.solid.authing.... 的用户举例。

0_1544426702559_19ffdaba-998d-4435-8343-59f21e872e75-image.png
这是用户 Alicea 在 Solid 上的个人主页,其中 Profile 和 Public Folder 是可以公开被读取的数据(但是写入需要 Alicea 的权限确认),Inbox 为隐私数据,只有 Alicea 本人可以读取和写入。我们上传到 IPFS 网络中的私有文件哈希值将被存储到 Inbox 中。

简单来说的话,Profile、Public Folder 和 Inbox 可以理解为公有文件夹和私有文件夹。你所有的公有文件可以放到到公有文件夹里,私有的隐私数据可以放到私有文件夹内。

更简单来说,这就是 Solid Pod。

0_1544426716055_f9db500f-93fb-4dac-92e3-9ea72bda7ff4-image.png

Solid 的数据存储使用 RDF,RDF 是用来描述网络资源的一个框架,他把所有资源以三元组的形式进行描述。比如(姚明,身高,226cm)定义了姚明的身高是 226 厘米。

0_1544426745892_7c28eaf5-c689-4824-b52b-b987509793da-image.png

示例中的 (alicea, type, Person) 则定义了 Alicea 的类型是人。同理,(alicea, hash, QmVCZeNR7eQNEu5Gekqqbnmk85v66cFHHjZZTGZxAqA2hD) 定义了 Alicea 的哈希值为 "QmVCZeNR7eQNEu5Gekqqbnmk85v66cFHHjZZTGZxAqA2hD"(该哈希来自于 IPFS 的某个文件)。

当然这种描述方式不是语义化的,仅供示例参考。

为了对这些 RDF 进行读写操作,RDF 官方封装了 rdflib.js ,使语义计算可以在 Web 上执行(也就是可以在浏览器里执行语义计算啦)。

我们最终语义化的私有存储样例如下:

0_1544426761607_6ff02839-9f54-4734-8d1e-20862449678b-image.png

可以看到,我们使用了 "ipfs/hash" 这个命名空间(可以理解成文件夹)来存储相应的 IPFS 文件哈希值,并且把每一个哈希值作为一个文件(哈希值.txt)存储到 Solid Pod 中。这样用户在使用 Solid 账号登录之后我们就可以读取用户的文件哈希值列表,然后从 IPFS 网络中拉取文件了。

0_1544426773245_5888d71d-9265-4207-8200-b682684b6931-image.png

具体的技术细节就不再细讲了,感兴趣的可以自行查看代码:Eximua/solid-ipfs。

使用 solid-ipfs

最后介绍一下 solid-ipfs 的使用方法。

solid-ipfs 其实不止可以写入私有数据,还可以写入公有数据。

安装

$ npm install solid-ipfs --save

使用

import SolidIPFS from 'solid-ipfs';const main = async () => {const solidIpfs = new SolidIPFS({url: 'YOUR_SOLID_URL', // e.g. https://alicea.solid.authing.cn/inbox/});const result = await solidIpfs.storeHash({hash: 'YOUR_IPFS_HASH',});console.log(result, result ? '保存成功' : '保存失败');
}main();

通过访问<YOURL_SOLID_URL>/ipfs/hash/ 之后即可获得用户的 IPFS 哈希值列表

如果你还没有 Solid 账号,可以点击这里注册。

私有文件示例

  1. https://alicea.solid.authing....
import SolidIPFS from 'solid-ipfs';const main = async () => {const solidIpfs = new SolidIPFS({url: 'https://alicea.solid.authing.cn/inbox/', // inbox -> private});const result = await solidIpfs.storeHash({hash: 'YOUR_IPFS_HASH',});console.log(result, result ? '保存成功' : '保存失败');
}main();

公有文件示例

  1. https://alicea.solid.authing....
  2. https://alicea.solid.authing....
import SolidIPFS from 'solid-ipfs';const main = async () => {const solidIpfs = new SolidIPFS({url: 'https://alicea.solid.authing.cn/public/', // public -> public});const result = await solidIpfs.storeHash({hash: 'YOUR_IPFS_HASH',});console.log(result, result ? '保存成功' : '保存失败');
}main();

题外话,有的人可能对 RDF、语义计算这些概念不熟悉,这里再简单介绍下。

RDF 为什么叫资源描述框架,这个资源具体指代什么?

RDF 中的资源指代一切资源,它是一个通用的,可以定义一切的规范。比如:文件夹、文件、文件类型、代码、聊天内容、邮件等都属于资源,RDF 主要定义了这些不同类型资源的存储方式和数据规范。

我们为什么需要 RDF,它能解决什么问题?

RDF 看重语义化,可移植性和互操作性。语义化指你的数据存储规范必须是人类能理解的;可移植性代表当我想把我的数据从 A 平台移植到 B 平台时,不需要做任何的数据格式兼容;互操作性指我在 A 平台存储的数据在 B 平台上也可以进行读取和计算。

简单来说,就是所有的数据都共享同一套规范,减少为了兼容而产生的数据对齐时间,提升效率。RDF 是语义互联网(Web 3.0)的重要组成部分,它的愿景是全万维网的数据互通,变成一个大型计算平台,目前这个概念更有名的叫法为“知识图谱”。

Solid 资源列表:

  1. Solid 中文网
  2. Solid 中文社区

​3. Solid Pod 中国节点
​4. solid-ipfs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

appium启动app失败_Appium-Desktop Capability 配置及启动App演示

Appium-Desktop Capability配置介绍desired capability的功能是配置Appium会话。为什么要配置capability&#xff0c;目的就是为了告诉Appium服务器您想要自动化的平台和应用程序。Desired Capabilities是一组设置的键值对的集合&#xff0c;其中键对应设置的名称&#xff0c;而…

以Windows服务方式运行.NET Core程序

原文:以Windows服务方式运行.NET Core程序在之前一篇博客《以Windows服务方式运行ASP.NET Core程序》中我讲述了如何把ASP.NET Core程序作为Windows服务运行的方法&#xff0c;而今&#xff0c;我们又遇到了新的问题&#xff0c;那就是&#xff1a;我们的控制台程序&#xff0c…

好用的shell工具_精选5个酷毙的Python工具

来自&#xff1a;Python之禅工欲善其事必先利其器&#xff0c;一个好的工具能让起到事半功倍的效果&#xff0c;Python社区提供了足够多的优秀工具来帮助开发者更方便的实现某些想法&#xff0c;下面这几个工具给我的工作也带来了很多便利&#xff0c;推荐给追求美好事物的你。…

承载辉煌历史 畅想无线未来

看了JustDI的文章“手机也能当电脑用&#xff1f;&#xff0d;&#xff0d;谈谈未来智能手机操作系统的走向”&#xff0c;作为嵌入式爱好者&#xff0c;我也想谈谈自己的看法。首先&#xff0c;从网络发展的角度看&#xff0c;移动互联网的宽带化&#xff0c;宽带互联网的移动…

6款国内外SNS开源软件 搭建社交网站利器

SNS(Social Network Service)&#xff0c;有时称为社交网络&#xff0c;有时称为社会化网络&#xff0c;专指旨在帮助人们建立社会性网络的互联网应用服务。如果对SNS概念还很模糊&#xff0c;说到人人网、开心网你就明白了。 去年360圈、蚂蚁网接连关站给SNS前景蒙上一层阴影&…

aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;FeelsChaoticjuejin.im/post/5c57b2d5e51d457ffd56ffbb前言本文将从另一个角度讲解 AOP&#xff0c;从宏观的实现原理和设计本质入手。大部分讲 AOP 的博文都是一上来就罗…

xxl-job源码分析

xxl-job源码分析 xxl-job 系统说明 安装 安装部署参考文档&#xff1a;分布式任务调度平台xxl-job 功能 定时调度、服务解耦、灵活控制跑批时间&#xff08;停止、开启、重新设定时间、手动触发&#xff09; XXL-JOB是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是…

定制jQuery File Upload为微博式单文件上传

原文链接&#xff1a;http://avnpc.com/pages/single-file-upload-component-by-jquery-file-upload jQuery File Upload是一个非常优秀的上传组件&#xff0c;主要使用了XHR作为上传方式&#xff0c;并且利用了相当多的现代浏览器功能&#xff0c;所以可以实现诸如批量上传、超…

vb趣味编程弹球小游戏_最好玩的微信小游戏集合,总有一款是你没玩过的

大家好&#xff0c;这里是小雅龙生活趣味时间&#xff0c;自从17年微信推出小游戏程序以来&#xff0c;微信小游戏行业可谓是炙手可热&#xff0c;知道2019年不断有许许多多的微信小游戏如雨后春笋般的生根发芽。下面就由我带大家来看看今年最好玩&#xff0c;最受欢迎的微信小…

Golang——垃圾回收GC(2)

1 垃圾回收中的重要概念 1.1 定义 In computer science, garbage collection (GC) is a form of automatic memory management. The garbage collector, or just collector, attempts to reclaim garbage, or memory occupied by objects that are no longer in use by the pro…

java gui框架_推荐!程序员整理的Java资源大全

构建这里搜集了用来构建应用程序的工具。Apache Maven&#xff1a;Maven使用声明进行构建并进行依赖管理&#xff0c;偏向于使用约定而不是配置进行构建。Maven优于Apache Ant。后者采用了一种过程化的方式进行配置&#xff0c;所以维护起来相当困难。Gradle&#xff1a;Gradle…

帆软报表(finereport)控件背景色更改

setTimeout(function() {$(.fr-trigger-btn-up).css({"background-color": "#003399" });}, 100); 转载于:https://www.cnblogs.com/Williamls/p/11571586.html

mybatis 大于_酸爽!IDEA 中这么玩 MyBatis,让编码速度飞起!

作者&#xff1a;Orsoncnblogs.com/java-class/p/6237564.html1. 搭建 MyBatis Generator 插件环境a. 添加插件依赖 pom.xmlb. 配置文件 generatorConfig.xmlc. 数据库配置文件 jdbc.propertiesd. 配置插件启动项2.项目实战a. 比如在一个项目 我们要删除某个小组下某个用户的信…

scatter函数_matplotlib.pyplot常用函数scatter讲解大全(三)

前言这篇文章再来总结一个常用画图函数scatter-散点图。参数常用参数示例import matplotlib.pyplot as plt import numpy as np#导入需要的包 datanp.random.multivariate_normal([0,1],[[1,0],[0,1]],200)#准备数据&#xff0c;二维正态分布plt.rcParams["axes.unicode_m…

c++万能头文件_初学Python,与C对比

✎背景学了一学年的C的基础&#xff0c;下学年开课Python&#xff0c;现在正在自学中...C也不是不学了&#xff0c;而是之前买了一本《CPrimer》在学校里&#xff0c;就准备先学一下Python&#xff0c;下学期利用自由时间接着学习C。这里分析了一下二者的优缺点&#xff0c;供大…

本地无法启动MySQL服务,报的错误:1067,进程意外终止---解决

原文链接&#xff1a;http://blog.csdn.net/shenhonglei1234/article/details/5928873 在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了 首先找到这个文件&#xff1a; 默认安装路径 C:/Program Files/MySQL/MySQL Server 5.1/my.ini …

团队升级

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/yulongblog/blog/2988702

Css3: gradient背景渐变

Css3: gradient背景渐变 原文链接&#xff1a;http://kk073000.blog.163.com/blog/static/34826942012123111322691/ css3实现了背景渐变。 <gradient> [ <linear-gradient> | <radial-gradient> | <repeating-linear-gradient> | <repeating-r…

聚类 python_python中实现k-means聚类算法详解

算法优缺点&#xff1a; 优点&#xff1a;容易实现 缺点&#xff1a;可能收敛到局部最小值&#xff0c;在大规模数据集上收敛较慢 使用数据类型&#xff1a;数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的&#xff0c;相近的就会放…

python笔试常见题

1、冒泡排序&#xff1a; 冒泡排序算是最基本的python算法了。也算python面试遇到问的最多的了。 如果是封装成函数。代码如下&#xff1a; 如果初始就一个字典。那么代码为&#xff1a; 冒泡排序的本质就是两两比较。根据结果调换位置。最终达到一个排序的效果。 注&#xff1…