这是一个使用 Substreams 技术构建的 NFT Marketplace 数据索引项目,用于替代传统的 The Graph subgraph,以提供更快的数据同步速度。
本项目索引 BSC 网络上的 NFT Marketplace 合约(地址:0x5842Eec744Dd4a50b32399611E6Fdc421820Db26
),追踪以下事件:
substreams-nftmarketplace/
├── Cargo.toml # Rust 依赖配置
├── substreams.yaml # Substreams 配置文件
├── build.rs # 构建脚本
├── schema.sql # 数据库模式
├── deploy.sh # 部署脚本
├── proto/ # Protobuf 定义
│ ├── events.proto # 事件数据结构
│ └── database.proto # 数据库变更结构
└── src/ # 源代码
├── lib.rs # 主要逻辑
├── events.rs # 事件处理
└── pb/ # 生成的 protobuf 代码
└── mod.rs
Orders 表
Trades 表
相比传统 subgraph,Substreams 提供:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-unknown-unknown
# Install from https://github.com/streamingfast/substreams/releases
cd packages/substreams-nftmarketplace
cargo build --target wasm32-unknown-unknown --release
substreams protogen ./substreams.yaml --exclude-paths="sf/substreams,google"
substreams pack ./substreams.yaml
substreams run -e bsc.streamingfast.io:443 ./substreams-nftmarketplace-v0.1.0.spkg map_events --start-block=61229970 --stop-block=+100
substreams auth
substreams deploy ./substreams.yaml
或者直接运行部署脚本:
./deploy.sh
项目配置为 BSC 主网:
bsc
61229970
bsc.streamingfast.io:443
0x5842Eec744Dd4a50b32399611E6Fdc421820Db26
src/events.rs
部署后,可以通过以下方式查询数据:
-- 查询活跃订单
SELECT * FROM orders WHERE status = 'Active';
-- 查询最近的交易
SELECT * FROM trades ORDER BY timestamp DESC LIMIT 10;
query {
orders(condition: {status: "Active"}) {
nodes {
orderId
seller
price
createdAt
}
}
}
Substreams 提供详细的执行日志,可以监控:
关键指标包括:
构建失败:
部署失败:
数据不一致:
# 查看详细日志
substreams run --debug
# 验证事件解析
substreams run map_events --start-block=61229970 --stop-block=61229975
# 检查数据库变更
substreams run db_out --start-block=61229970 --stop-block=61229975
功能 | Subgraph | Substreams |
---|---|---|
同步速度 | 慢 | 快 (3-5x) |
资源使用 | 高 | 低 |
并行处理 | 否 | 是 |
实时性 | 延迟大 | 延迟小 |
开发复杂度 | 低 | 中等 |
MIT License
substreams gui substreams-nftmarketplace@v0.1.4 map_events
substreams gui substreams-nftmarketplace@v0.1.4 db_out
message
FileDescriptorSet
message
FileDescriptorProto
message
DescriptorProto
message
ExtensionRangeOptions
message
FieldDescriptorProto
message
OneofDescriptorProto
message
EnumDescriptorProto
message
EnumValueDescriptorProto
message
ServiceDescriptorProto
message
MethodDescriptorProto
message
FileOptions
message
MessageOptions
message
FieldOptions
message
OneofOptions
message
EnumOptions
message
EnumValueOptions
message
ServiceOptions
message
MethodOptions
message
UninterpretedOption
message
SourceCodeInfo
message
GeneratedCodeInfo
message
Any
message
Timestamp
message
Modules
message
Binary
message
Module
message
Package
message
NetworkParams
message
PackageMetadata
message
ModuleMetadata
message
Clock
message
BlockRef
message
Request
message
Response
message
BlockUndoSignal
message
BlockScopedData
message
SessionInit
message
InitialSnapshotComplete
message
InitialSnapshotData
message
MapModuleOutput
message
StoreModuleOutput
message
OutputDebugInfo
message
ModulesProgress
message
ProcessedBytes
message
Error
message
Job
message
Stage
message
ModuleStats
message
ExternalCallMetric
message
StoreDelta
message
BlockRange
message
DeployRequest
message
Parameter
message
DeployResponse
message
UpdateRequest
message
UpdateResponse
message
InfoRequest
message
InfoResponse
message
SinkProgress
message
PackageInfo
message
ListRequest
message
ListResponse
message
DeploymentWithStatus
message
RemoveRequest
message
RemoveResponse
message
PauseRequest
message
PauseResponse
message
StopRequest
message
StopResponse
message
ResumeRequest
message
ResumeResponse
enum
DeploymentStatus
message
Events
message
OrderCreated
message
OrderCancelled
message
OrderFilled
message
BatchOrdersFilled
message
DatabaseChanges
message
DatabaseChange
enum
Operation