高性能的 Broker 数据索引系统,使用 Substreams 替代传统的 Graph Node。基于 newBroker
的逻辑实现,提供更高效的数据处理和实时同步能力。
基于 BSC 网络上的 Broker 合约 (0xC74848F603f723A4878131952c9238908f096266
):
BrokerRegistered(indexed address)
- Broker注册事件Follow(indexed address,indexed address,uint256)
- 关注事件Unfollow(indexed address,indexed address,uint256)
- 取消关注事件account
: Broker 地址time
: 注册时间戳follower_count
: 当前粉丝数量total_amount
: 总托管金额user_address
: 用户地址broker
: Broker 地址amount
: 托管金额is_active
: 关注状态follow_time
: 关注时间unfollow_time
: 取消关注时间# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
rustup target add wasm32-unknown-unknown
# 安装 Substreams CLI
curl -sSL https://github.com/streamingfast/substreams/releases/download/v1.1.20/substreams_linux_x86_64.tar.gz | tar -xz -C /tmp
sudo mv /tmp/substreams /usr/local/bin/
# 安装 Node.js (用于 JavaScript 客户端)
nvm install 18
nvm use 18
# 构建 WASM 模块和打包
./build.sh
# 使用 Docker 启动 PostgreSQL
docker-compose up -d postgres
# 或手动部署到现有数据库
./deploy-db.sh
# 设置 Substreams API Token
export SUBSTREAMS_API_TOKEN="your_token_here"
# 或创建 .substreams.env 文件
echo "SUBSTREAMS_API_TOKEN=your_token_here" > .substreams.env
# 启动 JavaScript 流客户端
./start-stream.sh
# 或直接使用 substreams CLI
substreams run substreams.yaml map_events -e bsc.substreams.pinax.network:443 -s 47458803
substreams-broker/
├── README.md # 项目文档
├── Cargo.toml # Rust 依赖配置
├── build.rs # 构建脚本
├── substreams.yaml # Substreams 配置
├── schema.sql # PostgreSQL 数据库 schema
├── docker-compose.yml # Docker 服务配置
├── build.sh # 构建脚本
├── deploy-db.sh # 数据库部署脚本
├── start-stream.sh # 启动流客户端
├── proto/ # Protocol Buffers 定义
│ ├── events.proto # 事件消息定义
│ └── database.proto # 数据库更改定义
├── src/ # Rust 源代码
│ ├── lib.rs # 主要逻辑
│ ├── events.rs # 事件签名计算
│ └── constants.rs # 常量定义
└── abi/ # 合约 ABI
└── Broker.json # Broker 合约 ABI
47458803
(与 newBroker 相同)0xC74848F603f723A4878131952c9238908f096266
环境变量:
DB_HOST
: 数据库主机 (默认: localhost)DB_PORT
: 数据库端口 (默认: 5432)DB_NAME
: 数据库名称 (默认: broker_substreams)DB_USER
: 数据库用户 (默认: postgres)DB_PASSWORD
: 数据库密码 (默认: postgres)相比传统的 Graph Node 实现:
# 使用 substreams CLI 工具实时查看事件
substreams run substreams.yaml map_events -e bsc.substreams.pinax.network:443 -s 47458803 -t +100
-- 查看 broker 统计
SELECT * FROM broker_summary;
-- 查看活跃关注关系
SELECT * FROM active_follow_relations;
-- 查看处理进度
SELECT * FROM substreams_cursors;
启动 Docker 服务后,可以通过 Adminer 访问数据库:
特性 | newBroker (Graph Node) | substreams-broker |
---|---|---|
处理速度 | 较慢 | 10-100x 更快 |
资源占用 | 高 | 低 |
实时性 | 5-30s 延迟 | <1s 延迟 |
断点续传 | 有限支持 | 完整支持 |
横向扩展 | 困难 | 简单 |
开发复杂度 | 中等 | 较高 |
生态支持 | 丰富 | 发展中 |
proto/events.proto
中添加新的消息定义src/events.rs
中添加事件签名src/lib.rs
中添加解析和处理逻辑# 运行 Rust 测试
cargo test
# 测试特定区块范围
substreams run substreams.yaml map_events -s 47458803 -t +100
如果遇到问题,请检查:
SUBSTREAMS_API_TOKEN
正确设置bsc.substreams.pinax.network:443
更多技术支持,请参考:
本项目遵循与 newBroker 相同的许可证。
substreams gui substreams-broker@v0.1.4 map_events
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
BrokerRegistered
message
Follow
message
Unfollow
message
ChequeCreated
message
ChequeChecked
message
ChequeUnChecked
message
CreateWithdrawProposal
message
WithdrawProposalSuccess
message
NewStatus
message
TargetCreated
message
ContractorAdded
message
ContractorRemoved