Обновить lazy-import Solana PDA под новый формат
This commit is contained in:
parent
59e4156bb9
commit
a9510a6d36
@ -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`
|
||||
@ -25,7 +25,6 @@ public final class SolanaUserPdaImportService {
|
||||
private static final Logger log = LoggerFactory.getLogger(SolanaUserPdaImportService.class);
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
private static final HttpClient HTTP = HttpClient.newHttpClient();
|
||||
private static final int USER_PDA_SPACE = 768;
|
||||
private static final String MAGIC = "SHiNE";
|
||||
|
||||
private SolanaUserPdaImportService() {}
|
||||
@ -72,14 +71,13 @@ public final class SolanaUserPdaImportService {
|
||||
{
|
||||
"encoding":"base64",
|
||||
"filters":[
|
||||
{"dataSize":%d},
|
||||
{"memcmp":{"offset":61,"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()
|
||||
.uri(URI.create(SolanaProgramsConfig.SOLANA_RPC_URL))
|
||||
@ -171,8 +169,11 @@ public final class SolanaUserPdaImportService {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
} else if (blockType == 4) {
|
||||
c += 1 + 32;
|
||||
} else if (blockType == 30) {
|
||||
int isServer = u8(raw, c++);
|
||||
if (isServer == 1) {
|
||||
c += 1; // address_format_type
|
||||
c += 1; // address_format_version
|
||||
int addrLen = u8(raw, c++);
|
||||
c += addrLen;
|
||||
int syncCount = u8(raw, c++);
|
||||
@ -180,6 +181,9 @@ public final class SolanaUserPdaImportService {
|
||||
int n = u8(raw, c++);
|
||||
c += n;
|
||||
}
|
||||
} else if (isServer != 0) {
|
||||
return null;
|
||||
}
|
||||
} else if (blockType == 40) {
|
||||
int accessCount = u8(raw, c++);
|
||||
for (int j = 0; j < accessCount; j++) {
|
||||
@ -264,4 +268,3 @@ public final class SolanaUserPdaImportService {
|
||||
long paidLimitBytes
|
||||
) {}
|
||||
}
|
||||
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
client.version=1.2.123
|
||||
server.version=1.2.115
|
||||
client.version=1.2.124
|
||||
server.version=1.2.116
|
||||
|
||||
Loading…
Reference in New Issue
Block a user