深入了解IPFS(2/6):什么是IPLD?

IPFS中国社区
企业专栏
热度: 8802

本文全面深入研究并讨论IPLD的意义、IPLD如何运作、如何玩转IPLD等问题。

IPFS

在这一部分,我们将全面深入研究IPLD并讨论。(本文由IPFS中国社区编译)

 

IPLD的意义:它背后的哲学是什么,为什么我们需要它,它在什么地方适合IPFS?

 

IPLD如何运作:说明其规范,以及它如何与IPFS的其他组件协调?

 

与IPLD一起玩:嗯,玩,总是很有趣。

 

IPLD的意义

 

IPLD不仅是IPFS项目的一部分,而是一个单独的项目。要理解它在分散世界中的重要性,我们必须理解关联数据的概念:语义网。

 

什么是关联数据?为什么我们需要它?

 

语义网或关联数据是Tim Berners Lee先生在2001年发表于“科学美国人”的一篇开创性文章中创造的一个术语。Berners Lee阐述了一个万维网数据的愿景,即机器可以独立于人类进行处理,改变我们日常生活的新服务。虽然文章中的大多数网页包含可由软件代理分析和采取行动的结构化数据的愿景尚未实现,但语义网已经成为一个越来越重要的平台,通过不断发展的社区使用国际语义Web标准,实现数据共享关联数据。

 

目前有许多使用语义Web技术和关联数据的例子,以便在整个网络上以灵活和可扩展的方式共享有价值的结构化信息。语义Web技术被广泛用于生命科学中,通过在多个数据集中找到路径来促进药物发现,这些数据集通过与每个数据相关联的基因显示药物和副作用之间的关联。“纽约时报”发表了150多年来作为关联数据开发的大约10,000个主题标题的词汇,并将覆盖范围扩大到大约30,000个主题标签; 他们鼓励开发使用这些词汇表的服务,并将它们与其他在线资源相关联。

 

在英国广播公司使用关联数据使搜索引擎更容易找到内容,并通过社交媒体更多地链接; 从音乐或体育等领域的补充资源中添加其他上下文,并将链接和编辑注释传播到其原始条目目标之外,以便在其他上下文中提供相关信息。美国data.gov网站的主页声明:“随着链接文档网络的发展,包括链接数据网络,我们正致力于最大限度地发挥语义Web技术的潜力,实现链接开放政府数据的承诺”,并且所有社交媒体网站都使用关联数据来创建人员网络,以使他们的平台尽可能具有吸引力。

 

所以我们确实有一些关联数据,但为了利用关联数据的真正力量,我们还有很长的路要走。

 

现在想象一下,如果您可以将git分支中的最新提交引用到比特币交易中,以便为您的工作添加时间戳。因此,通过链接git提交,您可以区块链资源管理器中查看提交。或者,如果您可以将以太坊合约链接到IPFS上的媒体,那么可以修改它,并在每次函数执行时跟踪它的更改。

 

所有这些都可以使用IPLD。

 

IPLD是内容可寻址网络的数据模型(如在第一部分所述)。

 

它允许我们将所有与哈希相关的数据结构视为统一信息空间的子集,统一将所有数据与哈希作为IPLD实例链接的数据模型。

 

或者换句话说,IPLD是一组标准和实现,用于创建通用可寻址和可链接的分散数据结构。这些结构允许我们为数据做什么URL和链接为HTML网页做了什么。

 

通过哈希进行内容寻址已成为分布式系统中连接数据的一种广泛使用的方法,从运行您喜欢的加密货币的区块链到支持代码提交,再到整个网络的内容。然而,虽然所有这些工具都依赖于一些常见的原语,但它们的特定底层数据结构是不可互操作的(因为我现在无法将我的git提交连接到区块链事务)。

 

IPLD是所有哈希启发协议的单一命名空间。通过IPLD,可以跨协议遍历链接,无论底层协议如何,都可以探索数据。

 

IPLD如何运作?

 

在深入了解IPLD之前,让我们看看IPLD的属性。

 

IPLD的属性

 

天空是极限,因为IPLD允许您跨协议边界工作。关键是IPLD提供的库默认情况下使基础数据可以跨工具和跨协议进行互操作。

 

规范数据模型

 

