Graph-node:创建一个新的subgraph

这篇具有很好参考价值的文章主要介绍了Graph-node:创建一个新的subgraph。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Graph-node:创建一个新的subgraph

1. 合约源码(以TetherToken为例)

TetherToken

2. 开发子图

​ 作为子图开发人员,您可以定义 The Graph 正在索引哪些区块链数据以及如何存储这些数据。以下是子图定义包含的三个文件:

  • subgraph.yaml:存储子图清单的中央 YAML 文件。
  • schema.graphql:定义存储哪些数据以及如何通过 GraphQL 查询数据。
  • AssemblyScript Mappings:用于将区块链事件数据转换为开发人员模式定义的实体(在本教程中为 mapping.ts)

2.1 创建子图

2.1.1 从现有合约创建子图

​ 您可以使用现有的智能合约来引导您的新子图。如果您已经将智能合约部署到以太坊或测试网,请按照说明的这一部分进行操作。

​ 首先,我们将创建一个子图,用于索引现有智能合约的所有事件。子图将尝试从 Etherscan 获取合约 ABI。如果不成功,它将退回到请求本地文件路径。如果缺少任何可选参数,交互式表单将指导您完成整个过程。

graph init \
  --from-contract <CONTRACT_ADDRESS> \
  [--network <ETHEREUM_NETWORK>] \
  [--abi <FILE>] \
  <GITHUB_USER>/<SUBGRAPH_NAME> [<DIRECTORY>]
  • GITHUB_USER:您的组织或 GitHub 用户的名称
  • SUBGRAPH_NAME: 你想给你的子图起的名字
  • DIRECTORY:(可选)- 定义graph init存储子图清单的目录。

​ 示例:

graph init \
  --from-contract 0xdAC17F958D2ee523a2206206994597C13D831ec7 \
  --network mainnet \
  --abi TetherToken.json \
  github_user/subgraph

​ 按照下图所示的选项回车即可

graph-node,The Graph,区块链

​ 生成的子图文件目录如下。其中,network.jstsconfig.json暂时用不到可以删除。

graph-node,The Graph,区块链

​ 将package.json中的内容替换为:

{
  "name": "example",
  "version": "0.1.0",
  "repository": "xxx",
  "license": "MIT",
  "scripts": {
    "build-contract": "solc contracts/TetherToken.sol --abi -o abis --overwrite && solc contracts/TetherToken.sol --bin -o bin --overwrite",
    "create": "graph create example --node https://api.thegraph.com/deploy/",
    "create-local": "graph create example --node http://127.0.0.1:8020",
    "codegen": "graph codegen",
    "build": "graph build",
    "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/",
    "deploy-local": "graph deploy example --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020"
  },
  "devDependencies": {
    "@graphprotocol/graph-cli": "^0.30.2",
    "@graphprotocol/graph-ts": "^0.27.0"
  },
  "dependencies": {
    "babel-polyfill": "^6.26.0",
    "babel-register": "^6.26.0",
    "truffle": "^5.0.4",
    "truffle-contract": "^4.0.5",
    "truffle-hdwallet-provider": "^1.0.4"
  }
}
2.1.2 使用示例子图创建子图
graph init --from-example graphprotocol/example-subgraph

2.2 创建合约

​ 初始化合约项目

cd subgraph
truffle init

graph-node,The Graph,区块链

​ 将TetherToken.sol文件复制进contracts文件夹,由于该合约使用的sloc version是0.4.17,因此Migrations.sol与truffle-config.js中的version需要相对应修改

graph-node,The Graph,区块链

​ 顺便,还需要在truffle-config.js中进行网络配置,将networks作如下修改(注意端口号):

  networks: {
    development: {
      host: '127.0.0.1',
      port: 7545,
      network_id: '*',
    },
    ropsten: {
      provider: function() {
        return new HDWalletProvider(
          process.env.MNEMONIC,
          `https://ropsten.infura.io/v3/${process.env.ROPSTEN_INFURA_API_KEY}`
        )
      },
      network_id: '3',
    },
  }

​ 在migrations文件夹中新建2_deploy_contract.js文件,输入如下内容:

const TetherToken = artifacts.require('./TetherToken.sol')

module.exports = async function(deployer) {
  // 创建一个新的token
  await deployer.deploy(TetherToken,'100','TokenName','TokenSymbol','5')
}

2.3 创建子图清单(subgraph.yaml)

