python编程示例系列
python编程示例系列二
python的Web神器Streamlit
如何应聘高薪职位
C#视觉应用开发问题系列
c#串口应用开发问题系列
microPython Python最小内核源码解析
NI-motion运动控制c语言示例代码解析
在这里插入图片描述# 区块链子图技术 (Subgraph) 详解

用途与原理

区块链子图技术(Subgraph)是一种用于索引和查询区块链数据的技术,主要由 The Graph 协议实现。在虚拟币和区块链生态系统中,子图技术解决了以下问题:

  1. 数据可访问性:区块链上的原始数据难以直接查询和分析
  2. 数据组织:将链上分散的数据以结构化方式组织
  3. 高效查询:提供快速、高效的 API 接口访问区块链数据

子图的工作原理是:

  • 定义要索引的区块链数据(智能合约、事件等)
  • 编写处理程序,将这些数据转换为结构化格式
  • 部署到 Graph 节点,持续监听区块链事件并更新索引
  • 通过 GraphQL API 提供查询服务

完整实现代码示例

下面是一个完整的以太坊 ERC-20 代币子图实现示例:

1. subgraph.yaml 配置文件

specVersion: 0.0.4
schema:
  file: ./schema.graphql
dataSources:
  - kind: ethereum
    name: ERC20Token
    network: mainnet
    source:
      address: "0x1234567890123456789012345678901234567890"  # 代币合约地址
      abi: ERC20
      startBlock: 12000000  # 开始索引的区块
    mapping:
      kind: ethereum/events
      apiVersion: 0.0.6
      language: wasm/assemblyscript
      entities:
        - Transfer
        - Account
      abis:
        - name: ERC20
          file: ./abis/ERC20.json
      eventHandlers:
        - event: Transfer(indexed address,indexed address,uint256)
          handler: handleTransfer
      file: ./src/mapping.ts

2. schema.graphql 数据模型定义

type Transfer @entity {
  id: ID!
  from: Account!
  to: Account!
  value: BigInt!
  timestamp: BigInt!
  block: BigInt!
  transactionHash: String!
}

type Account @entity {
  id: ID!
  balance: BigInt!
  transfersFrom: [Transfer!]! @derivedFrom(field: "from")
  transfersTo: [Transfer!]! @derivedFrom(field: "to")
  totalTransactions: BigInt!
}

type TokenStat @entity {
  id: ID!
  totalTransfers: BigInt!
  totalHolders: BigInt!
}

3. ERC20.json ABI 定义

[
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]

4. mapping.ts 处理程序

// 导入 Graph TS 相关库
import { BigInt, Address } from "@graphprotocol/graph-ts"
import {
  ERC20,
  Transfer as TransferEvent
} from "../generated/ERC20Token/ERC20"
import { Transfer, Account, TokenStat } from "../generated/schema"

// 处理 Transfer 事件的函数
export function handleTransfer(event: TransferEvent): void {
  // 获取交易的基本信息
  let transactionHash = event.transaction.hash.toHexString()
  let timestamp = event.block.timestamp
  let blockNumber = event.block.number
  
  // 创建唯一标识符
  let transferId = transactionHash + "-" + event.logIndex.toString()
  
  // 获取或创建发送方账户
  let fromAddress = event.params.from.toHexString()
  let fromAccount = Account.load(fromAddress)
  if (fromAccount == null) {
    fromAccount = new Account(fromAddress)
    fromAccount.balance = BigInt.fromI32(0)
    fromAccount.totalTransactions = BigInt.fromI32(0)
  }
  
  // 获取或创建接收方账户
  let toAddress = event.params.to.toHexString()
  let toAccount = Account.load(toAddress)
  if (toAccount == null) {
    toAccount = new Account(toAddress)
    toAccount.balance = BigInt.fromI32(0)
    toAccount.totalTransactions = BigInt.fromI32(0)
  }
  
  // 更新账户余额(调用合约查询实时余额)
  let contract = ERC20.bind(event.address)
  let fromBalance = contract.balanceOf(Address.fromString(fromAddress))
  let toBalance = contract.balanceOf(Address.fromString(toAddress))
  
  fromAccount.balance = fromBalance
  toAccount.balance = toBalance
  
  // 更新交易计数
  fromAccount.totalTransactions = fromAccount.totalTransactions.plus(BigInt.fromI32(1))
  toAccount.totalTransactions = toAccount.totalTransactions.plus(BigInt.fromI32(1))
  
  // 创建 Transfer 实体
  let transfer = new Transfer(transferId)
  transfer.from = fromAccount.id
  transfer.to = toAccount.id
  transfer.value = event.params.value
  transfer.timestamp = timestamp
  transfer.block = blockNumber
  transfer.transactionHash = transactionHash
  
  // 更新全局统计信息
  let stats = TokenStat.load("1")
  if (stats == null) {
    stats = new TokenStat("1")
    stats.totalTransfers = BigInt.fromI32(0)
    stats.totalHolders = BigInt.fromI32(0)
  }
  stats.totalTransfers = stats.totalTransfers.plus(BigInt.fromI32(1))
  
  // 如果是新持有者,更新持有者计数
  if (toAccount.balance > BigInt.fromI32(0) && toBalance == event.params.value) {
    stats.totalHolders = stats.totalHolders.plus(BigInt.fromI32(1))
  }
  
  // 如果发送方余额为0,减少持有者计数
  if (fromAccount.balance == BigInt.fromI32(0)) {
    stats.totalHolders = stats.totalHolders.minus(BigInt.fromI32(1))
  }
  
  // 保存所有实体
  fromAccount.save()
  toAccount.save()
  transfer.save()
  stats.save()
}