一种独立的描述性模型,可唯一标识任何基于散列的数据结构,并确保相同的逻辑对象始终映射到完全相同的位序列。

 

协议独立解决方案

 

IPLD将孤立的系统结合在一起(如连接比特币,以太坊和git),使与现有协议的集成变得简单。

 

升级

 

通过Multiformats(我们将在第4部分中进一步深入研究),IPLD可以轻松升级,并随着您喜欢的协议而增长。

 

跨格式操作

 

以各种可序列化格式(如JSON,CBOR,YAML,XML等)表达您的IPLD对象,使IPLD可以与任何框架一起使用。

 

向下兼容

 

非侵入式解析器使IPLD易于集成到您现有的工作中。

 

所有协议的命名空间

 

IPLD允许您无缝地跨协议探索数据,通过公共命名空间将基于散列的数据结构绑定在一起。

 

现在,让我们深入了解IPLD。

 

深入了解IPLD规范

 

IPLD不是单一规范,而是一组规范。

 

IPFS

该堆栈的目标是实现分散的数据结构,从而实现更分散的应用程序。

 

该堆栈中的许多规范是相互依赖的。

 

IPFS

这些图表显示了IPLD的高级项目规范。即使你不完全理解它也完全没问题。

 

好。足够理论的东西。让我们深入探讨这篇文章中最有趣的部分。

 

玩转IPLD

 

在IPFS中,IPLD有助于构建和链接所有数据块/对象。因此,正如我们在第1部分中看到的那样,IPLD负责组织构成kitty图像的所有数据块。

 

在这一部分中,我们将创建一个类似发布系统的medium.com,并使用IPLD链接标签,文章和作者。这将有助于您更直观地了解IPLD。您还可以在Github上找到完整的教程。

 

让我们开始吧!

 

在创建发布系统之前,我们将探索IPFS DAG API,它允许我们以IPLD格式将数据对象存储在IPFS中。(你可以在IPFS中存储更多令人兴奋的东西,比如你最喜欢的猫GIF,但我们现在会坚持使用更简单的东西。)

 

如果您不熟悉Merkle尝试和DAG,那么请到这里。如果您对这些术语的含义有所了解,那么继续……

 

创建文件夹名称ipld-blogs。运行npm init并按下Enter所有问题。

 

现在使用以下命令安装依赖项:

 

npm install ipfs-http-client cids --save

 

安装模块后,您的项目结构将如下所示:

 

IPFS

创建IPLD格式节点

 

您可以通过将数据对象传递给ipfs.dag.put方法来创建新节点,该方法返回新创建的节点的内容标识符(CID)。

 

ipfs.dag.put({name: ‘vasa’})

 

CID是IPFS中从其内容派生的数据块的地址。每当有人将相同的{name: 'vasa'}数据放入IPFS时,他们将获得与您获得的相同的CID。如果他们放入{name: 'vAsa'},CID将是不同的。

 

将此代码粘贴tut.js并运行node tut.js

 

//Initiate ipfs and CID instance

const ipfsClient = require('ipfs-http-client');

const CID = require('cids');

 

//Connecting ipfs instance to infura node. You can also use your local node.

const ipfs = new ipfsClient({ host: 'ipfs.infura.io', port: '5001', protocol: 'https' });

 

/*

Creating an IPLD format node:

ipfs.dag.put(dagNode, [options], [callback])

 

For more information see:

https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/DAG.md#ipfsdagputdagnode-options-callback

*/

 

ipfs.dag.put({name: "vasa"}, { format: 'dag-cbor', hashAlg: 'sha2-256' }, (err, cid)=>{

  if(err){

      console.log("ERR\n", err);

  }

  

  //featching multihash buffer from cid object.

  const multihash = cid.multihash;

  

  //passing multihash buffer to CID object to convert multihash to a readable format   

  const cids = new CID(1, 'dag-cbor', multihash);

  

  //Printing out the cid in a readable format

  console.log(cids.toBaseEncodedString());

  //zdpuAujL3noEMamveLPQWJPY6CYZHhHoskYQaZBvRbAfVwR8S

});

 

你会得到这个CID zdpuAujL3noEMamveLPQWJPY6CYZHhHoskYQaZBvRbAfVwR8S。

我们已成功创建了一个IPLD格式节点。

 

连接IPLD对象

 

