# 使用 The Graph 获取各大元宇宙项目交易信息 **Published by:** [Yooma](https://paragraph.com/@yooma/) **Published on:** 2022-08-01 **URL:** https://paragraph.com/@yooma/the-graph ## Content The graph 工作原理 Graph 根据subgraph描述(称为subgraph.graphq)学习什么以及如何索引以太坊数据。子图描述定义了subgraph感兴趣的智能合约,这些合约中要关注的事件,以及如何将事件数据映射到 The Graph 将存储在其数据库中的数据。该流程遵循以下步骤:去中心化应用程序通过智能合约上的交易将数据添加到以太坊。智能合约在处理交易时发出一个或多个事件。Graph Node 不断地扫描以太坊以寻找新的块以及它们可能包含的子图的数据。Graph Node 在这些块中为您的子图查找 Ethereum 事件并运行您提供的映射处理程序。映射是一个 WASM 模块,它创建或更新 Graph Node 存储的数据实体以响应以太坊事件。去中心化应用程序使用节点的GraphQL 端点查询 Graph 节点以获取从区块链索引的数据。Graph 节点反过来将 GraphQL 查询转换为对其底层数据存储的查询,以便利用存储的索引功能获取此数据。去中心化应用程序在丰富的 UI 中为最终用户显示这些数据,他们使用这些数据在以太坊上发布新交易。循环重复 (来自The graph官网)一:工具1: The Graph2: OpenSea api3:Python二:流程1:使用The Graph编写Subgraph来获取各个平台最新的 transfer 的parcel id, tx_hash等信息2:使用python调用在 the graph 中编写的subgraph获取最新的 transfer 的 parcel id3:通过opensea api 获取该 parcel id 的交易详细数据三:用法(以otherside为例)1:The Graph(1):创建Subgraph在 The Graph Subgraph页面创建Subgraph选择Indexed Chain(我这里选择以太坊主网)→ Subgraph名字 → continue监听otherside的transfer,这里我选择Ethereum Mainnet(进入创建的Subgraph页面右侧会有流程指南) 首先安装 the graph cliThe Graph官网流程截图---选择其一命令执行成功后,输入graph,有以下提示代表安装成功。安装the graph cli 成功在本地创建Subgraph项目(otherside是项目名字)The Graph官网流程截图后面可以直接指定otherside的合约地址回车之后在选择Ethereum network这里选择mainnet (刚刚在The Graph官网创建的选择Ethereum Mainnet)其余的默认即可。(2): 编写代码创建项目成功之后进入到项目目录使用VSCode编辑代码-- 整体编写分两步: -- 第一步:只需要关心schema.graphql和subgraph.yaml两个文件的作用以及用法。 -- 第二步:需要知道 ./src/contract.ts 的作用以及用法 schema.graphql: 定义子图的schema。 GraphQL schema是使用 GraphQL 接口定义语言定义的。 需要具体了解GraphQL schema可以查看参考文档 GraphQL API 。 直白的讲,我们在该文件定义好每个实体(下图 Transfer和Parcel)之后,The Graph官网的项目中也就会暴露出我们代码中定义的实体比如我们代码中定义了Transfer和Parcel根据这些查询参数要获取想要的信息The Graph官网项目中暴露出的查询参数schema.graphql在定义好之后只是一个用于我们查询的模板。但是数据从哪里来以及如何匹配,就需要用到subgraph.yaml 和 ./src/contract.tssubgraph.yaml:定义了subgraph索引的智能合约,这些合约中需要关注的事件,以及如何将事件数据映射到 Graph 节点存储并允许查询的实体。(创世块的查找:在ethscan中输入otherside合约地址)12eventHandlers: Transfer 对应abi中的Transfer事件handleTransfer 对应 ./src/contract.ts中我们定义的function(在下文会提到),现在先写到这里 写好schema.graphql和subgraph.yaml之后回到终端执行graph codegen命令这里会自动生成一些代码文件./src/contract.ts:最后一步来做数据的匹配代码完成之后回到The Graph官网创建的项目中,继续右侧的流程,执行最后一步部署subgraph之后在The Graph官网会看见自己的版本号 当进度条到100%后代表otherside从设置的创世块到目前最新的块的数据都已经匹配到,如果有新块生成同样也会自动匹配(3): 使用部署的subgraph至此 the graph 的 subgraph已经部署完成。 使用python来请求数据2:pythonpython这里不多做解释,使用requests来请求接口import requests url = "创建的subgraph -->detail中的DEVELOPMENT QUERY URL" query = """ { transfers(orderBy: date, orderDirection: desc, first: 50){ id date parcel{ id } } } """ requests_res = requests.post(url, json={'query': query}) 3:opensea api使用 opensea api 获取交易的数据需要4个参数 token_id: parcel id (the graph 获取的 parcel id---例如上张图片中的 “74425”) asset_contract_address: 平台的合约地址*(otherside:0x34d85c9cdeb23fa97cb08333b511ac86e1c4e258)*event_type: 用于检索我们获取该parcel id什么类型的数据 (在the graph编写subgraph中获取的是transfer事件的信息,我们通过这个参数来检索获取交易的信息。)由于目的要获取交易数据,所以选择successful。API-KEY: 需要向opensea平台申请!调用方法同样使用python requests,再经过处理获取出buyer,seller,交易金额等数据 ,也可以从返回的数据中获取其他需要的数据。4:总结概括:由于部署了subgraph之后,会自动实时匹配链上新的块的信息。所以可以使用python写一个脚本,然后放到crontab中来定时调用该接口以获取新的transfer的parcel id,再用opensea event_type中的successful参数过滤出交易的信息(因为subgraph中定义的实体Transfer的id是txhash--唯一值,可以使用它来记录每一次取到最新值的位置) 注: 开发过程中参考的文档The Graph 官方文档Cryptovoxels Parcels源码 ## Publication Information - [Yooma](https://paragraph.com/@yooma/): Publication homepage - [All Posts](https://paragraph.com/@yooma/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@yooma): Subscribe to updates - [Twitter](https://twitter.com/_yoonama): Follow on Twitter