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

​ 示例:

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

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

Graph-node:创建一个新的subgraph_第1张图片

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

Graph-node:创建一个新的subgraph_第2张图片

​ 将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:创建一个新的subgraph_第3张图片

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

Graph-node:创建一个新的subgraph_第4张图片

​ 顺便,还需要在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:创建一个新的subgraph_第5张图片

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

Graph-node:创建一个新的subgraph_第6张图片

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

你可能感兴趣的:(The,Graph,区块链)