图是什么

Graph是一种去中心化协议,从以太坊开始,用于索引和查询来自区块链的数据。这样就可以查询难以直接查询的数据。

例如,对于流行的 CryptoKitties dApp,询问以下问题相对简单:

  1. 特定的以太坊账户拥有多少个CryptoKitties?
  2. 特定的CryptoKitty何时诞生?

这是因为合同所 公开的balanceOfgetKitty方法直接支持这些读取模式

但是,其他问题更难以回答:

  1. 在2018年1月至2月之间出生的CryptoKitties的所有者是谁?

要回答这个问题,您必须处理所有 Birth事件 ,然后 为每个已出生的CryptoKitty调用该 ownerOf方法

即使对于这个相对简单的问题,要在浏览器中运行的去中心化应用程序(dApp)可能也要花费数小时甚至数天的时间。索引区块链数据很难。诸如最终性,链重组或无区块的区块链属性使该过程进一步复杂化,不仅耗时,而且从概念上讲很难从区块链数据中检索正确的查询结果。

Graph现在通过索引区块链数据的托管服务解决了这一问题。然后可以使用标准的GraphQL API查询这些索引(“子图”)。将来,托管服务将演变为具有相同功能的完全分散的协议。两者都得到Graph Node的开源实现的支持 。

图的工作方式

Graph根据子图描述(称为子图清单)来学习什么以及如何索引以太坊数据。子图描述定义了子图感兴趣的智能合约,这些合约中要注意的事件以及如何将事件数据映射到Graph将存储在其数据库中的数据。

编写子图清单后,就可以使用Graph CLI将定义存储在IPFS中,并告诉托管服务为该子图开始索引数据。

此图提供了有关子图清单部署后处理以太坊事务的数据流的更多详细信息:

该流程遵循以下步骤:

  1. 分散的应用程序通过智能合约上的交易将数据添加到以太坊。
  2. 智能合约在处理交易时会发出一个或多个事件。
  3. Graph Node持续扫描以太坊中的新块以及它们可能包含的子图数据。
  4. Graph Node在这些块中为您的子图找到以太坊事件,并运行您提供的映射处理程序。映射是WASM模块,用于创建或更新Graph Node响应以太坊事件而存储的数据实体。
  5. 分散的应用程序使用节点的GraphQL端点在Graph节点中查询从区块链索引的数据。Graph节点进而将GraphQL查询转换为对其底层数据存储的查询,以便利用存储的索引功能来获取此数据。
  6. 分散的应用程序在丰富的UI中为最终用户显示此数据,供最终用户在以太坊上发布新交易。
  7. 循环重复进行。

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store