『Steemit区块链学院』第三季第七期课程 | IPFS去中心数据存储平台

in hive-108451 •  3 years ago  (edited)

这星期是「Steemit区块链学院第三季课程」的第八周,我们课程给学员们介绍了有关数据储存的技术,IPFS。课后作业要求学员们注册,并将自己的文件上传到一个提供IPFS数据储存的平台。


图片取自『Steemit区块链学院』第七期课程 | 区块链中的IPFS内容存储技术


IPFS全名为InterPlanetary File System,星际文件系统。既然叫做星际,就是说想把这个系统做成可以把数据分散到不同星球的程度。

We're striving to build a system that works across places as disconnected or as far apart as planets.

IPFS文档

根据上面文档的介绍,开发者确实拥有着着星际迷航畅想。

不过就目前人类的技术而言,能够快速地将数据发送到火星上就不错了,开发人员还是在努力的完善在地球上的功能。

去中心化

区块链的一个重要的目标就是去中心化。那么储存区块链数据的平台应该也要遵循这个特点。为了提速区块链数据搜索的速度,不是所有的数据都储存在链上;那么像图片,视频之类的大型数据则需要储存在不同的地方。

如果我们在https://steemd.com查看我们自己发表的文章的话,我们可以看到文章中的图片并不是在区块链的数据中,而是存放在其他的数据贮存平台。

当然,如果这些数据储存的平台是中心化的话,当平台当机,或者终止服务,那么我们上传的文件将不复存在。那么去中心化的数据储存平台就成为了大家探索的目标。

IPFS就是解决这个问题的技术。它利用点对点的链接方式,利用加密散列将数据输送到用户的本地系统。这种方法对于中心化的操作方法,可以提供更多的带宽。

在中心化的系统,所有的用户都将访问同一个节点。即便是像亚马逊,阿里云这样拥有大规模区域性冗余的公司,也只能做到将全世界划分为几个区域,同一个区域的人共享同一个数据中心的带宽。

今天年初,谷歌美国中西部数据中心以外下线,导致几个州的人无法登录油管。而点对点则可以极度地避免这种现象的发生。

注册账户

这期课程中提到了一个IPFS的平台,Pinata。我便跟随着教程在Pinata注册了自己的账户。

https://app.pinata.cloud/register

hw0.PNG

根据从上往下的顺序,注册的页面要求填写填写名,姓,邮箱,密码,和确认密码。其后是选择账户的分类,开发员或者是作者;不过上面介绍说选哪个都不会影响个人体验,所以也就无所为了。

注册完成之后,将会在注册的邮箱中收到注册码。填入注册码确认之后,账户便注册成功。

生成API密钥

hw1.PNG

从平台的桌面上看,上传文件应该很简单明了。点击上传键便可以上传本地的文件(绿色圈圈)。对于我来说,我对如何使用应用程序接口(API)更感兴趣。在Web 3.0,区块链,铸造NFT的网络世界里,谁还收手动做这些事情呢?

点击右上角自己的头像(红色圈圈),选择API Keys,系统转到生成API的页面;在选择所有我认为需要的权限之后,点击最下面的Create Key。

hw2.PNG

系统自动生成我链接自己的程序的密钥。

为了安全起见,我抹掉了生成的三组字符串中的隐秘的两组。没有删除的是公钥,抹掉的两个分别为密钥,和JSON网络令牌。

hw3.PNG

故意留下涂抹的截图,是想让大家看到JSON网络令牌的长度。一般情况下,为了避免暴露密钥,应用程序会用JSON网络令牌作为沟通不同系统的暗语,在网络中传输。

在密码学或者网络安全中有一个说法,就是字母长度越长,约难破解。

如果我们可以一个字符可以是字母或者数字,如果只考虑10个特殊符号,那么每一个字符会有46中不同的可能性。如果是两个字符,那么字符组合将是46^2的组合可能;如果是是个字符那就是46^10。

如果是20个字符基本没有特殊符号,也比10个字符加特殊符号的破解难度高。

离开学校太久了,突然拾起当年学的知识还是有点生疏,希望没有写错。其实上面所要解释的就是字符串越长越难破解,也就是说JSON网络令牌暴露在网络上比在HTTPS下暴露密钥,要安全的多。

不过,我今天的目的不是制作一个长期摆放在万维网上面的网站,所以就用公钥和密钥就可以了。

hw4.PNG

写程序

现在到了最好玩的地方了。写几个测试小程序。

首先,需要研究一下可以导入什么代码库。本来我像使用HTTP客户端Axios。IPFS同时可以接受HTTP和本身IPFS协议。不过在阅读Pinata的文档的时候,发现了NodeJS的开发工具包(SDK)。这么一来就不需要我自己研究JSON的格式以及可以调用的就扣程序了。

测试程序不需要一个网络用户界面,所以我需要上传的文件肯定是在本地的文件夹中。所以我需要一个能够读取本地文件的代码库。

