TetherToken
作为子图开发人员,您可以定义 The Graph 正在索引哪些区块链数据以及如何存储这些数据。以下是子图定义包含的三个文件:
subgraph.yaml
:存储子图清单的中央 YAML 文件。schema.graphql
:定义存储哪些数据以及如何通过 GraphQL 查询数据。AssemblyScript Mappings
:用于将区块链事件数据转换为开发人员模式定义的实体(在本教程中为 mapping.ts) 您可以使用现有的智能合约来引导您的新子图。如果您已经将智能合约部署到以太坊或测试网,请按照说明的这一部分进行操作。
首先,我们将创建一个子图,用于索引现有智能合约的所有事件。子图将尝试从 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
按照下图所示的选项回车即可
生成的子图文件目录如下。其中,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"
}
}
graph init --from-example graphprotocol/example-subgraph
初始化合约项目
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')
}
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
. 接下来对子图清单中的几个属性作具体介绍:
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
entities
中的Token
、Transfer
是对上述两个事件进行解析之后生成的实体,将在之后的章节中做更加具体的介绍,这里可以先忽略。
type Token @entity {
id: ID!
symbol: String!
}
type Transfer @entity {
id: ID!
value: String!
}
类型 | 含义 |
---|---|
Bytes | 字节数组,表示为十六进制字符串。通常用于以太坊哈希和地址。 |
ID | 存储为字符串。 |
String | 字符串值的标量。不支持空字符并自动删除。 |
Boolean | 布尔值的标量。 |
Int | GraphQL 规范将 Int 定义为 32 字节的大小。 |
BigInt | GraphQL 规范将 Int 定义为 32 字节的大小。 |
BigDecimal | BigDecimal 高精度小数表示为有效数和指数。指数范围是 -6143 到 +6144。四舍五入到 34 位有效数字。 |
运行yarn
添加合约所需要的依赖
// yarn install速度慢的话可以修改源
// yarn config set registry 'https://registry.npm.taobao.org'
yarn
然后运行
yarn codegen
然后运行truffle compile
编译合约,将生成的json文件拷贝放进abis文件夹下,并且删除abis中原来的.json
truffle compile
// 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
实体中。
见(43条消息) Graph-node:部署及测试_我不想头秃阿的博客-CSDN博客_graphnode