Graph-node:创建一个新的subgraph

2023-11-14

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

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

在这里插入图片描述

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

在这里插入图片描述

​ 将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

在这里插入图片描述

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

在这里插入图片描述

​ 顺便,还需要在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

在这里插入图片描述

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

在这里插入图片描述

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Graph-node:创建一个新的subgraph 的相关文章

  • VC++ Gdiplus::Bitmap抠图

    void SetBackgroundMaskImage LPCTSTR lpszImageName COLORREF crAlpha RGB 255 0 0 Gdiplus Bitmap pBkgrMaskBitmap CImageFact
  • MYSQL中mysql数据库的用户表User表

    前言 新建MySQL时 会自动安装一个mysql的数据库 该数据库下面的表都是权限表 其中 user表是最重要权限表 记录了允许连接到服务器的账号信息以及一些全局权限信息 user表有42个字段 大致分为4类 用户列 权限列 安全列及资源控
  • Git安装与卸载

    Git下载 官网 https git scm com downloads 点击官网链接 跳转到官网 选择对应操作系统 根据操作系统位数选择相应版本下载安装包 淘宝镜像 http npm taobao org mirrors git for
  • 编译原理绪论

    1 美图 5 编译过程一语法分析 任务 在词法分析的基础上 根据语言的语法规则把单词符号串分解成各类语法单位 语法范畴 依循的原则 语法规则 描述工具 上下文无关文法 6 编译过程一中间代码产生 任务 对各类不同语法范畴按语言的语义进行初步

随机推荐

  • 自学黑客必读的15本书,少1本都算不上真正的超级黑客

    前言 网络安全和黑客技能紧密相连 想要有效地防范黑客攻击 了解黑客的技能和思维方式非常重要 而要想成为一名合格的白帽黑客 也需要深入理解网络安全的基本原理和最佳实践 本文将介绍15本网络安全和黑客书籍 既包括了防范黑客攻击的指南书籍 也包括
  • 天梯赛 L1-046 整除光棍(除法原理)

    这里所谓的 光棍 并不是指单身汪啦 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一定是奇数并且不以5
  • java基本类型知识点

    java基本类型 java虽然是纯面向对象的语言 但为了方便也设置了八中基本类型 它们是 类型 标识 字节数 引用类型写法 字段类型 byte 1字节 引用类型是Byte 短整型 short 2字节 引用类型是Short 整型 int 4字
  • 使用SSH与github远程服务器进行无密码连接

    在git操作窗口中运行 ssh keygen t rsa 一直回车连接 然后到 ssh目录下看到两个文件 用sublime打开这个文件如图 复制里面的密钥 打开自己的github主页 点击自己的头像下的setting看到ssh那里 创建ss
  • Matlab机器人工具箱Robotics ToolBox --rvctools安装 图文详解(附rvctools工具箱资源)

    rvctools工具箱资源地址分享 链接 https pan baidu com s 1DqeCwS0F P2DgQJQeL9boA 提取码 lmgp 首先找到你的Matlab安装位置 找到toolbox文件夹 例如我的位置是D Progr
  • Linux下使用QSharedMemory异常退出时共享内存未释放解决办法

    首先看一下QSharedMemory在不同平台下的差异问题 详细描述 QSharedMemory 类提供了对一段共享内存的访问 译注 一段共享内存 在后续译文中也译为 共享内存段 QSharedMemory 提供了被多线程和多进程共享的一段
  • OCaml 安装以及简单的加减乘除Demo(以Ubuntu16.04为例)

    安装nix 参考 https mirrors tuna tsinghua edu cn help nix 安装nix sh lt curl https mirrors tuna tsinghua edu cn nix latest inst
  • 100 个网络基础知识

    1 什么是链接 链接是指两个设备之间的连接 它包括用于一个设备能够与另一个设备通信的电缆类型和协议 2 OSI 参考模型的层次是什么 有 7 个 OSI 层 物理层 数据链路层 网络层 传输层 会话层 表示层和应用层 3 什么是骨干网 骨干
  • c语言从键盘输入一个3*3矩阵,并分别求主对角线和副对角线

    c语言从键盘输入一个3 3矩阵 并分别求主对角线和副对角线 include
  • Java Conversion from String to bytes is not one-one?

    在工作中遇到了标题所述的问题 当一个字节数组编码成字符串后再获得字符串的字节数组 发现会和一开始的字节序列不同 上网查询了一番 发现Stack Overflow上有同样的问题 现在就来分析一下为什么会出现这种情况 byte bytes1 1
  • int与char之间的相互转换(c/c++)

    int 转换为char 0 即可 int a 5 char b a 0 注意 1 这里的b得到的字符型的5 2 由于char只有一个字节的空间 所以int只能是0 9之间的数 char 转换为int 0 即可 char a 5 int b
  • HSV介绍二:HSV颜色识别-HSV基本颜色分量范围

    一般对颜色空间的图像进行有效处理都是在HSV空间进行的 然后对于基本色中对应的HSV分量需要给定一个严格的范围 下面是通过实验计算的模糊范围 准确的范围在网上都没有给出 H 0 180 S 0 255 V 0 255 此处把部分红色归为紫色
  • 服务器电脑的作用,什么是wins服务器及其作用 -电脑资料

    问 什么是 WINS服务器 有什么作用 答 WINS Windows Internet Name Service 服务器主要用于NetBIOS名字服务 它处理的是NetBIOS计算机名 Computer Name 所以也被称为NetBIOS
  • vue3 mitt路由跳转后 on事件获取不到值的奇葩问题解决

    vue3不再支持大家试用this 那原型链这种东西自然是要命了 好在我们还有第三方插件mitt 但这东西是真的坑啊 比如我们定义 EventBus emit 然后马上进行路由跳转 EventBus emit datas Acquis rou
  • 苹果手表测心电的原理

    苹果手表 Apple Watch 测心电的原理是通过一种称为光电容积脉搏波法 photoplethysmography PPG 的技术来实现的 此外 它还使用了一种名为电极传感器的功能来检测心电图 ECG 信号 以下是苹果手表测量心电和心率
  • 加速AndroidStudio的编译和卡顿等待说拜拜!

    Android studio 2 2 当中有一项新的功能 Dex In Process 这项功能可以动态的加快编译速度 以及提高Instant Run 的效率 那么怎么来使用这项新功能呢 你只需要修改 gradle properties 这
  • Android 进程保活招式大全

    https mp weixin qq com s biz MzA3NTYzODYzMg mid 2653577617 idx 1 sn 623256a2ff94641036a6c9eea17baab8
  • Android开发网上的一些重要知识点

    1 android单实例运行方法 我们都知道Android平台没有任务管理器 而内部App维护 者一个Activity history stack来实现窗口显示和销毁 对于常规从快捷方式运行来看都是startActivity可能会使用FLA
  • SonarQube 04 SonarScanner的使用 Web Go项目扫描

    Web前端项目扫描 root jenkins master devops web service master ls build index html Jenkinsfile1 package lock json src config Je
  • Graph-node:创建一个新的subgraph

    Graph node 创建一个新的subgraph 1 合约源码 以TetherToken为例 TetherToken 2 开发子图 作为子图开发人员 您可以定义 The Graph 正在索引哪些区块链数据以及如何存储这些数据 以下是子图定