当前位置:网站首页>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 运行
边栏推荐
猜你喜欢

V8中的快慢数组(附源码、图文更易理解)

CAS: 178744-28-0, mPEG-DSPE, DSPE-mPEG, methoxy-polyethylene glycol-phosphatidylethanolamine supply

【MySQL —— 索引】

First domestic open source framework 】 【 general cloud computing framework, any program can be made into cloud computing.

Prometheus监控Harbor(二进制版)

FinClip,助长智能电视更多想象空间

What is the difference between the generator version and the viewer version?

Click the icon in Canvas App to generate PDF and save it to Dataverse

Creo 9.0二维草图的诊断:加亮开放端点

密码学基础以及完整加密通讯过程解析
随机推荐
OpenCV 图像拼接
[2022安恒夏令营] 5个小题
End-to-End Lane Marker Detection via Row-wise Classification
The "interaction design" battle of the smart cockpit
OPC UA 与IEC61499 深度融合(1)
Pytest学习-setup/teardown
详谈RDMA技术原理和三种实现方式
P1996 约瑟夫问题
In V8 how arrays (with source code, picture and text easier to understand)
初始 List 接口
libnet
JS get parameter value of URL hyperlink
Interpretation of ML: A case of global interpretation/local interpretation of EBC model interpretability based on titanic titanic rescued binary prediction data set using interpret
2022/8/3 考试总结
Scala基础【正则表达式、框架式开发原则】
CAS: 178744-28-0, mPEG-DSPE, DSPE-mPEG, methoxy-polyethylene glycol-phosphatidylethanolamine supply
Pytest learn-setup/teardown
Shell编程之循环语句与函数
What is memoization and what is it good for?
超级完美版布局有快捷键,有背景置换