更新文档

This commit is contained in:
CounterFire2023 2023-06-30 16:07:36 +08:00
parent 9e633c3440
commit 9a675dd663
2 changed files with 66 additions and 38 deletions

View File

@ -1,5 +1,65 @@
# 链相关的 GraphQL API # 说明
该项目包含 2 部分功能, 链上事件爬取和链上数据查询接口(GraphQL 和普通接口)
# 一. 链上数据查询
## 1. 验证地址是否是指定 NFT 的 holder ## 1. 验证地址是否是指定 NFT 的 holder
> 供 galxe.com 的任务系统使用 > 供 galxe.com 的任务系统使用
```
endpoint: https://chianquery.cebggame.com/graphql
网页访问: https://chianquery.cebggame.com/graphiql
```
## 2. 普通接口
### 1. 检查用户是否有已 claim NFT
1. Method: POST|GET
2. URI: /chain/query_info
3. HOST: https://chianquery.cebggame.com
> 参数, body(json, x-www-form-urlencoded) 或 querystring 都可
| 字段 | 说明 |
| --------- | --------------------- |
| \*address | 用户钱包地址 |
| contract | ClaimFactory 合约地址 |
3. Response: JSON
```json
{
"errcode": 1, // 此字段只有在出错时才会有
"errmsg": "error", // 此字段只有在出错时才会有
"id": 0
}
```
# 二. 链上事件爬取
## 说明
NFT 和 FT 的`Transfer`事件分布记录在 src/models/FtTransfer.ts 和 src/models/NftTransfer.ts 中
NFT 事件记录后, 更新 NftHolder 表, 该表记录最新的 Nft 持有情况
其他事件记录在 src/models/UniversalEvent.ts 中
## 配置
需要爬取的事件在 src/config/events.json 中配置
```js
;[
{
address: '0x3F13F83E6363D97d0353cAAfACA08B05D9BF3637', // 合约地址
chain: 42161, // 链 id
event: 'Transfer', // 事件名
abi: 'ERC721', // 合约使用的abi, 在src/abis中定义, 这里取文件名
fromBlock: 105016690, // 开始块高
eventProcesser: 'NftTransferEvent', // 事件处理器
},
]
```

View File

@ -1,47 +1,15 @@
import BaseController from 'common/base.controller' import BaseController from 'common/base.controller'
import { role, router } from 'decorators/router' import { role, router } from 'decorators/router'
import { ChainTask, ChainTaskClass } from 'models/ChainTask'
import { RequestTask } from 'models/RequestTask'
import { ChainQueue } from 'queue/chain.queue'
import { DocumentType } from '@typegoose/typegoose'
import { BlockChain } from 'chain/BlockChain' import { BlockChain } from 'chain/BlockChain'
import { ZError } from 'common/ZError' import { ZError } from 'common/ZError'
import { RedisClient } from 'redis/RedisClient' import { RedisClient } from 'redis/RedisClient'
class ChainController extends BaseController { class ChainController extends BaseController {
// @role('anon') /**
// @router('post /chain/req') * , claim NFT
// async addChainRequest(req, res) { * tokenId
// // data是一个数组!! * , 0
// const { data, source, cb, taskId, force, max } = req.params */
// console.log(`income chain request:: taskId: ${taskId}, source: ${source}, cb: ${cb}`)
// console.log(JSON.stringify(data))
// let maxTryCount = max !== undefined ? parseInt(max) : parseInt(process.env.CHAIN_MAX_TRY)
// let chainTask: DocumentType<ChainTaskClass> = await ChainTask.insertOrUpdate(
// { taskId },
// { source, taskData: data, cb },
// )
// if ((!chainTask.newRecord && force) || chainTask.newRecord) {
// for (let sub of data) {
// let subType = sub.type
// let subTask = new RequestTask({
// taskId,
// chainTaskId: chainTask.id,
// taskType: subType,
// reqData: sub,
// maxTryCount,
// })
// await subTask.save()
// chainTask.tasks.pushOnce(subTask.id)
// new ChainQueue().addTaskToQueue(subTask)
// }
// }
// chainTask.newRecord = false
// await chainTask.save()
// return chainTask.toJson()
// }
@role('anon') @role('anon')
@router('post /chain/query_info') @router('post /chain/query_info')
@router('get /chain/query_info') @router('get /chain/query_info')