グラフノード: 新しいサブグラフを作成します
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 migrate
2_deploy_contract のコントラクト アドレスに置き換えます。dataSources.source.abi
dataSources>abis>name
値に対応する必要があります。dataSources.mapping.entities
: このエントリは、データ ソースがストレージに書き込むエンティティを定義します。schema.graphql
各エンティティのスキーマを定義します。dataSources.mapping.eventHandlers
: このエントリを使用して、サブグラフが応答するスマート コントラクト イベントを定義します。これは、スマート コントラクト イベントをストア内のエンティティに変換するマップ内のハンドラーを定義する場所でもあります。この例では、これは./src/mapping.ts
.
次に、サブグラフ リストのいくつかの属性について詳しく説明します。
2.3.1 イベントハンドラ
コントラクト呼び出し中にイベントが吐き出されると、このプロジェクトのサブグラフは、次のように TetherToken.sol で定義されているこれら 2 つのイベントを監視および分析しますNewTetherToken
。TetherTokenTransfer
// 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 つのイベントを解析した後に生成されるエンティティToken
はTransfer
、次の章でより具体的に紹介され、ここでは無視できます。
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
エンティティに格納します。