diff --git a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt index 1cd9d29e..bf9abbd4 100644 --- a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt +++ b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt @@ -3180,9 +3180,9 @@ data class ParticipantStatusInfo( val currentBlock = currentBlockHex?.removePrefix("0x")?.toLongOrNull(16) ?: 0L // RPC 节点限制:每次最多查询 10000 个区块 - // 分批查询最近 100000 个区块 + // 只扫描最近 20000 个区块(约 2 批,20-30 秒) val maxBlocksPerRequest = 10000L - val totalBlocksToScan = 100000L + val totalBlocksToScan = 20000L val startBlock = if (currentBlock > totalBlocksToScan) { currentBlock - totalBlocksToScan } else { @@ -3190,7 +3190,7 @@ data class ParticipantStatusInfo( } android.util.Log.d("TssRepository", "[SYNC-ERC20] Current block: $currentBlock") - android.util.Log.d("TssRepository", "[SYNC-ERC20] Scanning blocks $startBlock to $currentBlock (total: ${currentBlock - startBlock})") + android.util.Log.d("TssRepository", "[SYNC-ERC20] Scanning blocks $startBlock to $currentBlock (${currentBlock - startBlock} blocks, ~${(currentBlock - startBlock) / maxBlocksPerRequest} batches)") // Transfer event signature: keccak256("Transfer(address,address,uint256)") val transferTopic = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" @@ -3212,60 +3212,69 @@ data class ParticipantStatusInfo( android.util.Log.d("TssRepository", "[SYNC-ERC20] Batch #$batchCount: blocks $fromBlock-$toBlock") - // 查询发送的交易 (from = address) - val sentRequest = """ - { - "jsonrpc": "2.0", - "method": "eth_getLogs", - "params": [{ - "address": "$contractAddress", - "topics": ["$transferTopic", "$paddedAddress", null], - "fromBlock": "$fromBlockHex", - "toBlock": "$toBlockHex" - }], - "id": 1 + // 并行查询 SENT 和 RECEIVED(提速 2倍) + val batchSynced = kotlinx.coroutines.coroutineScope { + val sentDeferred = async { + val sentRequest = """ + { + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [{ + "address": "$contractAddress", + "topics": ["$transferTopic", "$paddedAddress", null], + "fromBlock": "$fromBlockHex", + "toBlock": "$toBlockHex" + }], + "id": 1 + } + """.trimIndent() + + val sentResponse = client.newCall( + okhttp3.Request.Builder() + .url(rpcUrl) + .post(sentRequest.toRequestBody(jsonMediaType)) + .build() + ).execute() + + val sentBody = sentResponse.body?.string() + if (sentBody != null) { + parseAndSaveTransferLogs(sentBody, shareId, address, tokenType, "SENT") + } else 0 } - """.trimIndent() - val sentResponse = client.newCall( - okhttp3.Request.Builder() - .url(rpcUrl) - .post(sentRequest.toRequestBody(jsonMediaType)) - .build() - ).execute() + val receivedDeferred = async { + val receivedRequest = """ + { + "jsonrpc": "2.0", + "method": "eth_getLogs", + "params": [{ + "address": "$contractAddress", + "topics": ["$transferTopic", null, "$paddedAddress"], + "fromBlock": "$fromBlockHex", + "toBlock": "$toBlockHex" + }], + "id": 2 + } + """.trimIndent() - val sentBody = sentResponse.body?.string() - if (sentBody != null) { - totalSynced += parseAndSaveTransferLogs(sentBody, shareId, address, tokenType, "SENT") - } - - // 查询接收的交易 (to = address) - val receivedRequest = """ - { - "jsonrpc": "2.0", - "method": "eth_getLogs", - "params": [{ - "address": "$contractAddress", - "topics": ["$transferTopic", null, "$paddedAddress"], - "fromBlock": "$fromBlockHex", - "toBlock": "$toBlockHex" - }], - "id": 2 - } - """.trimIndent() - - val receivedResponse = client.newCall( - okhttp3.Request.Builder() - .url(rpcUrl) - .post(receivedRequest.toRequestBody(jsonMediaType)) - .build() - ).execute() - - val receivedBody = receivedResponse.body?.string() - if (receivedBody != null) { - totalSynced += parseAndSaveTransferLogs(receivedBody, shareId, address, tokenType, "RECEIVED") + val receivedResponse = client.newCall( + okhttp3.Request.Builder() + .url(rpcUrl) + .post(receivedRequest.toRequestBody(jsonMediaType)) + .build() + ).execute() + + val receivedBody = receivedResponse.body?.string() + if (receivedBody != null) { + parseAndSaveTransferLogs(receivedBody, shareId, address, tokenType, "RECEIVED") + } else 0 + } + + // 等待两个查询都完成 + sentDeferred.await() + receivedDeferred.await() } + totalSynced += batchSynced fromBlock = toBlock + 1 }