Обновить lazy-import Solana PDA под новый формат

This commit is contained in:
AidarKC 2026-06-04 14:33:42 +04:00
parent 59e4156bb9
commit a9510a6d36
3 changed files with 32 additions and 14 deletions

View File

@ -0,0 +1,15 @@
# Lazy-import Solana PDA: актуальный формат
- Краткое описание:
Серверный Java lazy-import пользователя из `shine_users` обновлён под актуальный формат `user_pda`. Убран RPC-фильтр по размеру PDA, добавлен разбор нового `ServerProfileBlock` (`block_type = 30`) без сохранения server-only полей в `solana_users`.
- Что проверять:
1. Взять логин пользователя, который существует в Solana PDA, но отсутствует в локальной таблице `solana_users`.
2. Выполнить вход этим логином через сервер.
3. Убедиться, что lazy-import подтянул пользователя из Solana.
4. Убедиться, что запись в `solana_users` создана с полями `login`, `blockchain_name`, `solana_key`, `blockchain_key`, `device_key`.
5. Убедиться, что отсутствие/наличие server-полей в PDA не ломает импорт.
- Ожидаемый результат:
1. Пользователь успешно находится и импортируется из Solana PDA независимо от фактического размера PDA.
2. Новый `ServerProfileBlock` не ломает парсер.
3. В БД не появляются лишние server-only поля.
- Статус: `pending`

View File

@ -25,7 +25,6 @@ public final class SolanaUserPdaImportService {
private static final Logger log = LoggerFactory.getLogger(SolanaUserPdaImportService.class); private static final Logger log = LoggerFactory.getLogger(SolanaUserPdaImportService.class);
private static final ObjectMapper MAPPER = new ObjectMapper(); private static final ObjectMapper MAPPER = new ObjectMapper();
private static final HttpClient HTTP = HttpClient.newHttpClient(); private static final HttpClient HTTP = HttpClient.newHttpClient();
private static final int USER_PDA_SPACE = 768;
private static final String MAGIC = "SHiNE"; private static final String MAGIC = "SHiNE";
private SolanaUserPdaImportService() {} private SolanaUserPdaImportService() {}
@ -72,14 +71,13 @@ public final class SolanaUserPdaImportService {
{ {
"encoding":"base64", "encoding":"base64",
"filters":[ "filters":[
{"dataSize":%d},
{"memcmp":{"offset":61,"bytes":"%s"}}, {"memcmp":{"offset":61,"bytes":"%s"}},
{"memcmp":{"offset":62,"bytes":"%s"}} {"memcmp":{"offset":62,"bytes":"%s"}}
] ]
} }
] ]
} }
""".formatted(SolanaProgramsConfig.SHINE_USERS_PROGRAM_ID, USER_PDA_SPACE, lenB58, loginB58); """.formatted(SolanaProgramsConfig.SHINE_USERS_PROGRAM_ID, lenB58, loginB58);
HttpRequest req = HttpRequest.newBuilder() HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create(SolanaProgramsConfig.SOLANA_RPC_URL)) .uri(URI.create(SolanaProgramsConfig.SOLANA_RPC_URL))
@ -171,8 +169,11 @@ public final class SolanaUserPdaImportService {
return null; return null;
} }
} }
} else if (blockType == 4) { } else if (blockType == 30) {
c += 1 + 32; int isServer = u8(raw, c++);
if (isServer == 1) {
c += 1; // address_format_type
c += 1; // address_format_version
int addrLen = u8(raw, c++); int addrLen = u8(raw, c++);
c += addrLen; c += addrLen;
int syncCount = u8(raw, c++); int syncCount = u8(raw, c++);
@ -180,6 +181,9 @@ public final class SolanaUserPdaImportService {
int n = u8(raw, c++); int n = u8(raw, c++);
c += n; c += n;
} }
} else if (isServer != 0) {
return null;
}
} else if (blockType == 40) { } else if (blockType == 40) {
int accessCount = u8(raw, c++); int accessCount = u8(raw, c++);
for (int j = 0; j < accessCount; j++) { for (int j = 0; j < accessCount; j++) {
@ -264,4 +268,3 @@ public final class SolanaUserPdaImportService {
long paidLimitBytes long paidLimitBytes
) {} ) {}
} }

View File

@ -1,2 +1,2 @@
client.version=1.2.123 client.version=1.2.124
server.version=1.2.115 server.version=1.2.116