# Holder Scanner 使用说明 ## 问题诊断 你遇到的问题是:**Scanner(扫描器)没有运行**,所以数据库中没有数据。 当前状态: - ✅ API Server 正常运行 - ❌ Scanner 未启动(需要启动才能从区块链获取数据) - ❌ 部署区块号可能不正确(需要更新) ## 解决步骤 ### 第一步:获取正确的部署区块号 你数据库中的合约地址是: - YT-A: `0x7f9eEA491eE53045594ee4669327f0355aCd0e58` - YT-B: `0x20B94C5E5b7361552E0548161a58696aA6FeDBd4` - YT-C: `0x0EF308D70cf35460E26a3Eb42F3442Ff28cbE07C` **重要**:你需要找到这些合约的**实际部署区块号**。 #### 方法 1:通过 Arbiscan 查询 1. 访问 [Arbiscan Sepolia](https://sepolia.arbiscan.io/) 2. 搜索合约地址(例如:`0x7f9eEA491eE53045594ee4669327f0355aCd0e58`) 3. 查看 "Contract Creation" 或 "Contract Creator" 信息 4. 找到 "Block" 号码 #### 方法 2:使用 Web3 工具查询 ```bash # 使用 cast (foundry) 工具 cast block-number --rpc-url https://sepolia-rollup.arbitrum.io/rpc # 或者使用 etherscan API curl "https://api-sepolia.arbiscan.io/api?module=contract&action=getcontractcreation&contractaddresses=0x7f9eEA491eE53045594ee4669327f0355aCd0e58" ``` #### 方法 3:临时方案(不推荐) 如果暂时无法获取准确的部署区块号,可以使用一个较新的区块号(例如最新区块 - 10000),但这会导致: - ⚠️ 可能遗漏早期的持有者数据 - ⚠️ 首次扫描时间更短,但数据不完整 ### 第二步:更新 `.env` 配置 编辑 `.env` 文件,更新部署区块号: ```bash # Deployment Block Numbers YT_VAULTS_DEPLOY_BLOCK=123456789 # 替换为 YT-A/B/C 的实际部署区块 YTLP_DEPLOY_BLOCK=123456789 # 替换为 ytLP 的实际部署区块 LENDING_DEPLOY_BLOCK=123456789 # 替换为 Lending 的实际部署区块 ``` ### 第三步:启动 Scanner #### 方法 1:使用快速启动脚本(推荐) ```bash # Linux/Mac ./run-scanner.sh # Windows (Git Bash) bash run-scanner.sh ``` #### 方法 2:手动编译并运行 ```bash # 编译 go build -o bin/holder-scanner cmd/scanner/main.go # 运行 ./bin/holder-scanner ``` #### 方法 3:使用 start-holders.sh(交互式) ```bash ./start-holders.sh # 选择: 2. Scanner only ``` ### 第四步:验证数据 启动 Scanner 后,你应该看到类似的日志: ``` === Holder Scanner Service === ✓ Configuration loaded ✓ Database tables checked 🔗 Chain ID: 421614 📚 从数据库加载合约地址配置... ✅ [Scanner] 加载了 3 个 YT 资产 ✓ YT-A: 0x7f9eEA491eE53045594ee4669327f0355aCd0e58 ✓ YT-B: 0x20B94C5E5b7361552E0548161a58696aA6FeDBd4 ✓ YT-C: 0x0EF308D70cf35460E26a3Eb42F3442Ff28cbE07C ... 📊 开始首次扫描... 1. Scanning YT Vaults... 正在查询 YT-A (0x7f9eEA491eE53045594ee4669327f0355aCd0e58)... 发现 X 个新地址 余额>0: X 个持有者 ✅ ``` 等待首次扫描完成后,再次访问 API: ```bash curl http://localhost:8080/api/holders/YT-A ``` 应该能看到持有者数据。 ## 常见问题 ### Q1: Scanner 报错 "failed to query logs" **原因**:部署区块号设置太早,或 RPC 节点限制 **解决**: 1. 检查部署区块号是否正确 2. 尝试使用更小的 `BatchSize`(在代码中默认 9999) 3. 更换 RPC 节点 ### Q2: 扫描速度很慢 **原因**:区块范围太大 **解决**: 1. 确保使用准确的部署区块号(不要从太早的区块开始) 2. 检查网络连接 3. 考虑使用付费的 RPC 节点(更高的速率限制) ### Q3: 余额都是 0 **原因**:合约地址不正确,或合约不是 ERC20 **解决**: 1. 验证合约地址是否正确 2. 在区块浏览器上检查合约是否是 ERC20 代币 3. 确认合约在对应的链上(Arbitrum Sepolia) ## 配置参数说明 | 环境变量 | 说明 | 默认值 | |---------|------|--------| | `CHAIN_ID` | 链 ID(421614=Arbitrum Sepolia, 97=BSC Testnet) | 421614 | | `YT_VAULTS_DEPLOY_BLOCK` | YT 代币合约部署区块号 | 227339300 | | `YTLP_DEPLOY_BLOCK` | ytLP 合约部署区块号 | 227230270 | | `LENDING_DEPLOY_BLOCK` | Lending 合约部署区块号 | 227746053 | ## 技术支持 如果遇到问题,请提供: 1. Scanner 完整日志 2. 合约地址 3. 部署区块号 4. 错误信息