specVersion: 0.0.4
description: TetherToken for Ethereum
repository: xxx
schema:
  file: ./schema.graphql
dataSources:
  - kind: ethereum/contract
    name: TetherToken
    network: mainnet
    source:
      address: '0x5630081330A00a85833Af27D1e7bD015fe2FF05b'
      abi: TetherToken
    mapping:
      kind: ethereum/events
      apiVersion: 0.0.5
      language: wasm/assemblyscript
      entities:
        - Token
        - Transfer
      abis:
        - name: TetherToken
          file: ./abis/TetherToken.json
      eventHandlers:
        - event: NewTetherToken(uint256,string,string,uint256)
          handler: handleNewTetherToken
        - event: TetherTokenTransfer(address,uint256)
          handler: handleTransfer
      file: ./src/mapping.ts
  • dataSources.source.address为合约地址,truffle migrate后用2_deploy_contract的合约地址替换
  • dataSources.source.abidataSources>abis>name的value需要对应
  • dataSources.mapping.entities:此条目定义数据源将哪些实体写入存储。schema.graphql定义每个实体的架构。
  • dataSources.mapping.eventHandlers:使用此条目来定义您的子图响应的智能合约事件。这也是您在映射中定义处理程序的地方,这些处理程序将智能合约事件转换为商店中的实体。在我们的示例案例中,这是./src/mapping.ts.

​ 接下来对子图清单中的几个属性作具体介绍:

2.3.1 eventHandlers

NewTetherTokenTetherTokenTransfer为合约调用过程中吐出的事件,本项目的子图将对这两个事件进行监听与解析,在TetherToken.sol中的定义如下:

// Called if new token is created
event NewTetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals);

// Called if new Transfer is created
event TetherTokenTransfer(address _to, uint _value);

​ 在TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals)方法中吐出事件NewTetherToken

graph-node,The Graph,区块链

​ 在transfer(address _to, uint _value)方法中吐出事件TetherTokenTransfer

graph-node,The Graph,区块链

2.3.2 entities

entities中的TokenTransfer是对上述两个事件进行解析之后生成的实体,将在之后的章节中做更加具体的介绍,这里可以先忽略。

2.4 定义实体(schema.graphql)

type Token @entity {
  id: ID!
  symbol: String!
}

type Transfer @entity {
  id: ID!
  value: String!
}
2.4.1 内置标量类型
类型 含义
Bytes 字节数组,表示为十六进制字符串。通常用于以太坊哈希和地址。
ID 存储为字符串。
String 字符串值的标量。不支持空字符并自动删除。
Boolean 布尔值的标量。
Int GraphQL 规范将 Int 定义为 32 字节的大小。
BigInt GraphQL 规范将 Int 定义为 32 字节的大小。
BigDecimal BigDecimal 高精度小数表示为有效数和指数。指数范围是 -6143 到 +6144。四舍五入到 34 位有效数字。

2.5 安装依赖

​ 运行yarn添加合约所需要的依赖

// yarn install速度慢的话可以修改源
// yarn config set registry 'https://registry.npm.taobao.org'
yarn

​ 然后运行

yarn codegen

​ 然后运行truffle compile编译合约,将生成的json文件拷贝放进abis文件夹下,并且删除abis中原来的.json

truffle compile

2.6 编写映射

// event
import { NewTetherToken, TetherTokenTransfer} from '../generated/TetherToken/TetherToken'
// entity
import { Token, Transfer} from '../generated/schema'

export function handleNewTetherToken(event: NewTetherToken): void {
  let token = new Token(event.params._name)
  token.symbol = event.params._symbol
  token.save()
}

export function handleTransfer(event: TetherTokenTransfer): void {
  let transfer = new Transfer(event.params._to.toString());
  transfer.value = event.params._value.toString()
  transfer.save()
}

handleNewTetherToken:当合约调用过程中吐出NewTetherToken事件,子图会调用handleNewTetherToken方法将生成的token以Token实体的方式存储下来。

handleTransfer:当调用TetherToken合约中的转账函数是,会吐出相对应的TetherTokenTransfer事件,子图监听到事件之后调用handleTransfer方法,将转账信息存储在Transfer实体中。

2.7 运行

见(43条消息) Graph-node:部署及测试_我不想头秃阿的博客-CSDN博客_graphnode文章来源地址https://www.toymoban.com/news/detail-783645.html

