グラフノード: 新しいサブグラフを作成します

グラフノード: 新しいサブグラフを作成します

1. コントラクトのソースコード (例として TetherToken を取り上げます)

テザートークン

2. サブグラフを作成する

サブグラフ開発者として、グラフがインデックスを作成するブロックチェーン データとその保存方法を定義します。サブグラフ定義に含まれる 3 つのファイルを次に示します。

  • subgraph.yaml:サブグラフのリストを格納する中央の YAML ファイル。
  • schema.graphql: 保存するデータと、GraphQL を介してクエリを実行する方法を定義します。
  • AssemblyScript Mappings: ブロックチェーン イベント データを開発者スキーマで定義されたエンティティに変換するために使用されます (このチュートリアルでは mapping.ts)。

2.1 サブグラフの作成

2.1.1 既存のコントラクトからサブグラフを作成する

既存のスマート コントラクトを使用して、新しいサブグラフをブートストラップできます。すでにスマート コントラクトを Ethereum またはテストネットにデプロイしている場合は、手順のこの部分に従ってください。

まず、既存のスマート コントラクトのすべてのイベントをインデックス化するサブグラフを作成します。サブグラフは、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

下の図に示すオプションに従って Enter キーを押します

ここに画像の説明を挿入

生成されるサブマップファイルのディレクトリは以下の通りです。このうち、 はnetwork.js一時tsconfig.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 ファイルを contract フォルダーにコピーします。このコントラクトで使用される sloc バージョンは 0.4.17 であるため、それに応じて Migrations.sol および truffle-config.js のバージョンを変更する必要があります。

ここに画像の説明を挿入

ちなみに、truffle-config.js でネットワークを構成し、次のようにネットワークを変更する必要もあります (ポート番号に注意してください)。

  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',
    },
  }

移行フォルダーに新しい 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 migrate2_deploy_contract のコントラクト アドレスに置き換えます。
  • dataSources.source.abidataSources>abis>nameに対応する必要があります。
  • dataSources.mapping.entities: このエントリは、データ ソースがストレージに書き込むエンティティを定義します。schema.graphql各エンティティのスキーマを定義します。
  • dataSources.mapping.eventHandlers: このエントリを使用して、サブグラフが応答するスマート コントラクト イベントを定義します。これは、スマート コントラクト イベントをストア内のエンティティに変換するマップ内のハンドラーを定義する場所でもあります。この例では、これは./src/mapping.ts.

次に、サブグラフ リストのいくつかの属性について詳しく説明します。

2.3.1 イベントハンドラ

コントラクト呼び出し中にイベントが吐き出されると、このプロジェクトのサブグラフは、次のように TetherToken.sol で定義されているこれら 2 つのイベントを監視および分析しますNewTetherTokenTetherTokenTransfer

// 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上記の 2 つのイベントを解析した後に生成されるエンティティTokenTransfer、次の章でより具体的に紹介され、ここでは無視できます。

2.4 エンティティの定義 (schema.graphql)

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

type Transfer @entity {
  id: ID!
  value: String!
}

2.4.1 組み込みスカラー型

タイプ 意味
バイト 16 進文字列として表されるバイト配列。通常、イーサリアムのハッシュとアドレスに使用されます。
ID 文字列として格納されます。
文字列値のスカラー。ヌル文字はサポートされておらず、自動的に削除されます。
ブール値 ブール値のスカラー。
整数 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格納するメソッドを呼び出します。

handleTransfer:TetherTokenコントラクト内の転送関数が呼び出されると、対応するTetherTokenTransferイベントが吐き出され、サブグラフはhandleTransferイベントをリッスンした後にメソッドを呼び出し、転送情報をTransferエンティティに格納します。

2.7ラン

参照(43 メッセージ) グラフノード: 展開とテスト_ハゲたくないブログ-CSDN blog_graphnode

おすすめ

転載: blog.csdn.net/cacique111/article/details/126146779