使用 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,一经查实,立即删除!

相关文章

使用window.postMessage实现跨域通信

JavaScript由于同源策略的限制,跨域通信一直是棘手的问题。当然解决方案也有很多&#xff1a; document.domainiframe的设置&#xff0c;应用于主域相同而子域不同&#xff1b;利用iframe和location.hash&#xff0c;数据直接暴露在了url中&#xff0c;数据容量和类型都有限Fla…

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

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

WinRAR 命令行简体中文说明

从命令行也可以运行 WinRAR 命令&#xff0c;常规的命令行语法描述如下:WinRAR - -命令 要 WinRAR 运行的字符组合代表功能。开关 切换操作指定类型&#xff0c;压缩强度&#xff0c;压缩文件类型&#xff0c;等等的定义。压缩文件 要处理的压缩文件名。文件 要处理的文件名。列…

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

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

SparkSession.read().csv()无法定位本地文件的问题

原因是spark有两个文件头 [file://]代表本地 [hdfs://]代表hdfs路径 如果路径没有文件头&#xff0c;spark会将该路径默认添加上"hdfs://" 所以如果要访问本地csv文件&#xff0c;需要确保路径前面有"file://" //java代码&#xff0c;告诉spark这是本地文件…

JavaScript的10种跨域共享的方法

在客户端编程语言中&#xff0c;如javascript和ActionScript&#xff0c;同源策略是一个很重要的安全理念&#xff0c;它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的&#xff0c;一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那…

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

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

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

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

接口码释义

1xx&#xff1a;信息&#xff0c;请求收到&#xff0c;继续处理 2xx&#xff1a;成功&#xff0c;行为被成功地接受、理解和采纳 3xx&#xff1a;重定向&#xff0c;为了完成请求&#xff0c;必须进一步执行的动作 4xx&#xff1a;客户端错误&#xff0c;请求包含语法错误或…

java读取文件内容,文件头有\ufeff

"\ufeff"是UTF-8 BOM编码的文件头&#xff0c;代表该文件按照什么字节顺序排序 调用java的工具类[ UnicodeInputStream ]即可解决这个问题 //第二个参数targetEncoding为null时在getDetectedEncoding方法中会自动检测编码类型 UnicodeInputStream unicodeInputStrea…

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 的博文都是一上来就罗…

孟宪会老师推荐的一部C#图解教程

Amazon五星级盛誉 C# 最新特性一览无余 数十年开发与教学经验的结晶 图、表和文字完美结合&#xff0c;最易学的C# 教程 本书详细信息&#xff1a;http://www.china-pub.com/43556 微软4大名著评选结果揭晓&#xff1a;http://www.china-pub.com/static07/0812/jsj_micrmingz_0…

Python数据分析Numpy库方法简介(三)

补充&#xff1a; np.ceil()向上取整 3.1向上取整是4 np.floor()向下取整 数组名.resize((m,n)) 重置行列 基础操作 np.random.randn()符合正态分布(钟行/高斯)的数据 矩阵的水平拼接 np.vstack((a,b)) 矩阵的垂直拼接 np.hstack((a,b)) 点阵积&#xff1a; np.dot(a,b)/ ab…

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;最受欢迎的微信小…

開發MOSS2007 Masterpage的一些經驗

一直在做MOSS平臺的Masterpage開發,碰到很多的問題,總結了一些經驗,特此記錄: masterpage的所有的ContentPlaceholder詳細解釋見以下網址:http://www.cnblogs.com/WinYoung/archive/2007/06/25/791766.html 1.如果應用masterpage以后IE狀態欄出現""網頁指令碼錯誤訊息…

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…