到了这里,关于Graph-node:创建一个新的subgraph的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git基于原有的分支拉取(创建)一个新的分支

    git checkout -b newbranch origin/oldbranchname newbranch:你要创建的分支的名子 oldbranchname:原来的分支(你要基于的分支) git push --set-upstream origin newbranch newbranch:你刚刚创建的新分支的名字 git push origin newbranch 或者直接 git push newbranch:你刚刚创建的新分支的名字

    2024年02月15日
    浏览(52)
  • 用OpenCV实现创建一个新的图像并排显示左右两个输入图像

    创建一个并排显示左右两个输入图像程序的关键在于正确地使用 OpenCV 的 cv::Mat 类和图像处理函数。 下面是一个简单的示例代码,展示了如何实现这个功能。 这段代码假设你已经有了两个图像文件(左图和右图),并将它们并排显示在一个窗口中。 请确保在您的系统上安装

    2024年01月18日
    浏览(53)
  • 下载好了annaconda,但是在创建一个新的Conda虚拟环境报错

    问题描述: ProxyError(MaxRetryError(“HTTPSConnectionPool(host=‘repo.anaconda.com’, port=443): Max retries exceeded with url: /pkgs/pro/win-64/repodata.json.bz2 (Caused by ProxyError(‘Cannot connect to proxy.’, NewConnectionError(‘urllib3.connection.VerifiedHTTPSConnection object at 0x000001D7D7A02208: Failed to establish a new connection: [W

    2024年04月14日
    浏览(45)
  • 【从零开始学Django篇001】从创建一个新的Django项目开始

    👑 作 者 主 页 :👉 CSDN 丨 博客园 🏆 学 习 交 流: 👉 在下周周ovoの社区 💎 从零开始 学Django 系列专栏: 👉Django系列专栏 ​ 在这个专栏,大概会从零开始了解到大部分的Django知识点。比如说 Django模板语言,路由系统,视图系统,中间件,AJAX,浏览器的同源策略及使

    2024年02月08日
    浏览(74)
  • 用git在本地仓库创建一个新的分支,并且将当前分支切换到新创建的分支上

    1 用下面的命令创建本地仓库的新分支 2 用下面的命令将当前分支切换到新创建的分支上  注意:下面的chatGPT说的是错的,正确的命令是git checkout -b  3 可以用简写的方式,可以同时实现创建本地分支和切换到新创建的分支上

    2024年02月09日
    浏览(64)
  • 【Shell 命令集合 系统管理 】Linux 创建一个新的用户组 groupadd 命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 groupadd命令用于在Linux系统中创建一个新的用户组。它可以创建一个本地用户组,也可以创建一个系统用户组。 创建一个用户组可以帮助管理员更好地管理用户和文件的权限。用户组可以将一组用户组织在一起,并为他们提供共享的权限设

    2024年02月03日
    浏览(70)
  • android studio创建一个新的项目为什么默认是kotlin语言而选择不了java语言

    关于android studio语言选择的问题。 我在进入android studio为什么创建一个新项目之后选择不了java语言有什么办法可以解决。 解决办法:这个模式下选着一个Empty Activity模块就可以使用java语言。 这对于刚刚接触anaroid studio新手比较管用。  

    2024年02月11日
    浏览(57)
  • node.js 简单实验 创建一个简单的web服务

    概要:用一个最简单是例子感受一下node.js 的能力 1.代码 2.运行结果 2.1 node t.js 1.2 http://127.0.0.1:8081       

    2024年02月11日
    浏览(69)
  • (十一)地理数据库创建——创建新的地理数据库

    地理数据库(Geodatabase)是按照层次型的数据对象来组织地理数据,这些数据对象包括对象类(Object Classes)、要素类(Feature Classes)和要素数据集(Feature dataset)。 对象类是指存储非空间数据的表格 (Table)。 要素类是具有相同几何类型和属性的要素的集合,即同类空间要素

    2024年02月05日
    浏览(29)
  • git 如何创建新的远程分支,并将本地代码 push 到新的分支

    1、可以通过git branch -r 命令查看远端库的分支情况 2、从已有的分支创建新的分支(如从master分支),创建一个 duanjiwang 分支 但此时并没有在远程仓库上创建分支 如图所示 还是只有一个 master 分支 3、建立本地到远端仓库的链接 --这样代码才能提交上去 使用命令行 4、git 强制提交

    2024年02月12日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包