代码逻辑流程图

区块链事件触发
Graph 节点监听到 Transfer 事件
调用 handleTransfer 函数
创建交易唯一ID
获取/创建发送方账户
获取/创建接收方账户
查询发送方实时余额
查询接收方实时余额
更新发送方账户信息
更新接收方账户信息
创建 Transfer 实体
获取/创建全局统计信息
更新转账总数
检查并更新持有者数量
保存所有实体到数据库
GraphQL API 可查询更新后的数据

应用场景

子图技术在区块链和虚拟币领域有广泛的应用场景:

  1. DeFi 数据分析

    • 追踪 DEX 交易量和流动性
    • 监控借贷协议的健康度
    • 分析收益农场的收益率
  2. NFT 市场分析

    • 跟踪 NFT 交易历史和价格
    • 分析收藏品的稀有度和持有分布
    • 监控 NFT 市场趋势
  3. DAO 治理

    • 索引提案和投票数据
    • 分析治理代币的分布和使用
    • 跟踪社区参与度
  4. 钱包和资产管理

    • 提供用户资产历史和组合分析
    • 追踪交易历史和费用支出
    • 监控代币余额变化
  5. 区块链游戏

    • 索引游戏内资产和交易
    • 分析游戏经济和玩家行为
    • 提供游戏数据统计和排行榜
  6. 合规和税务报告

    • 生成交易历史报告
    • 计算盈亏和应税事件
    • 提供审计追踪

总结

区块链子图技术是连接区块链原始数据与应用程序的关键桥梁,它通过索引和组织链上数据,使开发者能够高效地查询和分析区块链信息。在虚拟币生态系统中,子图技术解决了数据可访问性、组织和查询效率的问题。

本文详细介绍了子图技术的用途和原理,并提供了一个完整的 ERC-20 代币子图实现示例,包括配置文件、数据模型、ABI 定义和处理程序代码。通过流程图展示了子图处理数据的逻辑流程,并探讨了该技术在 DeFi、NFT、DAO 治理等多个领域的应用场景。

随着区块链技术的不断发展,子图技术将继续发挥重要作用,为区块链数据的索引、查询和分析提供强大支持,促进更多创新应用的诞生。