有向无环图(DAG)的一个重要特征是将它们链接在一起的能力。

 

在ipfsDAG存储中表达链接的方式与CID另一个节点相同。

 

例如,如果我们希望一个节点有一个名为“foo”的链接指向另一个先前保存为的CID实例barCid,它可能看起来像:

 

{

  foo:barCid

}

 

当我们给字段命名并使其值成为CID的链接时,我们称之为命名链接。

 

以下是显示如何创建命名链接的代码。

 

//Initiate ipfs and CID instance

const ipfsClient = require('ipfs-http-client');

const CID = require('cids');

 

//Connecting ipfs instance to infura node. You can also use your local node.

const ipfs = new ipfsClient({ host: 'ipfs.infura.io', port: '5001', protocol: 'https' });

 

/*

Creating an IPLD format node:

ipfs.dag.put(dagNode, [options], [callback])

For more information see:

https://github.com/ipfs/interface-js-ipfs-core/blob/master/SPEC/DAG.md#ipfsdagputdagnode-options-callback

*/

async function linkNodes(){

    let vasa = await ipfs.dag.put({name: 'vasa'});

 

    //Linking secondNode to vasa using named link.

    let secondNode = await ipfs.dag.put({linkToVasa: vasa});

}

 

linkNodes();

 

使用链接读取嵌套数据

 

您可以使用路径查询从深层嵌套对象中读取数据。

 

ipfs.dag.get允许使用IPFS路径进行查询。这些查询返回一个对象,该对象包含查询的值以及任何未解析的剩余路径。

 

这个API很酷的一点是它也可以遍历链接。以下是如何使用链接读取嵌套数据的示例。

 

//Initiate ipfs and CID instance

const ipfsClient = require('ipfs-http-client');

const CID = require('cids');

 

//Connecting ipfs instance to infura node. You can also use your local node.

const ipfs = new ipfsClient({ host: 'ipfs.infura.io', port: '5001', protocol: 'https' });

 

function errOrLog(err, result) {

    if (err) {

      console.error('error: ' + err)

    } else {

      console.log(result)

    }

}

 

async function createAndFeatchNodes(){

    let vasa = await ipfs.dag.put({name: 'vasa'});

 

    //Linking secondNode to vasa using named link.

    let secondNode = await ipfs.dag.put({

        publication: {

            authors: {

                authorName: vasa

            }

        }

    });

 

    //featching multihash buffer from cid object.

    const multihash = secondNode.multihash;

    

    //passing multihash buffer to CID object to convert multihash to a readable format   

    const cids = new CID(1, 'dag-cbor', multihash);

 

    //Featching the value using links

    ipfs.dag.get(cids.toBaseEncodedString()+'/publication/authors/authorName/name', errOrLog);

    /* prints { value: 'vasa', remainderPath: '' } */

}

createAndFeatchNodes();

 

您还可以使用这款酷炫的IPLD资源管理器探索您的IPLD节点。就像,如果我想看到这个CID:

zdpuAujL3noEMamveLPQWJPY6CYZHhHoskYQaZBvRbAfVwR8S

我会转到这个链接:

 

https://explore.ipld.io/#/explore/zdpuAujL3noEMamveLPQWJPY6CYZHhHoskYQaZBvRbAfVwR8S

 

现在,随着我们探索IPFS DAG API,我们已准备好与IPLD合作并创建我们的发布系统。

 

创建发布系统

 

我们将创建一个简单的博客应用程序。这个博客应用程序可以:

 

添加新的Author IPLD对象。作者将有2个字段:名称和个人资料(您的个人资料的标记行)。

 

创建一个新的Post IPLD对象。帖子将包含4个字段:作者,内容,标签和发布日期时间。

 

使用帖子CID阅读帖子。

 

以下是上述目标的代码实现。

 

在运行此代码时,它将首先创建一个作者via addNewAuthor,它将返回作者CID。然后这个CID将被传递给createBlog将返回的函数postCID。这postCID将由readBlog函数用于获取帖子详细信息。

 

您可以使用IPLD创建更复杂的应用程序...

 

作者:Vaibhav Saini

本文由IPFS中国社区编译

声明:本文为入驻“火星财经 专栏”作者作品,不代表火星财经官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
本内容旨在传递行业动态,不构成投资建议或承诺。
关键字:IPFSIPLD