最后,我不想把自己的密钥写入代码中,我需要一个可以读取配置变量的代码库。即便是测试程序,还是不要把任何密码类的信息写入程序中;别的数据没事,但是隐秘的密钥绝对不行。万一不小心把代码库发到像Github之类的数码库中,就是解决不了的麻烦。

"dependencies": {
"@pinata/sdk": "^1.1.23",
"dotenv": "^8.2.0",
"fs": "0.0.1-security"
}

安装三个代码库之后,我需要写一个能够验证我的密钥的程序。直接套用官方的开发工具包,能出错的可能性几乎为零。其实在这里主要测试的东西是自己刚刚抄下来的公钥和密钥管不管用。

image.png

测试成功后便是编写上传的程序了。

首先是导入本地的文件。我选择了一张自己狗狗的图片。因为是测试,并不是要写一个完整的应用。所以我直接把上传的文件的信息写在代码里。

image.png

我给自己上传的图片取名为MyDog,并且给文件附加了两个自定义的属性。

hw5.PNG

在Visual Code里面的命令行终端运行。上传的文件的大小为7.9MB,用了几秒钟后反馈了一种数据。其中包括一个加密的字符串,文件大小,和时间戳。

hw6.PNG

回到浏览器查看Pinata的桌面。发现了刚刚上传的文件。查看元数据,看到了自己定义的两个属性。

hw7.PNG

根据IPFS的原理,在网上查看储存的文件是通过加密散列作为地址。在返回的三组数据中的加密的字符串应该就是在网上查询用的地址。大家可以看上图网址中的后面一组字符串就是在反馈截图中的IpfsHash的数据。

我测试了两次,返回的加密散列一摸一样,也就是说加密用的盐中并没有时间戳。

以往我设计单项加密的程序喜欢加入时间戳,起码增加一下逆向工程破解的难度。不过这里没有。有时间可以看看代码中他们是怎么加密的(如果是开源的话,估计应该不是)。

后记

为什么我要练习写一个程序?

首先,用图形用户界面上传真的不好写出和别的同学不同的东西来,为了避免重复,我的作业用程序上传。

其次,如果有想接触编程的友友,这也算一个小小的教程。

最后,前段时间想和@robertyan一起搞一个铸造NFT的平台,Nutbox的第三阶段有利用NEAR链开发NFT的计划。我们就打算在NEAR链上做一些文章。

铸造NFT需要一个存放文件的永久地址。在测试自己制作一个Steem前端的时候,我一直想不通在不加后端的基础上,在哪里存放NFT文件?

没想到,在阿兰教授的第三季第八周的课程中,一下子茅塞顿开。IPFS不就是解决方法吗?

没想到踏破铁鞋无觅处,答案其实就在眼前。

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  
  ·  3 years ago 

点评:

  • 学员@lnakuma,当前声望64,本期课程所参与的课后作业内容为“将音频、视频、图片、文档等文件内容上传至IPFS网络中,并以教程的形式将整个实际操作流程记录下来,过程中必须包含整个流程的文本图片,并且进行图文并茂的描述”,所编写的作业文章符合本期课程的参与要求。

  • 在当前课程的课后作业当中,学员@lnakuma选择了IPFS平台Pinata来实践学习IPFS,在整个事件过程学员@lnakuma的实践操作可谓是入木三分,学员@lnakuma并未选择直接上传相关内容,而是非常熟练的进行API秘钥的生成,后期也通过代码的形式将相关内容上传至IPFS网络当中,技术性的操作使得整篇作业文章更有层次感。


优点:

  • 关于IPFS相关平台的实践操作熟练得当,且技术性的操作更让当前作业文章蹙金结绣。

缺点:

  • 整篇作业文章对于非技术人员来说在阅读方面具有一定的难度,且整篇作业文章缺失了安全代码邮件截图部分。

建议:

  • 如果本身真的有兴趣开发相应的Dapp,那么建议将IPFS结合期中,无论是网络还是存储,IPFS都能提供绝佳的体验。

打分:「满分10」

  • 7.5分
  ·  3 years ago 

谢谢教授评价。我也觉得写的有点过于简单,说的不是太清楚。

  ·  3 years ago 

大神😂

[WhereIn Android] (http://www.wherein.io)

  ·  3 years ago 

哈哈,过奖🤣🤣

  ·  3 years ago 

厲害

  ·  3 years ago 

厉害,!shop

  ·  3 years ago 

你好鸭,lnakuma!
@susanli3769赠送1枚SHOP币给你!

目前你总共有: 120枚SHOP币

查看或者交易 SHOP币 请到 steem-engine.net.

无聊吗?跟我猜拳吧! **石头,剪刀,布~**
  ·  3 years ago 

最后,前段时间想和@robertyan一起搞一个铸造NFT的平台 - 这个想法好,现在NFT正在盛行,加油!

like

  ·  3 years ago 

拍拍

  ·  3 years ago 

👏👏👏

  ·  3 years ago 

大神 🙏🙏🙏👏