车载系统软件工程师如何实现车载系统的人机界面(HMI)
量化交易系统中+如何处理系统故障和异常情况?
量化交易系统中如何处理测试中的数据偏差和异常?
c#视觉应用开发中如何在C#中进行医学图像处理?
如何应聘光伏方面高级软件工程师(年薪42-84万)
c#如何使用windows的挂钩技术
C#开发串口通讯软件如何如何捕获和处理串口通讯中的异常?
jupyter深度理解三 之nbformat
Python在科学数据可视化中的应用
python如何检测一篇文章是不是由chatGPT生成的
车载系统软件工程师如何实现车载系统的实时交通管理
OpenAI ChatGPT 可用的第三方插件可能成为威胁行为者寻求未经授权访问敏感数据的新攻击面
microPython的源码解析之 objfun.c
python 如何把多个列表合成一个
C#进行串口应用开发如何实现串口数据的校验
c#视觉应用开发中如何在C#中进行图像直方图均衡化?
python用于解析复杂文本数据的库Ply
C#进行串口应用开发如何通过串口实现转换器、中继器的串口扩展
python 的pytorch库介绍
如何使用Python开发一个度假租赁市场平台。
C# 如何利用GPU进行加速计算
NI-Motion在运动控制器上配置和使用缓冲区来捕获特定轴的高速捕获数据的c语言示例代码
NI-Motion如何控制运动控制器上轴速度,通过读取模拟数字转换器(ADC)的值来动态调整速度C语言示例代码
microPython的源码解析之 asmthumb.c
C#进行串口应用开发如何实现基于串口的终端工具与远程控制
量化交易系统中+如何进行自动化测试和部署?
智能农业设备软件工程师如何实现农业设备的电源监控和管理
人工智能开源库有哪些
python的Pyglet库如何使用
车载系统软件工程师如何实现车载系统的蓝牙和无线连接
如何使用pybind11,在Python中调用c++库
python的injectool库
microPython的源码解析之 pystack.c
python的生成艺术字体的库pythonwordart
C#进行串口应用开发如何实现串口通信的调试跟踪与日志记录
数据降维技术和算法
python的gmpy2库如何使用
python 如何将传统关系数据库的数据导入 Hadoop
microPython的源码解析之 formatfloat.c
智能农业设备软件工程师如何处理设备的传输延迟和数据一致性
智能农业设备软件工程师如何处理和分析作物生长数据
量化交易系统中+如何进行数据中心的管理和维护?
powerAutomate
车载系统软件工程师如何处理车载系统的系统日志和故障报告
车载系统软件工程师如何实现车载系统的安全驾驶提醒和警告
python的xmlrpc库如何使用
车载系统软件工程师如何实现车载系统的多媒体播放和控制
c#程序与USB HID设备进行通信
智能农业设备软件工程师如何处理设备的网络连接和通信
量子计算Shor算法
python如何操作excel
halcon介绍以及与opencv比较
量化交易系统中+如何进行用户认证和权限管理?
Python的pkg_resources库介绍
Python开源自动化工具,用于配置管理、应用部署、智能自动化ansible
量化交易系统中+如何实现数据的冗余和备份?
Python的opencv库使用SIFT 进行特征检测
Python如何从新浪财经爬去分价表数据
C#进行串口应用开发如何处理不同操作系统的串口兼容性问题
c#视觉应用开发中如何在C#中进行模板匹配?
github的检索功能
c#视觉应用开发中如何在C#中进行图像标签处理?
openai的 ada,Babbage,Curie,Davinci模型分别介绍一下
智能农业设备软件工程师如何集成和控制自动收割机
openAI的neuralink
能输出自身源代码的程序
车载系统软件工程师如何实现车载系统的交通信息集成和显示
如何用DNA计算
智能农业设备软件工程师如何实现农业设备的用户界面(HMI)
python编写一段会跳动的文字
量化交易系统中+如何处理跨平台和跨系统的集成?
车载系统软件工程师如何实现车载系统的AR导航和显示
c++加QT开发linux远程终端,类似putty
智能农业设备软件工程师如何实现农业设备的高级数据分析和可视化
Python 强大的模板引擎库 Skeleton BootStrap
车载系统软件工程师如何实现车载语音识别和控制
python可操作wps文档
详细介绍一下红黑树,如何快速搜索
一家初创医疗科技公司用Python设计了一个平台
windows的PC如何进行分布式AI计算
量子编程语言
RFID软件协议如何进行自定义
python如何模拟阻尼旋转,跟随鼠标指针转动
量化交易系统中+如何确保系统的安全性和防止黑客攻击?
车载系统软件工程师如何处理车载系统的存储管理和优化
python 开发EZRO内容管理系统的案例介绍
使用Python开发患者健康门户网站
车载系统软件工程师如何实现车载系统的驾驶员监控系统
chatGPT每次处理请求背后服务器需要进行多大的运算量
c#视觉应用开发中如何在C#中使用K-means算法进行图像聚类?
microPython的源码解析之 objstringio.c
python的Plotly库如何使用
QT C++的QDataStream的大坑
详细解读一下c++模版编程,并举例
Python支持Protocol Buffers高效的序列化数据格式库protobuf3-to-dict
量化交易系统如何处理多市场、多资产的交易需求?
microPython的源码解析之 mpz.c
python的torchversion库的介绍
如何应聘初级软件工程师,年薪10万到15万元之间
几种常用的开源协议

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