19 12 25
Минисально переименовал классы (убрал лишнее _new)
This commit is contained in:
parent
3cafd29ee5
commit
0c49cae055
@ -6,8 +6,7 @@ import server.logic.ws_protocol.JSON.entyties.Auth.Net_CreateAuthSession_Request
|
|||||||
import server.logic.ws_protocol.JSON.entyties.Auth.Net_RefreshSession_Request;
|
import server.logic.ws_protocol.JSON.entyties.Auth.Net_RefreshSession_Request;
|
||||||
import server.logic.ws_protocol.JSON.entyties.Auth.Net_CloseActiveSession_Request;
|
import server.logic.ws_protocol.JSON.entyties.Auth.Net_CloseActiveSession_Request;
|
||||||
import server.logic.ws_protocol.JSON.entyties.Auth.Net_ListSessions_Request;
|
import server.logic.ws_protocol.JSON.entyties.Auth.Net_ListSessions_Request;
|
||||||
import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_new_Request;
|
import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_Request;
|
||||||
import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_new_Response;
|
|
||||||
import server.logic.ws_protocol.JSON.entyties.tempToTest.Net_AddUser_Request;
|
import server.logic.ws_protocol.JSON.entyties.tempToTest.Net_AddUser_Request;
|
||||||
import server.logic.ws_protocol.JSON.handlers.JsonMessageHandler;
|
import server.logic.ws_protocol.JSON.handlers.JsonMessageHandler;
|
||||||
import server.logic.ws_protocol.JSON.handlers.auth.Net_AuthChallenge_Handler;
|
import server.logic.ws_protocol.JSON.handlers.auth.Net_AuthChallenge_Handler;
|
||||||
@ -49,7 +48,7 @@ public final class JsonHandlerRegistry {
|
|||||||
"CreateAuthSession", Net_CreateAuthSession_Request.class,
|
"CreateAuthSession", Net_CreateAuthSession_Request.class,
|
||||||
"CloseActiveSession", Net_CloseActiveSession_Request.class,
|
"CloseActiveSession", Net_CloseActiveSession_Request.class,
|
||||||
"ListSessions", Net_ListSessions_Request.class,
|
"ListSessions", Net_ListSessions_Request.class,
|
||||||
"AddBlock", Net_AddBlock_new_Request.class
|
"AddBlock", Net_AddBlock_Request.class
|
||||||
);
|
);
|
||||||
|
|
||||||
private JsonHandlerRegistry() {
|
private JsonHandlerRegistry() {
|
||||||
|
|||||||
@ -42,11 +42,7 @@ public class Net_RefreshSession_Request extends Net_Request {
|
|||||||
this.sessionPwd = sessionPwd;
|
this.sessionPwd = sessionPwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getClientInfo() {
|
public String getClientInfo() { return clientInfo; }
|
||||||
return clientInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setClientInfo(String clientInfo) {
|
public void setClientInfo(String clientInfo) { this.clientInfo = clientInfo; }
|
||||||
this.clientInfo = clientInfo;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -2,7 +2,7 @@ package server.logic.ws_protocol.JSON.entyties.blockchain;
|
|||||||
|
|
||||||
import server.logic.ws_protocol.JSON.entyties.Net_Request;
|
import server.logic.ws_protocol.JSON.entyties.Net_Request;
|
||||||
|
|
||||||
public final class Net_AddBlock_new_Request extends Net_Request {
|
public final class Net_AddBlock_Request extends Net_Request {
|
||||||
|
|
||||||
private String login; // обязателен
|
private String login; // обязателен
|
||||||
private long blockchainId; // обязателен
|
private long blockchainId; // обязателен
|
||||||
@ -2,7 +2,7 @@ package server.logic.ws_protocol.JSON.entyties.blockchain;
|
|||||||
|
|
||||||
import server.logic.ws_protocol.JSON.entyties.Net_Response;
|
import server.logic.ws_protocol.JSON.entyties.Net_Response;
|
||||||
|
|
||||||
public final class Net_AddBlock_new_Response extends Net_Response {
|
public final class Net_AddBlock_Response extends Net_Response {
|
||||||
|
|
||||||
private String reasonCode; // null если ok
|
private String reasonCode; // null если ok
|
||||||
|
|
||||||
@ -1,5 +1,6 @@
|
|||||||
package server.logic.ws_protocol.JSON.handlers.blockchain;
|
package server.logic.ws_protocol.JSON.handlers.blockchain;
|
||||||
|
|
||||||
|
import server.logic.ws_protocol.WireCodes;
|
||||||
import shine.db.SqliteDbController;
|
import shine.db.SqliteDbController;
|
||||||
import shine.db.dao.BlockchainStateDAO;
|
import shine.db.dao.BlockchainStateDAO;
|
||||||
import shine.db.dao.BlocksDAO;
|
import shine.db.dao.BlocksDAO;
|
||||||
@ -10,6 +11,8 @@ import shine.db.entities.SolanaUserEntry;
|
|||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Types;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BlockchainStateService_new — атомарное добавление блока:
|
* BlockchainStateService_new — атомарное добавление блока:
|
||||||
@ -23,6 +26,25 @@ import java.sql.SQLException;
|
|||||||
*/
|
*/
|
||||||
public final class BlockchainStateService_new {
|
public final class BlockchainStateService_new {
|
||||||
|
|
||||||
|
/** Результат атомарного addBlock */
|
||||||
|
public static final class AddBlockResult {
|
||||||
|
public final int lineIndex; // 0..7 (пока ставим 0)
|
||||||
|
public final int httpStatus; // WireCodes.Status.*
|
||||||
|
public final String reasonCode; // null если ok
|
||||||
|
public final BlockchainStateEntry stateAfter; // состояние после (может быть null)
|
||||||
|
|
||||||
|
public AddBlockResult(int lineIndex, int httpStatus, String reasonCode, BlockchainStateEntry stateAfter) {
|
||||||
|
this.lineIndex = lineIndex;
|
||||||
|
this.httpStatus = httpStatus;
|
||||||
|
this.reasonCode = reasonCode;
|
||||||
|
this.stateAfter = stateAfter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOk() {
|
||||||
|
return httpStatus == WireCodes.Status.OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static volatile BlockchainStateService_new instance;
|
private static volatile BlockchainStateService_new instance;
|
||||||
|
|
||||||
private final SqliteDbController db = SqliteDbController.getInstance();
|
private final SqliteDbController db = SqliteDbController.getInstance();
|
||||||
@ -42,25 +64,32 @@ public final class BlockchainStateService_new {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Атомарно добавляет блок (в рамках одной транзакции).
|
* Атомарно добавляет блок (в рамках одной транзакции) и возвращает результат,
|
||||||
*
|
* чтобы хэндлер мог заполнить ответ клиенту.
|
||||||
* @param login логин (для поиска loginId)
|
|
||||||
* @param blockchainId id блокчейна
|
|
||||||
* @param globalNumber глобальный номер
|
|
||||||
* @param prevGlobalHash предыдущий глобальный хэш
|
|
||||||
* @param blockBytesB64 блок (в Base64) — если у тебя уже byte[], сделай перегрузку
|
|
||||||
*/
|
*/
|
||||||
public void addBlockAtomically(
|
public AddBlockResult addBlockAtomically(
|
||||||
String login,
|
String login,
|
||||||
long blockchainId,
|
long blockchainId,
|
||||||
int globalNumber,
|
int globalNumber,
|
||||||
String prevGlobalHash,
|
String prevGlobalHash,
|
||||||
String blockBytesB64
|
String blockBytesB64
|
||||||
) throws Exception {
|
) {
|
||||||
|
|
||||||
// ⚠️ Тут я не трогаю твою бизнес-логику парсинга blockBytesB64.
|
// Пока не парсим lineIndex из блока — ставим 0, чтобы протокол работал.
|
||||||
// Просто предполагаю, что у тебя есть метод декодирования.
|
// Позже сделаем реальный разбор (и это же место будет правильным для вычисления хэшей).
|
||||||
byte[] blockBytes = decodeBase64(blockBytesB64);
|
final int lineIndex = 0;
|
||||||
|
|
||||||
|
byte[] blockBytes;
|
||||||
|
try {
|
||||||
|
blockBytes = decodeBase64(blockBytesB64);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return new AddBlockResult(
|
||||||
|
lineIndex,
|
||||||
|
WireCodes.Status.BAD_REQUEST,
|
||||||
|
"bad_block_base64",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
try (Connection c = db.getConnection()) {
|
try (Connection c = db.getConnection()) {
|
||||||
boolean oldAutoCommit = c.getAutoCommit();
|
boolean oldAutoCommit = c.getAutoCommit();
|
||||||
@ -69,51 +98,72 @@ public final class BlockchainStateService_new {
|
|||||||
// 1) получаем loginId по login
|
// 1) получаем loginId по login
|
||||||
SolanaUserEntry u = solanaUsersDAO.getByLogin(c, login);
|
SolanaUserEntry u = solanaUsersDAO.getByLogin(c, login);
|
||||||
if (u == null) {
|
if (u == null) {
|
||||||
throw new IllegalStateException("Не найден пользователь в solana_users по login=" + login);
|
c.rollback();
|
||||||
|
return new AddBlockResult(
|
||||||
|
lineIndex,
|
||||||
|
WireCodes.Status.NOT_FOUND,
|
||||||
|
"user_not_found",
|
||||||
|
null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
long loginId = u.getLoginId();
|
long loginId = u.getLoginId();
|
||||||
|
|
||||||
// 2) вставляем блок в blocks
|
// 2) вставляем блок в blocks
|
||||||
insertBlockRow(c, loginId, blockchainId, globalNumber, prevGlobalHash, blockBytes);
|
insertBlockRow(c, loginId, blockchainId, globalNumber, prevGlobalHash, blockBytes, lineIndex);
|
||||||
|
|
||||||
// 3) обновляем агрегатное состояние (если у тебя там отдельная логика — подключи сюда)
|
// 3) обновляем агрегатное состояние blockchain_state
|
||||||
// Ниже — базовый пример, ты можешь заменить на свои расчёты lineHash/lineNumber и т.д.
|
|
||||||
BlockchainStateEntry st = stateDAO.getByBlockchainId(c, blockchainId);
|
BlockchainStateEntry st = stateDAO.getByBlockchainId(c, blockchainId);
|
||||||
if (st == null) {
|
if (st == null) {
|
||||||
throw new IllegalStateException("Не найден blockchain_state для blockchainId=" + blockchainId);
|
c.rollback();
|
||||||
|
return new AddBlockResult(
|
||||||
|
lineIndex,
|
||||||
|
WireCodes.Status.NOT_FOUND,
|
||||||
|
"blockchain_state_not_found",
|
||||||
|
null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MVP: обновляем “последний глобальный номер”.
|
||||||
|
// Хэш тут сейчас оставлен как заглушка — лучше поставить фактический хэш нового блока.
|
||||||
st.setLastGlobalNumber(globalNumber);
|
st.setLastGlobalNumber(globalNumber);
|
||||||
st.setLastGlobalHash(nn(prevGlobalHash)); // или новый hash, если ты его вычисляешь
|
st.setLastGlobalHash(nn(prevGlobalHash)); // TODO: заменить на hash нового блока
|
||||||
st.setUpdatedAtMs(System.currentTimeMillis());
|
st.setUpdatedAtMs(System.currentTimeMillis());
|
||||||
|
|
||||||
|
// (линии пока не трогаем — позже внесём логику lineNumber/lineHash)
|
||||||
stateDAO.upsert(c, st);
|
stateDAO.upsert(c, st);
|
||||||
|
|
||||||
c.commit();
|
c.commit();
|
||||||
|
return new AddBlockResult(lineIndex, WireCodes.Status.OK, null, st);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
c.rollback();
|
try { c.rollback(); } catch (SQLException ignore) {}
|
||||||
throw e;
|
return new AddBlockResult(
|
||||||
|
lineIndex,
|
||||||
|
WireCodes.Status.INTERNAL_ERROR,
|
||||||
|
"internal_error",
|
||||||
|
null
|
||||||
|
);
|
||||||
} finally {
|
} finally {
|
||||||
c.setAutoCommit(oldAutoCommit);
|
try { c.setAutoCommit(oldAutoCommit); } catch (SQLException ignore) {}
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
return new AddBlockResult(
|
||||||
|
lineIndex,
|
||||||
|
WireCodes.Status.INTERNAL_ERROR,
|
||||||
|
"db_error",
|
||||||
|
null
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Вставка/обновление строки блока в таблицу blocks.
|
|
||||||
*
|
|
||||||
* Раньше у тебя тут был SQL, который пытался использовать колонку user_login —
|
|
||||||
* из-за этого и падало "table blocks has no column named user_login".
|
|
||||||
*
|
|
||||||
* Теперь всё делаем через BlocksDAO, где имена колонок гарантированно совпадают со схемой.
|
|
||||||
*/
|
|
||||||
private void insertBlockRow(
|
private void insertBlockRow(
|
||||||
Connection c,
|
Connection c,
|
||||||
long loginId,
|
long loginId,
|
||||||
long blockchainId,
|
long blockchainId,
|
||||||
int globalNumber,
|
int globalNumber,
|
||||||
String prevGlobalHash,
|
String prevGlobalHash,
|
||||||
byte[] blockBytes
|
byte[] blockBytes,
|
||||||
|
int lineIndex
|
||||||
) throws SQLException {
|
) throws SQLException {
|
||||||
|
|
||||||
BlockEntry e = new BlockEntry();
|
BlockEntry e = new BlockEntry();
|
||||||
@ -123,9 +173,8 @@ public final class BlockchainStateService_new {
|
|||||||
e.setBlockGlobalNumber(globalNumber);
|
e.setBlockGlobalNumber(globalNumber);
|
||||||
e.setBlockGlobalPreHashe(nn(prevGlobalHash));
|
e.setBlockGlobalPreHashe(nn(prevGlobalHash));
|
||||||
|
|
||||||
// ⚠️ Эти поля (линии/типы/маршрутизация) заполни так, как у тебя реально устроен блок.
|
// Заглушки под линии — позже заменим на реальную логику из blockBytes.
|
||||||
// Я ставлю дефолты, чтобы код компилился и логика была ясна.
|
e.setBlockLineIndex(lineIndex);
|
||||||
e.setBlockLineIndex(0);
|
|
||||||
e.setBlockLineNumber(0);
|
e.setBlockLineNumber(0);
|
||||||
e.setBlockLinePreHashe("");
|
e.setBlockLinePreHashe("");
|
||||||
|
|
||||||
@ -138,7 +187,6 @@ public final class BlockchainStateService_new {
|
|||||||
e.setToBlockGlobalNumber(0);
|
e.setToBlockGlobalNumber(0);
|
||||||
e.setToBlockHashe("");
|
e.setToBlockHashe("");
|
||||||
|
|
||||||
// upsert — безопаснее, чем insert, если возможны повторы при ретраях
|
|
||||||
blocksDAO.upsert(c, e);
|
blocksDAO.upsert(c, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,6 +198,6 @@ public final class BlockchainStateService_new {
|
|||||||
|
|
||||||
private static byte[] decodeBase64(String s) {
|
private static byte[] decodeBase64(String s) {
|
||||||
if (s == null || s.isBlank()) return null;
|
if (s == null || s.isBlank()) return null;
|
||||||
return java.util.Base64.getDecoder().decode(s);
|
return Base64.getDecoder().decode(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3,8 +3,8 @@ package server.logic.ws_protocol.JSON.handlers.blockchain;
|
|||||||
import server.logic.ws_protocol.JSON.ConnectionContext;
|
import server.logic.ws_protocol.JSON.ConnectionContext;
|
||||||
import server.logic.ws_protocol.JSON.entyties.Net_Request;
|
import server.logic.ws_protocol.JSON.entyties.Net_Request;
|
||||||
import server.logic.ws_protocol.JSON.entyties.Net_Response;
|
import server.logic.ws_protocol.JSON.entyties.Net_Response;
|
||||||
import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_new_Request;
|
import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_Request;
|
||||||
import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_new_Response;
|
import server.logic.ws_protocol.JSON.entyties.blockchain.Net_AddBlock_Response;
|
||||||
import server.logic.ws_protocol.JSON.handlers.JsonMessageHandler;
|
import server.logic.ws_protocol.JSON.handlers.JsonMessageHandler;
|
||||||
import server.logic.ws_protocol.WireCodes;
|
import server.logic.ws_protocol.WireCodes;
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ public final class Net_AddBlock_new_Handler implements JsonMessageHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Net_Response handle(Net_Request baseReq, ConnectionContext ctx) throws Exception {
|
public Net_Response handle(Net_Request baseReq, ConnectionContext ctx) throws Exception {
|
||||||
Net_AddBlock_new_Request req = (Net_AddBlock_new_Request) baseReq;
|
Net_AddBlock_Request req = (Net_AddBlock_Request) baseReq;
|
||||||
|
|
||||||
var r = BlockchainStateService_new.getInstance().addBlockAtomically(
|
var r = BlockchainStateService_new.getInstance().addBlockAtomically(
|
||||||
req.getLogin(),
|
req.getLogin(),
|
||||||
@ -22,7 +22,7 @@ public final class Net_AddBlock_new_Handler implements JsonMessageHandler {
|
|||||||
req.getBlockBytesB64()
|
req.getBlockBytesB64()
|
||||||
);
|
);
|
||||||
|
|
||||||
Net_AddBlock_new_Response resp = new Net_AddBlock_new_Response();
|
Net_AddBlock_Response resp = new Net_AddBlock_Response();
|
||||||
resp.setOp(req.getOp());
|
resp.setOp(req.getOp());
|
||||||
resp.setRequestId(req.getRequestId());
|
resp.setRequestId(req.getRequestId());
|
||||||
resp.setLineIndex(r.lineIndex);
|
resp.setLineIndex(r.lineIndex);
|
||||||
|
|||||||
@ -28,6 +28,7 @@ public final class WireCodes {
|
|||||||
|
|
||||||
public static final int ALREADY_EXISTS = 409; // пришёл блок < N+1
|
public static final int ALREADY_EXISTS = 409; // пришёл блок < N+1
|
||||||
public static final int NON_SEQUENTIAL = 412; // пришёл блок > N+1
|
public static final int NON_SEQUENTIAL = 412; // пришёл блок > N+1
|
||||||
|
public static final int NOT_FOUND = 422; // Нет такого полбзователя - типо добавляем блок к которому нет пользователя - хотя на деле такой статус наверное никогда не вернётся, тк это раньше проверяется
|
||||||
|
|
||||||
|
|
||||||
private Status() {}
|
private Status() {}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user