当前位置:网站首页>Graph-node:创建一个新的subgraph
Graph-node:创建一个新的subgraph
2022-08-03 23:33:00 【我不想头秃阿】
Graph-node:创建一个新的subgraph
1. 合约源码(以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.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文件复制进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.abi
与dataSources>abis>name
的value需要对应dataSources.mapping.entities
:此条目定义数据源将哪些实体写入存储。schema.graphql
定义每个实体的架构。dataSources.mapping.eventHandlers
:使用此条目来定义您的子图响应的智能合约事件。这也是您在映射中定义处理程序的地方,这些处理程序将智能合约事件转换为商店中的实体。在我们的示例案例中,这是./src/mapping.ts
.
接下来对子图清单中的几个属性作具体介绍:
2.3.1 eventHandlers
NewTetherToken
与TetherTokenTransfer
为合约调用过程中吐出的事件,本项目的子图将对这两个事件进行监听与解析,在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
中的Token
、Transfer
是对上述两个事件进行解析之后生成的实体,将在之后的章节中做更加具体的介绍,这里可以先忽略。
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 运行
边栏推荐
- The Chinese Valentine's Day event is romantically launched, don't let the Internet slow down and miss the dark time
- 【论文阅读】TRO 2021: Fail-Safe Motion Planning for Online Verification of Autonomous Vehicles Using Conve
- 超级完美版布局有快捷键,有背景置换(解决opencv 中文路径问题)
- 2022/8/3 考试总结
- Cloud platform construction solutions
- In V8 how arrays (with source code, picture and text easier to understand)
- 密码学基础以及完整加密通讯过程解析
- Take an example of a web worker
- rsync 基础用法
- MCS-51单片机,定时1分钟,汇编程序
猜你喜欢
Binary search tree to solve the fallen leaves problem
What is the difference between the generator version and the viewer version?
redis持久化方式
Jmeter-断言
禾匠编译错误记录
Scala基础【正则表达式、框架式开发原则】
rosbridge-WSL2 && carla-win11
用两个栈模拟队列
ML之interpret:基于titanic泰坦尼克是否获救二分类预测数据集利用interpret实现EBC模型可解释性之全局解释/局部解释案例
【深度学习】基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)
随机推荐
Creo 9.0二维草图的诊断:加亮开放端点
RSS订阅微信公众号初探-feed43
What is the difference between the generator version and the viewer version?
ML之interpret:基于titanic泰坦尼克是否获救二分类预测数据集利用interpret实现EBC模型可解释性之全局解释/局部解释案例
Internship: Upload method for writing excel sheet (import)
Kotlin - 扩展函数和运算符重载
End-to-End Lane Marker Detection via Row-wise Classification
Creo9.0 绘制中心线
【LeetCode】最长公共子序列(动态规划)
汉字风格迁移---结合本地和全局特征学习的中文字体迁移
软件测试内卷严重,如何提升自己的竞争力呢?
Three.js入门详解
禾匠编译错误记录
Super perfect version of the layout have shortcut, background replacement (solve the problem of opencv Chinese path)
Deep integration of OPC UA and IEC61499 (1)
Testng listener
【MySQL —— 索引】
【OpenCV图像处理】 图像拼接技术
SPOJ 2774 Longest Common Substring(两串求公共子串 SAM)
用栈实现队列