用 Graph 捕捉区块链事件并提供一个查询事件的 GraphQL 接口-文章来自问我社区
Graph 介绍
编写智能合约时,通常状态的变化是通过触发一个事件来表达,The Graph 则是捕捉区块链事件并提供一个查询事件的 GraphQL 接口,让我们可以方便的跟踪数据的变化。实际上很多 defi 协议及都是 The Graph 来基于查询数据。
流程概述
- 在 Rinkeby 部署一个合约,并调用触发事件。
- 创建定义数据索引的 Subgraph。
- 部署 Subgraph 到 TheGraph,实现数据索引。
- 在前端 DApp 中查询索引数据。
如果你有自己的私有链,这可以克隆 Graph 节点代码 https://github.com/graphprotocol/graph-node/ 自己运行 Graph 节点来完成数据的索引。
TheGraph 中定义如何为数据建立索引,称为 Subgraph,它包含三个组件:
- Manifest 清单(subgraph.yaml) - 定义配置项
- Schema 模式(schema.graphql) - 定义数据 , 参考文档 https://graphql.cn/learn/
- Mapping 映射(mapping.ts) - 定义事件到数据的转换
操作步骤
安装相关依赖
bash yarn install
配置私钥
为方便获取,在 .env 中放入的私钥,格式为 "PRIVATE_KEY=xxxx", 然后代码自动从中读取
另外需要设置你的 infura 节点 id,在 .env 中放入的私钥,格式为 "INFURA_ID=xxxx"
部署合约(用于测试 graph 的简单合约)
bash npx hardhat run ./scripts/deploy.js --network rinkeby
输出信息类似如下:
bash Deploying contracts with the account: xxxxxxxxxxxxxx Account balance: 10000000000000000000000 Token address: 0x5FbDB2315678afecb367f032d93F642f64180aa3 Transfer 50 to receiver 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 Account balance of receiver is: 50
TheGraph 创建一个 Subgraph 空间
因为需要借助 TheGraph 的节点来完成数据的索引,因此我们需要在 TheGraph Studio 上创建一个 Subgraph。
如果没有 The Graph 的账户,可以直接连接钱包注册,账户名即为钱包地址,以下称之为 <THEGRAPH_USERNAME>。
批准钱包签名之后,会跳转到 My Subgraphs 面板,点击 Create a Subgraph 按钮。
输入你的项目名称(例如 TEST01),以下称之为 <SUBGRAPH_NAME>,点击 continue 按钮,之后会跳转到 subgraph 的项目主页
注:最新版的 Graph CLI 仅支持在 mainnet 和 rinkeby 上部署,若要在其他网络上使用,需要使用 Github 账户登录后在 Hosted Service 上创建和部署
开发和部署 subgraph
先使用 yarn 在全局安装 Graph CLI
bash yarn global add @graphprotocol/graph-cli
初始化配置:
bash graph init --studio <SUBGRAPH_NAME>
若使用 Hosted Service,则初始化命令如下:
bash graph init --product hosted-service <GITHUB_USER>/<SUBGRAPH NAME>
- 在 "Subgraph name" 和 "Directory to create the subgraph" 直接回车即可
- Ethereum network 这里选择 rinkeby
- "Contract address" 这里输入在步骤 3 中部署合约时生成的合约地址
- 上面执行到 "fetch ABI from Etherscan" 时会报执行失败,然后出现 "ABI file (path)" 字样,提示输入本机中 abi 的文件路径,这里我们输入 SimpleToken.json 所在的路径即可(./abis/SimpleToken.json)
- 如果 yarn install 失败(例如网络错误),可以进入新生成的项目目录,手动安装 npm 依赖
修改定义模式
两个文件的修改范例在 ./scripts/schema.graphql 和 ./scripts/mapping.ts
<SUBGRAPH_NAME>/schema.graphql 修改文件内容如下
- <SUBGRAPH_NAME>/src/mapping.ts 修改文件内容如下
修改实体名字
原文信息
原文转载自:问我学院,问我社区
原文链接:http://www.wenwoha.com/blog_detail-680.html
- 点赞
- 收藏
- 关注作者
评论(0)